Added PhotonPUN support
This commit is contained in:
parent
3c853c3ba1
commit
0d6446ae18
@ -76,7 +76,7 @@ namespace Passer.Humanoid {
|
||||
Debug.Log(questManifestPath);
|
||||
File.Copy(questManifestPath, manifestPath);
|
||||
}
|
||||
catch (System.Exception _) {
|
||||
catch (System.Exception ) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
8
Editor/HumanoidControl/Networking/PhotonPun.meta
Normal file
8
Editor/HumanoidControl/Networking/PhotonPun.meta
Normal file
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 875a66c1e6398184192242a8674906b3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,143 @@
|
||||
using UnityEngine;
|
||||
#if hPHOTON2
|
||||
using Photon.Pun;
|
||||
#if hPUNVOICE2 && !UNITY_WEBGL
|
||||
using Photon.Voice.PUN;
|
||||
using Photon.Voice.Unity;
|
||||
#endif
|
||||
#endif
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace Passer.Humanoid {
|
||||
|
||||
[InitializeOnLoad]
|
||||
public class OnLoadHumanoidPlayerPun {
|
||||
static OnLoadHumanoidPlayerPun() {
|
||||
CheckHumanoidPlayer();
|
||||
}
|
||||
|
||||
protected static void CheckHumanoidPlayerVoice() {
|
||||
#if hPUNVOICE2
|
||||
string prefabPath = OnLoadHumanoidPlayer.GetHumanoidPlayerPrefabPath();
|
||||
prefabPath = prefabPath.Substring(0, prefabPath.Length - 21) + "HumanoidPlayerVoice.prefab";
|
||||
GameObject playerVoicePrefab = OnLoadHumanoidPlayer.GetHumanoidPlayerPrefab(prefabPath);
|
||||
if (playerVoicePrefab == null)
|
||||
return;
|
||||
|
||||
bool hasChanged = false;
|
||||
#if UNITY_WEBGL
|
||||
PhotonView photonView = playerVoicePrefab.GetComponent<PhotonView>();
|
||||
if (photonView == null) {
|
||||
photonView = playerVoicePrefab.AddComponent<PhotonView>();
|
||||
hasChanged = true;
|
||||
}
|
||||
#else
|
||||
PhotonVoiceView photonVoiceView = playerVoicePrefab.GetComponent<PhotonVoiceView>();
|
||||
if (photonVoiceView == null) {
|
||||
photonVoiceView = playerVoicePrefab.AddComponent<PhotonVoiceView>();
|
||||
hasChanged = true;
|
||||
}
|
||||
if (photonVoiceView.UsePrimaryRecorder == false) {
|
||||
photonVoiceView.UsePrimaryRecorder = true;
|
||||
hasChanged = true;
|
||||
}
|
||||
PhotonTransformView photonTransformView = playerVoicePrefab.GetComponent<PhotonTransformView>();
|
||||
if (photonTransformView == null) {
|
||||
photonTransformView = playerVoicePrefab.AddComponent<PhotonTransformView>();
|
||||
hasChanged = true;
|
||||
}
|
||||
PhotonView photonView = playerVoicePrefab.GetComponent<PhotonView>();
|
||||
if (photonView != null) {
|
||||
// should always be there because of the photonVoiceView
|
||||
if (photonView.ObservedComponents == null) {
|
||||
photonView.ObservedComponents = new System.Collections.Generic.List<Component>();
|
||||
photonView.ObservedComponents.Add(photonTransformView);
|
||||
photonView.Synchronization = ViewSynchronization.UnreliableOnChange;
|
||||
hasChanged = true;
|
||||
}
|
||||
}
|
||||
//Speaker speaker = playerVoicePrefab.GetComponent<Speaker>();
|
||||
//if (speaker == null) {
|
||||
// speaker = playerVoicePrefab.AddComponent<Speaker>();
|
||||
// photonVoiceView.SpeakerInUse = speaker;
|
||||
// hasChanged = true;
|
||||
|
||||
// AudioSource audioSource = playerVoicePrefab.GetComponent<AudioSource>();
|
||||
// if (audioSource != null) {
|
||||
// Debug.Log("adjust rolloff");
|
||||
// // default logaritmic only work when people are closer than 0.5m...
|
||||
// audioSource.maxDistance = 5;
|
||||
// }
|
||||
//}
|
||||
#endif
|
||||
if (hasChanged)
|
||||
OnLoadHumanoidPlayer.UpdateHumanoidPrefab(playerVoicePrefab, prefabPath);
|
||||
#if !UNITY_WEBGL
|
||||
CheckVoiceNetwork();
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
|
||||
#if hPUNVOICE2 && !UNITY_WEBGL
|
||||
protected static void CheckVoiceNetwork() {
|
||||
NetworkingStarter networkingStarter = Object.FindObjectOfType<NetworkingStarter>();
|
||||
if (networkingStarter == null)
|
||||
return;
|
||||
|
||||
PhotonVoiceNetwork voiceNetwork = Object.FindObjectOfType<PhotonVoiceNetwork>();
|
||||
if (voiceNetwork != null)
|
||||
return;
|
||||
|
||||
GameObject voiceNetworkObject = new GameObject("Voice Network");
|
||||
voiceNetwork = voiceNetworkObject.AddComponent<PhotonVoiceNetwork>();
|
||||
|
||||
Recorder voiceRecorder = voiceNetworkObject.AddComponent<Recorder>();
|
||||
voiceRecorder.ReactOnSystemChanges = true;
|
||||
voiceRecorder.TransmitEnabled = true;
|
||||
voiceRecorder.SamplingRate = POpusCodec.Enums.SamplingRate.Sampling48000;
|
||||
|
||||
voiceNetwork.PrimaryRecorder = voiceRecorder;
|
||||
}
|
||||
#endif
|
||||
|
||||
public static void CheckHumanoidPlayer() {
|
||||
#if hPHOTON1 || hPHOTON2
|
||||
string prefabPath = OnLoadHumanoidPlayer.GetHumanoidPlayerPrefabPath();
|
||||
GameObject playerPrefab = OnLoadHumanoidPlayer.GetHumanoidPlayerPrefab(prefabPath);
|
||||
|
||||
bool hasChanged = false;
|
||||
#if hNW_PHOTON
|
||||
if (playerPrefab != null) {
|
||||
PhotonView photonView = playerPrefab.GetComponent<PhotonView>();
|
||||
if (photonView == null) {
|
||||
photonView = playerPrefab.AddComponent<PhotonView>();
|
||||
photonView.ObservedComponents = new System.Collections.Generic.List<Component>();
|
||||
#if hPHOTON2
|
||||
photonView.Synchronization = ViewSynchronization.UnreliableOnChange;
|
||||
#else
|
||||
photonView.synchronization = ViewSynchronization.UnreliableOnChange;
|
||||
#endif
|
||||
|
||||
HumanoidPlayer humanoidPun = playerPrefab.GetComponent<HumanoidPlayer>();
|
||||
if (humanoidPun != null)
|
||||
photonView.ObservedComponents.Add(humanoidPun);
|
||||
hasChanged = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (playerPrefab != null) {
|
||||
PhotonView photonView = playerPrefab.GetComponent<PhotonView>();
|
||||
if (photonView != null)
|
||||
Object.DestroyImmediate(photonView, true);
|
||||
}
|
||||
#endif
|
||||
if (hasChanged)
|
||||
OnLoadHumanoidPlayer.UpdateHumanoidPrefab(playerPrefab, prefabPath);
|
||||
#endif
|
||||
CheckHumanoidPlayerVoice();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 185ec4e1799d1ac4d867b69454f1cd0f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
108
Editor/HumanoidControl/Networking/PhotonPun/PunStarter_Editor.cs
Normal file
108
Editor/HumanoidControl/Networking/PhotonPun/PunStarter_Editor.cs
Normal file
@ -0,0 +1,108 @@
|
||||
/*
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using UnityEngine.Networking;
|
||||
#if hNW_PHOTON
|
||||
#if hPHOTON2
|
||||
using Photon.Pun;
|
||||
#endif
|
||||
|
||||
namespace Passer {
|
||||
|
||||
[CustomEditor(typeof(PhotonStarter))]
|
||||
public class PunStarter_Editor : Editor {
|
||||
|
||||
public override void OnInspectorGUI() {
|
||||
base.OnInspectorGUI();
|
||||
|
||||
HumanoidControl[] humanoids = FindObjectsOfType<HumanoidControl>();
|
||||
if (humanoids.Length != 1)
|
||||
// We only support sitatuation with one humanoid in the scene
|
||||
return;
|
||||
|
||||
//HumanoidControl humanoid = humanoids[0];
|
||||
|
||||
if (Application.isPlaying)
|
||||
return;
|
||||
|
||||
//GameObject humanoidPrefab = CheckHumanoidPrefab(humanoid);
|
||||
//NetworkingComponentsInspectorPun(humanoid, humanoidPrefab);
|
||||
}
|
||||
|
||||
//private GameObject CheckHumanoidPrefab(HumanoidControl humanoid) {
|
||||
// GameObject humanoidPrefab = Resources.Load<GameObject>(humanoid.gameObject.name + "_generated");
|
||||
// if (humanoidPrefab == null) {
|
||||
// humanoidPrefab = PrefabUtility.CreatePrefab("Assets/Humanoid/Prefabs/Networking/Resources/" + humanoid.gameObject.name + "_generated.prefab", humanoid.gameObject);
|
||||
// humanoidPrefab.gameObject.SetActive(true);
|
||||
// }
|
||||
// return humanoidPrefab;
|
||||
//}
|
||||
|
||||
//private void UpdateHumanoidPrefab(HumanoidControl humanoid) {
|
||||
// if (humanoid != null) {
|
||||
// GameObject humanoidPrefab = Resources.Load<GameObject>(humanoid.gameObject.name + "_generated");
|
||||
// if (humanoidPrefab != null && humanoid.gameObject != humanoidPrefab)
|
||||
// PrefabUtility.ReplacePrefab(humanoid.gameObject, humanoidPrefab, ReplacePrefabOptions.ConnectToPrefab);
|
||||
// }
|
||||
//}
|
||||
|
||||
// private void NetworkingComponentsInspectorPun(HumanoidControl humanoid, GameObject humanoidPrefab) {
|
||||
//#if hPHOTON1 || hPHOTON2
|
||||
//#if hNW_PHOTON
|
||||
// CheckPunStarter(humanoid, humanoidPrefab);
|
||||
// PhotonView photonView = humanoid.GetComponent<PhotonView>();
|
||||
// if (photonView == null)
|
||||
// photonView = humanoid.gameObject.AddComponent<PhotonView>();
|
||||
// photonView.ObservedComponents = new System.Collections.Generic.List<Component>();
|
||||
// photonView.ObservedComponents.Add(humanoid);
|
||||
//#else
|
||||
// cleanupPhotonView = humanoid.GetComponent<PhotonView>();
|
||||
//#endif
|
||||
//#endif
|
||||
// }
|
||||
|
||||
// private void CheckPunStarter(HumanoidControl humanoid, GameObject humanoidPrefab) {
|
||||
// if (Application.isPlaying)
|
||||
// return;
|
||||
|
||||
//#if hNW_PHOTON
|
||||
// PhotonStarter photonStarter = FindObjectOfType<PhotonStarter>();
|
||||
// if (photonStarter != null && humanoidPrefab != null && photonStarter.playerPrefab != humanoidPrefab) {
|
||||
// Undo.RecordObject(photonStarter, "Updated Player Prefab");
|
||||
// photonStarter.playerPrefab = humanoidPrefab;
|
||||
// }
|
||||
//#endif
|
||||
// }
|
||||
public void OnDisable() {
|
||||
Cleanup();
|
||||
}
|
||||
|
||||
#if hNW_UNET
|
||||
private NetworkIdentity cleanupNetworkIdentity;
|
||||
#endif
|
||||
#if hPHOTON1 || hPHOTON2
|
||||
private PhotonView cleanupPhotonView;
|
||||
#endif
|
||||
private GameObject cleanupPunStarter;
|
||||
private void Cleanup() {
|
||||
#if hNW_UNET
|
||||
if (cleanupNetworkIdentity) {
|
||||
DestroyImmediate(cleanupNetworkIdentity, true);
|
||||
cleanupNetworkIdentity = null;
|
||||
}
|
||||
#endif
|
||||
#if hPHOTON1 || hPHOTON2
|
||||
if (cleanupPhotonView) {
|
||||
DestroyImmediate(cleanupPhotonView, true);
|
||||
cleanupPhotonView = null;
|
||||
}
|
||||
#endif
|
||||
if (cleanupPunStarter) {
|
||||
DestroyImmediate(cleanupPunStarter, true);
|
||||
cleanupPunStarter = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
*/
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e86563dd015c559479420645216c4a70
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,669 @@
|
||||
using UnityEngine;
|
||||
#if hNW_PHOTON
|
||||
using System.Collections.Generic;
|
||||
#endif
|
||||
#if hPHOTON2
|
||||
using Photon.Realtime;
|
||||
using Photon.Pun;
|
||||
#endif
|
||||
|
||||
namespace Passer.Humanoid {
|
||||
using Pawn;
|
||||
|
||||
#if hNW_PHOTON
|
||||
[RequireComponent(typeof(PhotonView))]
|
||||
#if hPHOTON2
|
||||
public partial class HumanoidPlayer : MonoBehaviourPunCallbacks, IHumanoidNetworking, IPunInstantiateMagicCallback, IPunObservable {
|
||||
#else
|
||||
public partial class HumanoidPlayer : Photon.MonoBehaviour, IHumanoidNetworking {
|
||||
#endif
|
||||
|
||||
public ulong nwId {
|
||||
#if hPHOTON2
|
||||
get { return (ulong)photonView.ViewID; }
|
||||
#else
|
||||
get { return (ulong)photonView.viewID; }
|
||||
#endif
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
protected float _sendRate = 25;
|
||||
public float sendRate {
|
||||
get { return _sendRate; }
|
||||
}
|
||||
|
||||
//[SerializeField]
|
||||
//protected HumanoidNetworking.DebugLevel _debug = HumanoidNetworking.DebugLevel.Error;
|
||||
//public HumanoidNetworking.DebugLevel debug {
|
||||
// get { return _debug; }
|
||||
//}
|
||||
|
||||
[SerializeField]
|
||||
protected HumanoidNetworking.Smoothing _smoothing = HumanoidNetworking.Smoothing.None;
|
||||
public HumanoidNetworking.Smoothing smoothing {
|
||||
get { return _smoothing; }
|
||||
}
|
||||
|
||||
[SerializeField]
|
||||
protected bool _createLocalRemotes = false;
|
||||
public bool createLocalRemotes {
|
||||
get { return _createLocalRemotes; }
|
||||
set { _createLocalRemotes = value; }
|
||||
}
|
||||
|
||||
public bool isLocal { get; set; }
|
||||
|
||||
public List<HumanoidControl> humanoids { get; set; }
|
||||
|
||||
public ulong GetObjectIdentity(GameObject obj) {
|
||||
PhotonView photonView = obj.GetComponent<PhotonView>();
|
||||
if (photonView == null)
|
||||
return 0;
|
||||
|
||||
#if hPHOTON2
|
||||
return (ulong)photonView.ViewID;
|
||||
#else
|
||||
return (ulong)photonView.viewID;
|
||||
#endif
|
||||
}
|
||||
|
||||
public GameObject GetGameObject(ulong objIdentity) {
|
||||
PhotonView objView = PhotonView.Find((int)objIdentity);
|
||||
if (objView == null)
|
||||
return this.gameObject;
|
||||
|
||||
return objView.gameObject;
|
||||
}
|
||||
|
||||
#region Init
|
||||
#if hPHOTON2
|
||||
public override void OnEnable() {
|
||||
base.OnEnable();
|
||||
PhotonNetwork.AddCallbackTarget(this);
|
||||
}
|
||||
|
||||
public override void OnDisable() {
|
||||
base.OnDisable();
|
||||
PhotonNetwork.RemoveCallbackTarget(this);
|
||||
}
|
||||
#endif
|
||||
public void Awake() {
|
||||
mInstance = this;
|
||||
|
||||
GameObject.DontDestroyOnLoad(this.gameObject);
|
||||
humanoids = HumanoidNetworking.FindLocalHumanoids();
|
||||
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Found " + humanoids.Count + " Humanoids");
|
||||
|
||||
for (int i = 0; i < humanoids.Count; i++) {
|
||||
HumanoidControl humanoid = humanoids[i];
|
||||
if (humanoid.isRemote || createLocalRemotes == false)
|
||||
continue;
|
||||
|
||||
humanoid.humanoidNetworking = this;
|
||||
((IHumanoidNetworking)this).InstantiateHumanoid(humanoid);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Start
|
||||
public void OnPhotonInstantiate(PhotonMessageInfo info) {
|
||||
#if hPHOTON2
|
||||
if (photonView.IsMine) {
|
||||
#else
|
||||
if (photonView.isMine) {
|
||||
#endif
|
||||
isLocal = true;
|
||||
name = "HumanoidPun(Local)";
|
||||
|
||||
humanoids = HumanoidNetworking.FindLocalHumanoids();
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Found " + humanoids.Count + " Humanoids");
|
||||
|
||||
for (int i = 0; i < humanoids.Count; i++) {
|
||||
HumanoidControl humanoid = humanoids[i];
|
||||
if (humanoid.isRemote)
|
||||
continue;
|
||||
#if hPHOTON2
|
||||
humanoid.nwId = (ulong)photonView.ViewID;
|
||||
#else
|
||||
humanoid.nwId = nwId; // photonView.viewID;
|
||||
#endif
|
||||
humanoid.humanoidNetworking = this;
|
||||
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Send Start Humanoid " + humanoid.humanoidId);
|
||||
|
||||
((IHumanoidNetworking)this).InstantiateHumanoid(humanoid);
|
||||
|
||||
#if hPUNVOICE2 && !UNITY_WEBGL
|
||||
InstantiatePlayerVoice(humanoid);
|
||||
#endif
|
||||
HumanoidNetworking.Connected(humanoid);
|
||||
}
|
||||
|
||||
NetworkingSpawner spawner = FindObjectOfType<NetworkingSpawner>();
|
||||
if (spawner != null)
|
||||
spawner.OnNetworkingStarted();
|
||||
|
||||
}
|
||||
else {
|
||||
humanoids = HumanoidNetworking.FindLocalHumanoids();
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Found " + humanoids.Count + " Humanoids");
|
||||
}
|
||||
}
|
||||
|
||||
#if hPHOTON2
|
||||
public override void OnPlayerEnteredRoom(Player newPlayer) {
|
||||
#else
|
||||
public void OnPhotonPlayerConnected(PhotonPlayer player) {
|
||||
#endif
|
||||
List<HumanoidControl> humanoids = HumanoidNetworking.FindLocalHumanoids();
|
||||
if (humanoids.Count <= 0)
|
||||
return;
|
||||
|
||||
foreach (HumanoidControl humanoid in humanoids) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
Debug.Log(humanoid.nwId + ": (Re)Send Instantiate Humanoid " + humanoid.humanoidId);
|
||||
|
||||
// Notify new player about my humanoid
|
||||
((IHumanoidNetworking)this).InstantiateHumanoid(humanoid);
|
||||
|
||||
if (humanoid.leftHandTarget.grabbedObject != null)
|
||||
humanoid.humanoidNetworking.Grab(humanoid.leftHandTarget, humanoid.leftHandTarget.grabbedObject, false);
|
||||
if (humanoid.rightHandTarget.grabbedObject != null)
|
||||
humanoid.humanoidNetworking.Grab(humanoid.rightHandTarget, humanoid.rightHandTarget.grabbedObject, false);
|
||||
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update
|
||||
PhotonStream stream;
|
||||
|
||||
float lastSend;
|
||||
|
||||
// The number of received messages processed in this frame
|
||||
private int processedThisFrame = 0;
|
||||
private enum MessageType {
|
||||
Pose,
|
||||
Grab,
|
||||
LetGo
|
||||
}
|
||||
private struct QueuedMessage {
|
||||
public MessageType messageType;
|
||||
public byte[] data;
|
||||
}
|
||||
private Queue<QueuedMessage> messageQueue = new Queue<QueuedMessage>();
|
||||
|
||||
protected virtual void LateUpdate() {
|
||||
processedThisFrame = 0;
|
||||
if (messageQueue.Count > 0) {
|
||||
ProcessMessageFromQueue();
|
||||
Debug.Log("----Processed messages = " + messageQueue.Count);
|
||||
}
|
||||
|
||||
if (!createLocalRemotes)
|
||||
return;
|
||||
|
||||
if (Time.time > lastSend + 1 / sendRate) {
|
||||
if (humanoids != null) {
|
||||
foreach (HumanoidControl humanoid in humanoids) {
|
||||
if (!humanoid.isRemote) {
|
||||
UpdateHumanoidPose(humanoid);
|
||||
if (syncTracking)
|
||||
SyncTrackingSpace(humanoid);
|
||||
}
|
||||
}
|
||||
}
|
||||
lastSend = Time.time;
|
||||
}
|
||||
}
|
||||
|
||||
private float lastPoseTime;
|
||||
public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info) {
|
||||
this.stream = stream;
|
||||
#if hPHOTON2
|
||||
if (stream.IsWriting) {
|
||||
#else
|
||||
if (stream.isWriting) {
|
||||
#endif
|
||||
foreach (HumanoidControl humanoid in humanoids) {
|
||||
if (!humanoid.isRemote) {
|
||||
UpdateHumanoidPose(humanoid);
|
||||
if (syncTracking)
|
||||
SyncTrackingSpace(humanoid);
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
ReceiveAvatarPose(stream);
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessMessageFromQueue() {
|
||||
QueuedMessage msg = messageQueue.Dequeue();
|
||||
switch (msg.messageType) {
|
||||
case MessageType.Pose:
|
||||
this.ReceiveHumanoidPose(msg.data);
|
||||
break;
|
||||
case MessageType.Grab:
|
||||
Debug.Log("Processing Queued Grab " + Time.time);
|
||||
this.ReceiveGrab(msg.data);
|
||||
break;
|
||||
case MessageType.LetGo:
|
||||
Debug.Log("Processsing Queueud Let Go " + Time.time);
|
||||
this.ReceiveLetGo(msg.data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Stop
|
||||
private void OnDestroy() {
|
||||
if (humanoids == null)
|
||||
return;
|
||||
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Destroy Remote Humanoids");
|
||||
|
||||
foreach (HumanoidControl humanoid in humanoids) {
|
||||
if (humanoid == null)
|
||||
continue;
|
||||
|
||||
if (humanoid.isRemote) {
|
||||
if (humanoid.gameObject != null)
|
||||
Destroy(humanoid.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Instantiate Humanoid
|
||||
|
||||
void IHumanoidNetworking.InstantiateHumanoid(HumanoidControl humanoid) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Send Instantiate Humanoid " + humanoid.humanoidId);
|
||||
|
||||
HumanoidNetworking.InstantiateHumanoid instantiateHumanoid = new HumanoidNetworking.InstantiateHumanoid(humanoid);
|
||||
if (createLocalRemotes) {
|
||||
this.Receive(instantiateHumanoid);
|
||||
}
|
||||
|
||||
byte[] data = instantiateHumanoid.Serialize();
|
||||
#if hPHOTON2
|
||||
photonView.RPC("RpcInstantiateHumanoid", RpcTarget.Others, data);
|
||||
#else
|
||||
photonView.RPC("RpcInstantiateHumanoid", PhotonTargets.Others, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
protected virtual void RpcInstantiateHumanoid(byte[] data) {
|
||||
this.ReceiveInstantiate(data);
|
||||
}
|
||||
|
||||
#if hPUNVOICE2 && !UNITY_WEBGL
|
||||
protected virtual void InstantiatePlayerVoice(HumanoidControl humanoid) {
|
||||
GameObject playerVoiceGameObject = PhotonNetwork.Instantiate("HumanoidPlayerVoice", humanoid.headTarget.transform.position, humanoid.headTarget.transform.rotation);
|
||||
HumanoidPlayerPunVoice playerVoice = playerVoiceGameObject.GetComponent<HumanoidPlayerPunVoice>();
|
||||
if (playerVoice != null)
|
||||
playerVoice.humanoid = humanoid;
|
||||
Debug.Log("created voice for " + humanoid);
|
||||
}
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
#region Destroy Humanoid
|
||||
|
||||
void IHumanoidNetworking.DestroyHumanoid(HumanoidControl humanoid) {
|
||||
if (humanoid == null)
|
||||
return;
|
||||
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Destroy Humanoid " + humanoid.humanoidId);
|
||||
|
||||
HumanoidNetworking.DestroyHumanoid destroyHumanoid = new HumanoidNetworking.DestroyHumanoid(humanoid);
|
||||
if (createLocalRemotes)
|
||||
this.Receive(destroyHumanoid);
|
||||
|
||||
byte[] data = destroyHumanoid.Serialize();
|
||||
#if hPHOTON2
|
||||
if (PhotonNetwork.IsConnected)
|
||||
photonView.RPC("RpcDestroyHumanoid", RpcTarget.Others, data);
|
||||
#else
|
||||
if (PhotonNetwork.connected)
|
||||
photonView.RPC("RpcDestroyHumanoid", PhotonTargets.Others, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
public void RpcDestroyHumanoid(byte[] data) {
|
||||
this.ReceiveDestroy(data);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Pose
|
||||
|
||||
public HumanoidNetworking.HumanoidPose lastHumanoidPose { get; set; }
|
||||
|
||||
public virtual void UpdateHumanoidPose(HumanoidControl humanoid) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Debug)
|
||||
DebugLog("Send Pose Humanoid " + humanoid.humanoidId + " nwId: " + humanoid.nwId);
|
||||
|
||||
HumanoidNetworking.HumanoidPose humanoidPose = new HumanoidNetworking.HumanoidPose(humanoid, Time.time);
|
||||
if (createLocalRemotes)
|
||||
this.Receive(humanoidPose);
|
||||
|
||||
if (stream != null) {
|
||||
byte[] data = humanoidPose.Serialize();
|
||||
stream.SendNext(data);
|
||||
}
|
||||
}
|
||||
|
||||
PhotonStream reader;
|
||||
|
||||
private void ReceiveAvatarPose(PhotonStream reader) {
|
||||
this.reader = reader;
|
||||
|
||||
byte[] data = (byte[])reader.ReceiveNext();
|
||||
this.ReceiveHumanoidPose(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Grab
|
||||
|
||||
void IHumanoidNetworking.Grab(HandTarget handTarget, GameObject obj, bool rangeCheck, HandTarget.GrabType grabType) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Grab " + obj + " " + grabType);
|
||||
|
||||
ulong objIdentity = GetObjectIdentity(obj);
|
||||
if (objIdentity == 0) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Warning)
|
||||
Debug.LogError("Photon Grab: Grabbed object does not have a PhotonView");
|
||||
return;
|
||||
}
|
||||
|
||||
HumanoidNetworking.Grab grab = new HumanoidNetworking.Grab(handTarget, objIdentity, rangeCheck, grabType);
|
||||
if (createLocalRemotes)
|
||||
// Does this make sense?
|
||||
this.Receive(grab);
|
||||
|
||||
byte[] data = grab.Serialize();
|
||||
|
||||
#if hPHOTON2
|
||||
photonView.RPC("RpcGrab", RpcTarget.Others, data);
|
||||
#else
|
||||
photonView.RPC("RpcGrab", PhotonTargets.Others, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
public void RpcGrab(byte[] data) {
|
||||
if (processedThisFrame > 0 || messageQueue.Count > 0) {
|
||||
QueuedMessage msg = new QueuedMessage() {
|
||||
messageType = MessageType.Grab,
|
||||
data = data
|
||||
};
|
||||
messageQueue.Enqueue(msg);
|
||||
Debug.Log("++++Buffered Grab message = " + messageQueue.Count + " " + Time.time);
|
||||
return;
|
||||
}
|
||||
|
||||
this.ReceiveGrab(data);
|
||||
processedThisFrame++;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Let Go
|
||||
|
||||
void IHumanoidNetworking.LetGo(HandTarget handTarget) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("LetGo");
|
||||
|
||||
HumanoidNetworking.LetGo letGo = new HumanoidNetworking.LetGo(handTarget);
|
||||
if (createLocalRemotes)
|
||||
this.Receive(letGo);
|
||||
|
||||
byte[] data = letGo.Serialize();
|
||||
#if hPHOTON2
|
||||
photonView.RPC("RpcLetGo", RpcTarget.Others, data);
|
||||
#else
|
||||
photonView.RPC("RpcLetGo", PhotonTargets.Others, data);
|
||||
#endif
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
public void RpcLetGo(byte[] data) {
|
||||
if (processedThisFrame > 0 || messageQueue.Count > 0) {
|
||||
QueuedMessage msg = new QueuedMessage() {
|
||||
messageType = MessageType.LetGo,
|
||||
data = data
|
||||
};
|
||||
messageQueue.Enqueue(msg);
|
||||
Debug.Log("++++Buffered Let Go message = " + messageQueue.Count + " " + Time.time);
|
||||
return;
|
||||
}
|
||||
|
||||
this.ReceiveLetGo(data);
|
||||
processedThisFrame++;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Change Avatar
|
||||
void IHumanoidNetworking.ChangeAvatar(HumanoidControl humanoid, string avatarPrefabName, string possessionLocation) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
Debug.Log(humanoid.nwId + ": Change Avatar: " + avatarPrefabName);
|
||||
|
||||
HumanoidNetworking.ChangeAvatar changeAvatar = new HumanoidNetworking.ChangeAvatar(humanoid, avatarPrefabName, possessionLocation);
|
||||
if (createLocalRemotes)
|
||||
this.Receive(changeAvatar);
|
||||
|
||||
byte[] data = changeAvatar.Serialize();
|
||||
#if hPHOTON2
|
||||
photonView.RPC("RpcChangeAvatar", RpcTarget.Others, data); // humanoid.humanoidId, avatarPrefabName);
|
||||
#else
|
||||
photonView.RPC("RpcChangeAvatar", PhotonTargets.Others, data); // humanoid.humanoidId, avatarPrefabName);
|
||||
#endif
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
protected virtual void RpcChangeAvatar(byte[] data) {
|
||||
this.ReceiveChangeAvatar(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Tracking
|
||||
|
||||
private Transform GetTrackingTransform(HumanoidControl humanoid) {
|
||||
#if hANTILATENCY
|
||||
if (humanoid.antilatency != null)
|
||||
return humanoid.antilatency.trackerTransform;
|
||||
#endif
|
||||
//#if hOPENVR && (UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX)
|
||||
// if (humanoid.openVR != null)
|
||||
// return humanoid.openVR.GetTrackingTransform();
|
||||
//#endif
|
||||
return null;
|
||||
}
|
||||
|
||||
public void SyncTrackingSpace(HumanoidControl humanoid) {
|
||||
if (humanoid == null)
|
||||
return;
|
||||
|
||||
Transform trackingTransform = GetTrackingTransform(humanoid);
|
||||
if (trackingTransform == null)
|
||||
return;
|
||||
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
DebugLog("Send Sync Tracking Space " + humanoid.humanoidId + " " + trackingTransform.position + " " + trackingTransform.rotation);
|
||||
|
||||
HumanoidNetworking.SyncTrackingSpace syncTrackingSpace =
|
||||
new HumanoidNetworking.SyncTrackingSpace(humanoid, trackingTransform.position, trackingTransform.rotation);
|
||||
|
||||
if (createLocalRemotes)
|
||||
// Does this make sense?
|
||||
this.Receive(syncTrackingSpace);
|
||||
|
||||
byte[] data = syncTrackingSpace.Serialize();
|
||||
#if hPHOTON2
|
||||
photonView.RPC("RpcSyncTracking", RpcTarget.Others, data);
|
||||
#else
|
||||
photonView.RPC("RpcSyncTracking", PhotonTargets.Others, data);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
protected virtual void RpcSyncTracking(byte[] data) {
|
||||
this.ReceiveSyncTrackingSpace(data);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Network Sync
|
||||
|
||||
void IHumanoidNetworking.ReenableNetworkSync(GameObject obj) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
Debug.Log("ReenableNetworkSync " + obj);
|
||||
|
||||
ReenableNetworkSync(obj);
|
||||
}
|
||||
|
||||
void IHumanoidNetworking.DisableNetworkSync(GameObject obj) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Info)
|
||||
Debug.Log("DisableNetworkSync " + obj);
|
||||
DisableNetworkSync(obj);
|
||||
}
|
||||
|
||||
public static void ReenableNetworkSync(GameObject obj) {
|
||||
#if hPHOTON2
|
||||
PhotonView photonView = obj.GetComponent<PhotonView>();
|
||||
if (photonView != null) {
|
||||
photonView.Synchronization = ViewSynchronization.UnreliableOnChange;
|
||||
}
|
||||
#endif
|
||||
|
||||
PhotonTransformView transformView = obj.GetComponent<PhotonTransformView>();
|
||||
if (transformView != null) {
|
||||
#if hPHOTON2
|
||||
transformView.m_SynchronizePosition = true;
|
||||
transformView.m_SynchronizeRotation = true;
|
||||
transformView.enabled = true;
|
||||
|
||||
#else
|
||||
transformView.m_PositionModel.SynchronizeEnabled = true;
|
||||
transformView.m_RotationModel.SynchronizeEnabled = true;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
public static void TakeOwnership(GameObject obj) {
|
||||
#if hPHOTON2
|
||||
PhotonView photonView = obj.GetComponent<PhotonView>();
|
||||
if (photonView != null)
|
||||
photonView.RequestOwnership();
|
||||
#endif
|
||||
}
|
||||
|
||||
public static void DisableNetworkSync(GameObject obj) {
|
||||
PhotonTransformView transformView = obj.GetComponent<PhotonTransformView>();
|
||||
if (transformView != null) {
|
||||
#if hPHOTON2
|
||||
transformView.m_SynchronizePosition = false;
|
||||
transformView.m_SynchronizeRotation = false;
|
||||
transformView.enabled = false;
|
||||
#else
|
||||
transformView.m_PositionModel.SynchronizeEnabled = false;
|
||||
transformView.m_RotationModel.SynchronizeEnabled = false;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Network Object
|
||||
|
||||
#region Void Event
|
||||
|
||||
public void RPC(FunctionCall functionCall) {
|
||||
ulong objIdentity = GetObjectIdentity(functionCall.targetGameObject);
|
||||
if (objIdentity == 0) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Warning)
|
||||
Debug.LogError("Photon Grab: Grabbed object does not have a PhotonView");
|
||||
return;
|
||||
}
|
||||
|
||||
photonView.RPC("RpcFunctionCall", RpcTarget.Others, objIdentity, functionCall.methodName);
|
||||
}
|
||||
|
||||
[PunRPC]
|
||||
public void RpcFunctionCall(ulong objIdentity, string methodName) {
|
||||
GameObject targetGameObject = GetGameObject(objIdentity);
|
||||
if (targetGameObject == null) {
|
||||
if (debug <= HumanoidNetworking.DebugLevel.Warning)
|
||||
Debug.LogError("FunctionCall: Could not find object for method " + methodName);
|
||||
return;
|
||||
}
|
||||
|
||||
FunctionCall.Execute(targetGameObject, methodName);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#endregion Network Object
|
||||
|
||||
#region Send
|
||||
public void Send(bool b) { stream.SendNext(b); }
|
||||
public void Send(byte b) { stream.SendNext(b); }
|
||||
public void Send(int x) { stream.SendNext(x); }
|
||||
public void Send(float f) { stream.SendNext(f); }
|
||||
public void Send(Vector3 v) { stream.SendNext(v); }
|
||||
public void Send(Quaternion q) { stream.SendNext(q); }
|
||||
#endregion
|
||||
|
||||
#region Receive
|
||||
public bool ReceiveBool() { return (bool)reader.ReceiveNext(); }
|
||||
public byte ReceiveByte() { return (byte)reader.ReceiveNext(); }
|
||||
public int ReceiveInt() { return (int)reader.ReceiveNext(); }
|
||||
public float ReceiveFloat() { return (float)reader.ReceiveNext(); }
|
||||
public Vector3 ReceiveVector3() { return (Vector3)reader.ReceiveNext(); }
|
||||
public Quaternion ReceiveQuaternion() { return (Quaternion)reader.ReceiveNext(); }
|
||||
#endregion
|
||||
|
||||
#region Debug
|
||||
|
||||
public void DebugLog(string message) {
|
||||
#if hPHOTON2
|
||||
Debug.Log(photonView.ViewID + ": " + message);
|
||||
#else
|
||||
Debug.Log(photonView.viewID + ": " + message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public void DebugWarning(string message) {
|
||||
#if hPHOTON2
|
||||
Debug.LogWarning(photonView.ViewID + ": " + message);
|
||||
#else
|
||||
Debug.LogWarning(photonView.viewID + ": " + message);
|
||||
#endif
|
||||
}
|
||||
|
||||
public void DebugError(string message) {
|
||||
#if hPHOTON2
|
||||
Debug.LogError(photonView.ViewID + ": " + message);
|
||||
#else
|
||||
Debug.LogError(photonView.viewID + ": " + message);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
#endif
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b2b89683096330a4eb3810fdaeb79fb6
|
||||
timeCreated: 1504014033
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,72 @@
|
||||
using UnityEngine;
|
||||
#if hPUNVOICE2
|
||||
using Photon.Pun;
|
||||
#endif
|
||||
|
||||
namespace Passer.Humanoid {
|
||||
|
||||
#if !hPUNVOICE2
|
||||
public partial class HumanoidPlayerPunVoice : MonoBehaviour {
|
||||
#else
|
||||
public class HumanoidPlayerPunVoice : MonoBehaviourPunCallbacks {
|
||||
#endif
|
||||
/// <summary>
|
||||
/// The humanoid to follow
|
||||
/// </summary>
|
||||
public HumanoidControl humanoid;
|
||||
|
||||
#if hPUNVOICE2
|
||||
|
||||
private bool updateAudioSource = true;
|
||||
|
||||
#region Init
|
||||
|
||||
protected virtual void Start() {
|
||||
Debug.Log("Started HumanoidVoice");
|
||||
DontDestroyOnLoad(this.gameObject);
|
||||
}
|
||||
|
||||
#endregion Init
|
||||
|
||||
#region Update
|
||||
|
||||
protected virtual void Update() {
|
||||
if (photonView.Controller.IsLocal) {
|
||||
transform.position = humanoid.headTarget.transform.position;
|
||||
}
|
||||
else {
|
||||
if (updateAudioSource) {
|
||||
AudioSource audioSource = GetComponent<AudioSource>();
|
||||
if (audioSource != null) {
|
||||
audioSource.rolloffMode = AudioRolloffMode.Linear;
|
||||
audioSource.spatialBlend = 1;
|
||||
audioSource.minDistance = 0;
|
||||
audioSource.maxDistance = 1;
|
||||
updateAudioSource = false;
|
||||
}
|
||||
}
|
||||
if (humanoid == null) {
|
||||
foreach (HumanoidControl humanoid in HumanoidControl.allHumanoids) {
|
||||
if (humanoid.headTarget == null)
|
||||
continue;
|
||||
float distance = Vector3.Distance(this.transform.position, humanoid.headTarget.transform.position);
|
||||
if (distance < 0.01F) {
|
||||
this.humanoid = humanoid;
|
||||
AudioSource audioSource = this.humanoid.headTarget.GetComponentInChildren<AudioSource>();
|
||||
#if pUNITYXR
|
||||
if (audioSource == null && this.humanoid.headTarget.unityXR.unityXR.hmd != null)
|
||||
audioSource = this.humanoid.headTarget.unityXR.unityXR.hmd.GetComponentInChildren<AudioSource>();
|
||||
#endif
|
||||
if (audioSource != null)
|
||||
audioSource = this.GetComponent<AudioSource>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#endregion Update
|
||||
|
||||
#endif
|
||||
}
|
||||
}
|
@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 69a31162e39169c4fad112f52654bd40
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,97 @@
|
||||
using UnityEngine;
|
||||
#if hPHOTON2
|
||||
using Photon.Pun;
|
||||
using Photon.Realtime;
|
||||
#endif
|
||||
#if hPUNVOICE2
|
||||
using Photon.Voice.PUN;
|
||||
using Photon.Voice.Unity;
|
||||
#endif
|
||||
|
||||
namespace Passer {
|
||||
#if hNW_PHOTON
|
||||
public class PunStarter : INetworkingStarter {
|
||||
|
||||
public GameObject playerPrefab;
|
||||
|
||||
public string roomName;
|
||||
public int gameVersion;
|
||||
public int sendRate;
|
||||
|
||||
public void Awake() {
|
||||
#if hPUNVOICE2 && !UNITY_WEBGL
|
||||
PhotonVoiceNetwork voiceNetwork = Object.FindObjectOfType<PhotonVoiceNetwork>();
|
||||
if (voiceNetwork != null)
|
||||
return;
|
||||
|
||||
GameObject voiceNetworkObject = new GameObject("Voice Network");
|
||||
voiceNetwork = voiceNetworkObject.AddComponent<PhotonVoiceNetwork>();
|
||||
|
||||
Recorder voiceRecorder = voiceNetworkObject.AddComponent<Recorder>();
|
||||
voiceRecorder.ReactOnSystemChanges = true;
|
||||
voiceRecorder.TransmitEnabled = true;
|
||||
voiceRecorder.SamplingRate = POpusCodec.Enums.SamplingRate.Sampling48000;
|
||||
|
||||
voiceNetwork.PrimaryRecorder = voiceRecorder;
|
||||
#endif
|
||||
}
|
||||
|
||||
GameObject INetworkingStarter.GetHumanoidPrefab() {
|
||||
GameObject humanoidPrefab = Resources.Load<GameObject>("HumanoidPlayer");
|
||||
return humanoidPrefab;
|
||||
}
|
||||
|
||||
void INetworkingStarter.StartHost(NetworkingStarter nwStarter) {
|
||||
((INetworkingStarter)this).StartClient(nwStarter);
|
||||
}
|
||||
|
||||
void INetworkingStarter.StartClient(NetworkingStarter nwStarter) {
|
||||
((INetworkingStarter)this).StartClient(nwStarter, nwStarter.roomName, nwStarter.gameVersion);
|
||||
}
|
||||
|
||||
void INetworkingStarter.StartClient(NetworkingStarter nwStarter, string _roomName, int _gameVersion) {
|
||||
roomName = _roomName;
|
||||
gameVersion = _gameVersion;
|
||||
playerPrefab = Resources.Load<GameObject>("HumanoidPlayer");
|
||||
sendRate = nwStarter.sendRate;
|
||||
|
||||
#if hPHOTON2
|
||||
PhotonNetwork.SendRate = sendRate;
|
||||
PhotonNetwork.SerializationRate = sendRate;
|
||||
PhotonNetwork.GameVersion = gameVersion.ToString();
|
||||
PhotonNetwork.ConnectUsingSettings();
|
||||
#else
|
||||
PhotonNetwork.sendRate = sendRate;
|
||||
PhotonNetwork.sendRateOnSerialize = sendRate;
|
||||
PhotonNetwork.ConnectUsingSettings(gameVersion.ToString());
|
||||
#endif
|
||||
}
|
||||
|
||||
public virtual void OnConnectedToPhoton() {
|
||||
Debug.Log("Photon");
|
||||
}
|
||||
|
||||
public virtual void OnConnectedToMaster() {
|
||||
RoomOptions roomOptions = new RoomOptions() { IsVisible = false, MaxPlayers = 4 };
|
||||
PhotonNetwork.JoinOrCreateRoom(roomName, roomOptions, TypedLobby.Default);
|
||||
}
|
||||
|
||||
public virtual void OnPhotonJoinRoomFailed() {
|
||||
Debug.LogError("Could not joint the " + roomName + " room");
|
||||
}
|
||||
|
||||
public virtual void OnJoinedRoom(GameObject playerPrefab) {
|
||||
if (playerPrefab != null)
|
||||
PhotonNetwork.Instantiate(playerPrefab.name, Vector3.zero, Quaternion.identity, 0);
|
||||
|
||||
//NetworkingSpawner spawner = FindObjectOfType<NetworkingSpawner>();
|
||||
//if (spawner != null)
|
||||
// spawner.OnNetworkingStarted();
|
||||
}
|
||||
|
||||
public void StopClient() {
|
||||
PhotonNetwork.Disconnect();
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
@ -0,0 +1,12 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bbe6fd67c1c770e478d9cb8eef19b594
|
||||
timeCreated: 1466884930
|
||||
licenseType: Free
|
||||
MonoImporter:
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Loading…
x
Reference in New Issue
Block a user