/// <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)); }
/// <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; } }
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(); }