Пример #1
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);
     }
 }
Пример #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);
                }
            }
        }