private static void Consume(NetIncomingMessage msg) { try { //faster than switch, as this is in most to least common order if (msg.SequenceChannel == Channels.UNRELIABLE_STREAM) { var actorId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(actorId, out find)) { find.OnDeserializeStream(msg); } } else if (msg.SequenceChannel == Channels.RELIABLE_STREAM) { var actorId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(actorId, out find)) { find.OnDeserializeStream(msg); } } else if (msg.SequenceChannel >= Channels.BEGIN_RPCMODES && msg.SequenceChannel <= Channels.OWNER_RPC) { //rpc... var viewID = msg.ReadUInt16(); var rpcId = msg.ReadByte(); NetworkView find; if (NetworkView.Find(viewID, out find)) { find.CallRPC(rpcId, msg); } else { Debug.LogWarning("couldn't find view " + viewID + " to send rpc " + rpcId); } } else if (msg.SequenceChannel == Channels.SYNCHED_FIELD) { var viewId = msg.ReadUInt16(); var fieldId = msg.ReadByte(); NetworkView find; if (NetworkView.Find(viewId, out find)) { find.SetSynchronizedField(fieldId, msg); } else { Debug.LogWarning("couldn't find view " + viewId + " to set field " + fieldId); } } else if (msg.SequenceChannel == Channels.OBJECT_RPC) { var viewId = msg.ReadUInt16(); var rpcId = msg.ReadByte(); NetworkedSceneObject find; if (NetworkedSceneObject.sceneObjects.TryGetValue(viewId, out find)) { find.CallRPC(rpcId, msg); } } else if (msg.SequenceChannel == Channels.STATIC_RPC) { var rpcId = msg.ReadByte(); if (ProcessRPC != null) { ProcessRPC(rpcId, msg); } } else if (msg.SequenceChannel == Channels.STATIC_UTILS) { ProcessUtils(msg); } else { Debug.LogWarning("data received over unhandled channel " + msg.SequenceChannel); } } catch (Exception er) { Debug.LogError(er); } }
private static void ProcessUtils(NetIncomingMessage msg) { var utilId = msg.ReadByte(); if (utilId == RPCUtils.TimeUpdate) { } else if (utilId == RPCUtils.Instantiate) { //read the path... var resourcePath = msg.ReadString(); var viewId = msg.ReadUInt16(); var ownerId = msg.ReadUInt16(); GameObject gobj; bool isCached = false; if (resourceCaching && (isCached = ResourceCache.ContainsKey(resourcePath))) { gobj = ResourceCache[resourcePath]; } else { gobj = Resources.Load(resourcePath) as GameObject; } if (resourceCaching && !isCached) { ResourceCache.Add(resourcePath, gobj); } var instance = (GameObject)GameObject.Instantiate(gobj); if (instance == null) { Debug.LogWarning("could not find prefab " + resourcePath + " to instantiate"); return; } var trans = instance.transform; trans.position = Vector3Serializer.Deserialize(msg); trans.rotation = QuaternionSerializer.Deserialize(msg); if (Debug.isDebugBuild) { Debug.Log(string.Format("network instantiate of {0}. Loc: {1} Rot: {2}", resourcePath, trans.position, trans.rotation)); } //look for a networkview.. var view = instance.GetComponent <NetworkView>(); if (view) { NetworkView.RegisterView(view, viewId); view.viewID = new NetworkViewId() { guid = viewId, IsMine = PlayerId == ownerId }; view.IsMine = PlayerId == ownerId; view.OwnerId = ownerId; var nBehaviours = instance.GetComponents <NetBehaviour>(); foreach (var behave in nBehaviours) { behave.netView = view; view.OnFinishedCreation += behave.CallFinished; } view.DoOnFinishedCreation(); FinishedInstantiate(view.viewID.guid); } } else if (utilId == RPCUtils.Remove) { var viewId = msg.ReadUInt16(); NetworkView find; if (NetworkView.Find(viewId, out find)) { find.DoOnRemove(); UnityEngine.Object.Destroy(find); } NetworkView.RemoveView(viewId); } else if (utilId == RPCUtils.ChangeRoom) { var newRoom = msg.ReadString(); NetworkedSceneObject.sceneObjects = new Dictionary <int, NetworkedSceneObject>(); if (OnRoomChange != null) { OnRoomChange(newRoom); } if (Configuration.DeleteNetworkInstantiatesOnRoomChange) { NetworkView.DestroyAllViews(); } } else if (utilId == RPCUtils.AddView) { var addToId = msg.ReadUInt16(); var idToAdd = msg.ReadUInt16(); string customFunction; var runCustomFunction = msg.ReadString(out customFunction); NetworkView view; if (NetworkView.Find(addToId, out view)) { var newView = view.gameObject.AddComponent <NetworkView>(); NetworkView.RegisterView(newView, idToAdd); newView.viewID = new NetworkViewId() { guid = idToAdd, IsMine = view.IsMine }; newView.IsMine = view.IsMine; newView.OwnerId = view.OwnerId; if (runCustomFunction) { view.gameObject.SendMessage(customFunction, newView, SendMessageOptions.RequireReceiver); } } } else if (utilId == RPCUtils.SetPlayerId) { var playerId = msg.ReadUInt16(); PlayerId = playerId; if (Debug.isDebugBuild) { Debug.Log("Setting player id to " + playerId); } } }