static void Update() { if (!isMessageQueueRunning) { return; } List <NetIncomingMessage> messages = new List <NetIncomingMessage>(); int counter = peer.ReadMessages(messages); foreach (var msg in messages) { //faster than switch, as most will be Data messages. if (msg.MessageType == NetIncomingMessageType.Data) { Consume(msg); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.DiscoveryResponse) { if (OnDiscoveryResponse != null) { OnDiscoveryResponse(msg); } peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.WarningMessage) { Debug.LogWarning(msg.ReadString()); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.ConnectionLatencyUpdated) { Latency = msg.ReadFloat(); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.ErrorMessage) { Debug.LogError(msg.ReadString()); peer.Recycle(msg); } else if (msg.MessageType == NetIncomingMessageType.StatusChanged) { var lastStatus = m_status; m_status = (NetConnectionStatus)msg.ReadByte(); statusReason = msg.ReadString(); peer.Recycle(msg); try { if (m_status == NetConnectionStatus.Disconnected) { if (lastStatus != NetConnectionStatus.Disconnected) { if (OnDisconnectedFromServer != null) { OnDisconnectedFromServer(); } if (Configuration.DeleteNetworkInstantiatesOnDisconnect) { NetworkView.DestroyAllViews(); } } else { if (OnFailedToConnect != null) { OnFailedToConnect(statusReason); } } } else if (m_status == NetConnectionStatus.Connected) { if (OnConnectedToServer != null) { OnConnectedToServer(); } } } catch (Exception e) { Debug.LogError(e); } } else if (msg.MessageType == NetIncomingMessageType.Error) { Debug.LogError(msg.ReadString()); //this should really never happen... peer.Recycle(msg); } else { peer.Recycle(msg); } } }
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); } } }