コード例 #1
0
ファイル: NetworkView.Static.cs プロジェクト: traleven/PNet
 /// <summary>
 /// find a networkview based on a networkviewid that was serialized into an rpc
 /// </summary>
 /// <param name="message">uses deserialize, so the read location does advance</param>
 /// <param name="view"></param>
 /// <returns></returns>
 public static bool Find(ref NetIncomingMessage message, out NetworkView view)
 {
     var viewId = new NetworkViewId();
     viewId.OnDeserialize(message);
     if (UnityEngineHook.ValidInstance)
         return UnityEngineHook.Instance.Manager.TryGetView(viewId, out view);
     
     view = null;
     return false;
 }
コード例 #2
0
 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);
     }
 }
コード例 #3
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);
                }
            }
        }
コード例 #4
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);
                }
            }
        }
コード例 #5
0
 internal static void RegisterView(NetworkView view, ushort viewId)
 {
     allViews.Add(viewId, view);
 }
コード例 #6
0
        /// <summary>
        /// find a networkview based on a networkviewid that was serialized into an rpc
        /// </summary>
        /// <param name="message">uses deserialize, so the read location does advance</param>
        /// <param name="view"></param>
        /// <returns></returns>
        public static bool Find(ref NetIncomingMessage message, out NetworkView view)
        {
            var id = NetworkViewId.Deserialize(message);

            return(Find(id, out view));
        }
コード例 #7
0
 internal void AddView(PNetC.NetworkView newView, NetworkView view)
 {
     _networkViews.Add(newView.ViewID, view);
     view.SetNetworkView(newView);
 }
コード例 #8
0
 internal bool TryGetView(NetworkViewId viewId, out NetworkView view)
 {
     return _networkViews.TryGetValue(viewId, out view);
 }
コード例 #9
0
 internal void AddView(PNetC.NetworkView newView, NetworkView view)
 {
     _networkViews.Add(newView.ViewID, view);
     view.SetNetworkView(newView);
 }
コード例 #10
0
 internal bool TryGetView(NetworkViewId viewId, out NetworkView view)
 {
     return(_networkViews.TryGetValue(viewId, out view));
 }