示例#1
0
        protected virtual void OnInstantiateInNode_ServerClient(RpcArgs pArgs)
        {
            byte[]             data        = pArgs.GetNext <byte[]>();
            RPCServiceCallback callbackRPC = data.ByteArrayToObject <RPCServiceCallback>();
            NetworkBehavior    behavior;

            if (NodeManager.IsInitialized)
            {
                RPCInstantiateInNode instantiateInNodeRPC = callbackRPC.data.ByteArrayToObject <RPCInstantiateInNode>();
                behavior = NodeManager.Instance.InstantiateInScene(instantiateInNodeRPC.sceneName, instantiateInNodeRPC.createCode, null, instantiateInNodeRPC.position.ToVector3(), instantiateInNodeRPC.rotation.ToQuaternion(), instantiateInNodeRPC.sendTransform);
                if (behavior != null)
                {
                    IRPCSerializable behaviorData = behavior as IRPCSerializable;
                    if (behaviorData != null && instantiateInNodeRPC.behaviorData != null)
                    {
                        behaviorData.FromByteArray(instantiateInNodeRPC.behaviorData);
                    }
                }
            }
            else
            {
                behavior = null;
            }

            callbackRPC.state = (behavior != null) ? ServiceCallbackStateEnum.RESPONSE_SUCCESS : ServiceCallbackStateEnum.RESPONSE_FAILED;
            callbackRPC.data  = null;
            networkObject.SendRpc(RPC_RELAY_CONFIRM_INSTANTIATE_IN_NODE, Receivers.Server, callbackRPC.ObjectToByteArray());
        }
        public virtual void SetIRPCSerializable(INetworkBehavior pNetworkBehavior, IRPCSerializable pBehaviorData)
        {
            if (pNetworkBehavior == null || pBehaviorData == null)
            {
                return;
            }

            IRPCSerializable rpcSerializable = pNetworkBehavior as IRPCSerializable;

            if (rpcSerializable == null)
            {
                return;
            }

            rpcSerializable.FromByteArray(pBehaviorData.ToByteArray());
        }
        public virtual NetworkBehavior InstantiateNetworkBehavior(int pCreateCode = -1, IRPCSerializable pBehaviorData = null, Vector3?pPosition = null, Quaternion?pRotation = null, bool pSendTransform = true)
        {
            GameObject prefab = _networkBehaviorListSO.behaviorList.GetByCreateCode(pCreateCode);

            if (prefab == null)
            {
                return(null);
            }

            var           go          = Instantiate(prefab);
            var           netBehavior = go.GetComponent <NetworkBehavior>();
            NetworkObject obj         = null;

            if (!pSendTransform && pPosition == null && pRotation == null)
            {
                obj = netBehavior.CreateNetworkObject(_networker, pCreateCode);
            }
            else
            {
                _tmpMetadata.Clear();
                if (pPosition == null && pRotation == null)
                {
                    byte transformFlags = 0x1 | 0x2;
                    ObjectMapper.Instance.MapBytes(_tmpMetadata, transformFlags);
                    ObjectMapper.Instance.MapBytes(_tmpMetadata, go.transform.position, go.transform.rotation);
                }
                else
                {
                    byte transformFlags = 0x0;
                    transformFlags |= (byte)(pPosition != null ? 0x1 : 0x0);
                    transformFlags |= (byte)(pRotation != null ? 0x2 : 0x0);
                    ObjectMapper.Instance.MapBytes(_tmpMetadata, transformFlags);

                    if (pPosition != null)
                    {
                        ObjectMapper.Instance.MapBytes(_tmpMetadata, pPosition.Value);
                    }

                    if (pRotation != null)
                    {
                        ObjectMapper.Instance.MapBytes(_tmpMetadata, pRotation.Value);
                    }
                }

                obj = netBehavior.CreateNetworkObject(_networker, pCreateCode, _tmpMetadata.CompressBytes());
            }

            SetINetworkSceneObject(netBehavior, obj);
            SetIRPCSerializable(netBehavior, pBehaviorData);
            FinalizeInitialization(go, netBehavior, obj, pPosition, pRotation, pSendTransform);
            return(netBehavior);
        }
 public virtual NetworkBehavior InstantiateNetworkBehavior(string pName, IRPCSerializable pBehaviorData = null, Vector3?pPosition = null, Quaternion?pRotation = null, bool pSendTransform = true)
 {
     return(InstantiateNetworkBehavior(_networkBehaviorListSO.behaviorList.GetCreateCodeFromName(pName), pBehaviorData, pPosition, pRotation, pSendTransform));
 }
示例#5
0
        public static ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum> InstantiateInNode(uint pSourceNodeId, uint pTargetNodeId, string pSceneName, int pCreateCode, IRPCSerializable pBehaviorData, Vector3?pPosition, Quaternion?pRotation, bool pSendTransform)
        {
            ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum> callback = new ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum>(0, pSourceNodeId, GameTime.fixedTime);

            if (!IsInitialized)
            {
                callback.State = ServiceCallbackStateEnum.ERROR_SERVICE_NOT_INITIALIZED;
                return(callback);
            }

            if (Instance.Manager == null || !Instance.Manager.HasNetworker || !Instance.Manager.Networker.IsConnected)
            {
                callback.State = ServiceCallbackStateEnum.ERROR_NO_CONNECTION;
                return(callback);
            }

            RPCInstantiateInNode requestData = new RPCInstantiateInNode()
            {
                targetNodeId = pTargetNodeId, sceneName = pSceneName, createCode = pCreateCode, sendTransform = pSendTransform
            };

            if (pBehaviorData != null)
            {
                requestData.behaviorData = pBehaviorData.ToByteArray();
            }

            if (pPosition != null)
            {
                requestData.position = pPosition.Value.ToRPC();
            }

            if (pRotation != null)
            {
                requestData.rotation = pRotation.Value.ToRPC();
            }

            callback.RequestDataOfT = requestData;
            callback.State          = ServiceCallbackStateEnum.AWAITING_RESPONSE;
            Instance.AddPendingServiceCallback(callback);
            MainThreadManager.Run(() => {
                if (!IsInitialized || Instance.networkObject == null)
                {
                    return;
                }

                Instance.networkObject.SendRpc(RPC_RELAY_INSTANTIATE_IN_NODE, Receivers.Server, callback.ToByteArray());
            });

            return(callback);
        }
示例#6
0
 public virtual ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum> InstantiateInNode(uint pSourceNodeId, uint pTargetNodeId, string pSceneName, int pCreateCode = -1, IRPCSerializable pBehaviorData = null, Vector3?pPosition = null, Quaternion?pRotation = null, bool pSendTransform = true)
 {
     return(NodeService.InstantiateInNode(pSourceNodeId, pTargetNodeId, pSceneName, pCreateCode, pBehaviorData, pPosition, pRotation, pSendTransform));
 }
示例#7
0
 public virtual ServiceCallback <RPCInstantiateInNode, ServiceCallbackStateEnum> InstantiateInNode(uint pSourceNodeId, uint pTargetNodeId, string pSceneName, string pNetworkBehaviorName, IRPCSerializable pBehaviorData = null, Vector3?pPosition = null, Quaternion?pRotation = null, bool pSendTransform = true)
 {
     return(InstantiateInNode(pSourceNodeId, pTargetNodeId, pSceneName, _networkSceneBehaviorListSO.behaviorList.GetCreateCodeFromName(pNetworkBehaviorName), pBehaviorData, pPosition, pRotation, pSendTransform));
 }
示例#8
0
        public virtual NetworkBehavior InstantiateInScene(string pSceneName, int pCreateCode = -1, IRPCSerializable pBehaviorData = null, Vector3?pPosition = null, Quaternion?pRotation = null, bool pSendTransform = true)
        {
            NetworkSceneItem item = FindNetworkSceneItem(pSceneName, true, true);

            if (item == null || !item.HasManager)
            {
                return(null);
            }

            return(item.Manager.InstantiateNetworkBehavior(pCreateCode, pBehaviorData, pPosition, pRotation, pSendTransform));
        }