Ejemplo n.º 1
0
        /// <summary>
        /// Add a custom message to be handled. Also registered messages CANNOT be unregistered. Maximum of 256(size of byte) messages can be registered (including 255(INVALID) and all built-in messages).
        /// Messages should be registered in the same order on the server and each client otherwise there will be game breaking issues occuring.
        /// </summary>
        /// <param name="messageName">The name of the message type.</param>
        /// <param name="callback">The callback when the message type has been received and handle the message type.</param>
        /// <param name="receiver">Whether the message type will be sent to only the client, server or both.</param>
        /// <returns>The byte index associated with the message type.</returns>
        public byte RegisterMessageType(string messageName, MessageCallbackDelagate callback, NetworkMessageReceiver receiver = NetworkMessageReceiver.Both)
        {
            //This is in place to prevent bad design. Networking messages should be setup before starting the server or the client.
            if (NetworkManager.Get().isRunning)
            {
                Debug.LogError("Cannot register message type while the Network Manager is running.");
                return((byte)MessageType.INVALID);
            }

            if (string.IsNullOrEmpty(messageName))
            {
                Debug.LogError("Parameter 'messageName' cannot be a null or empty string.");
                return((byte)MessageType.INVALID);
            }

            if (callback == null)
            {
                Debug.LogError("Parameter 'callback' cannot be null.");
                return((byte)MessageType.INVALID);
            }

            if (m_FirstFreeIndex == (byte)MessageType.INVALID) //This assumes INVALID is 255.
            {
                Debug.LogError("No more slots to register the message type. Use Custom Message Manager instead.");
                return((byte)MessageType.INVALID);
            }

            m_MessageNames[m_FirstFreeIndex] = messageName;
            m_Callbacks[m_FirstFreeIndex]    = callback;
            m_Receivers[m_FirstFreeIndex]    = receiver;

            m_FirstFreeIndex++;

            return((byte)(m_FirstFreeIndex - 1));
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Handle the valid messages received from NetworkManager.HandleIncomingData().
        /// </summary>
        /// <param name="sendingClientID"></param>
        /// <param name="messageType"></param>
        /// <param name="messageStream"></param>
        /// <param name="receiveTime"></param>
        public void HandleMessage(ulong sendingClientID, byte messageType, BitStream messageStream, float receiveTime)
        {
            if (messageType >= m_FirstFreeIndex)
            {
                if (messageType == (byte)MessageType.INVALID)
                {
                    Debug.LogWarning("Received invalid message.");
                    return;
                }

                Debug.LogError("Received unknown message type. Message type: " + messageType.ToString());
                return;
            }

            NetworkMessageReceiver receiver = m_Receivers[messageType];

            switch (receiver)
            {
            case NetworkMessageReceiver.Both:
                m_Callbacks[messageType].Invoke(sendingClientID, messageStream, receiveTime);
                break;

            case NetworkMessageReceiver.Client:
                if (networkManager.isClient)
                {
                    m_Callbacks[messageType].Invoke(sendingClientID, messageStream, receiveTime);
                }
#if DEVELOPMENT_BUILD || UNITY_EDITOR
                if (!networkManager.isClient)
                {
                    Debug.LogError("Client '" + sendingClientID + "' sent message type " + GetMessageName(messageType) + "(" + messageType.ToString() + ") when the Network Message Receiver for this message type is set to Client.");
                }
#endif
                break;

            case NetworkMessageReceiver.Server:
                if (networkManager.isServer)
                {
                    m_Callbacks[messageType].Invoke(sendingClientID, messageStream, receiveTime);
                }
#if DEVELOPMENT_BUILD || UNITY_EDITOR
                if (!networkManager.isServer)
                {
                    Debug.LogError("Server sent message type '" + GetMessageName(messageType) + "(" + messageType.ToString() + ")' when the Network Message Receiver for this message type is set to Server.");
                }
#endif
                break;
            }
        }
Ejemplo n.º 3
0
 void Awake()
 {
     if (Instance == null)           //Static 변수를 지정하고 이것이 없을경우 - PlayManage 스크립트를 저장하고 이것이 전 범위적인 싱글톤 오브젝트가 된다.
     {
         DontDestroyOnLoad(this.gameObject);
         Instance = this;
     }
     else if (Instance != this)
     {
         Destroy(this.gameObject);   //싱글톤 오브젝트가 있을경우 다른 오브젝트를 제거.
     }
     networkTranslator = GetComponent <NetworkTranslator>();
     NMS = new NetworkMessageSender();
     NMR = new NetworkMessageReceiver();
 }