示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
                }
            }
        }