“고수준” 커맨드나 RPC 호출 이외에도, 원시 네트워크 메시지를 전송할 수도 있습니다.
확장을 통해 직렬화가 가능한 네트워크 메시지 클래스를 만들 수 있는 MessageBase가 제공됩니다. 이 클래스에는 작성기 및 판독기 오브젝트를 가져오는 Serialize와 Deserialize 함수가 포함되어 있습니다. 이러한 함수들은 직접 구현하거나 네트워킹 시스템이 자동으로 생성하는 코드 기반 구현을 사용할 수 있습니다. 기본 클래스는 아래와 같습니다.
public abstract class MessageBase
{
    // De-serialize the contents of the reader into this message
    public virtual void Deserialize(NetworkReader reader) {}
    // Serialize the contents of this message into the writer
    public virtual void Serialize(NetworkWriter writer) {}
}
메시지 클래스는 대부분의 일반적인 Unity 엔진 타입(예: Vector3)을 비롯하여 기본 타입, 구성 및 배열 멤버를 포함할 수 있습니다. 복잡한 클래스 또는 일반 컨테이너 멤버는 포함할 수 없습니다. 코드 기반 구현을 사용하는 경우에는 사용하는 타입이 공개적으로 표시되는지 확인해야 합니다.
네트워크 메시지 일반 유형에 대한 내장 메시지 클래스는 다음과 같습니다.
메시지를 보내려면 동일한 방식으로 동작하는 NetworkClient, NetworkServer 및 NetworkConnection 클래스의 Send() 메서드를 사용하십시오. 메시지 ID를 받은 후, 메시지 오브젝트가 MessageBase에서 파생됩니다. 아래의 코드는 빌트인 메시지 클래스 중 하나를 사용하여 메시지를 어떻게 전송하고 처리하는지 보여줍니다.
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Networking.NetworkSystem;
public class Begin : NetworkBehaviour
{
    const short MyBeginMsg = 1002;
    NetworkClient m_client;
    public void SendReadyToBeginMessage(int myId)
    {
        var msg = new IntegerMessage(myId);
        m_client.Send(MyBeginMsg, msg);
    }
    public void Init(NetworkClient client)
    {
        m_client = client;
        NetworkServer.RegisterHandler(MyBeginMsg, OnServerReadyToBeginMessage);
    }
    void OnServerReadyToBeginMessage(NetworkMessage netMsg)
    {
        var beginMessage = netMsg.ReadMessage<IntegerMessage>();
        Debug.Log("received OnServerReadyToBeginMessage " + beginMessage.value);
    }
}
아래는 커스텀 네트워크 메시지 클래스를 선언하고 사용하는 방법입니다.
using UnityEngine;
using UnityEngine.Networking;
public class Scores : MonoBehaviour
{
    NetworkClient myClient;
    public class MyMsgType {
        public static short Score = MsgType.Highest + 1;
    };
    public class ScoreMessage : MessageBase
    {
        public int score;
        public Vector3 scorePos;
        public int lives;
    }
    public void SendScore(int score, Vector3 scorePos, int lives)
    {
        ScoreMessage msg = new ScoreMessage();
        msg.score = score;
        msg.scorePos = scorePos;
        msg.lives = lives;
        NetworkServer.SendToAll(MyMsgType.Score, msg);
    }
    // Create a client and connect to the server port
    public void SetupClient()
    {
        myClient = new NetworkClient();
        myClient.RegisterHandler(MsgType.Connect, OnConnected);
        myClient.RegisterHandler(MyMsgType.Score, OnScore);
        myClient.Connect("127.0.0.1", 4444);
    }
    public void OnScore(NetworkMessage netMsg)
    {
        ScoreMessage msg = netMsg.ReadMessage<ScoreMessage>();
        Debug.Log("OnScoreMessage " + msg.score);
    }
    public void OnConnected(NetworkMessage netMsg)
    {
        Debug.Log("Connected to server");
    }
}
이 소스 코드 예제의 ScoreMessage 클래스에는 직렬화 코드가 없습니다. Unity가 이 클래스에 대한 직렬화 함수 바디를 자동으로 생성합니다.
MessageBase에서 파생된 ErrorMessage 클래스도 있습니다. 이 클래스는 클라이언트와 서버의 오류 콜백에 전달됩니다.
ErrorMessage 클래스의 errorCode는 Networking.NetworkError 열거형에 대응합니다.
class MyClient
{
    NetworkClient client;
    
    void Start()
    {
        client = new NetworkClient();
        client.RegisterHandler(MsgType.Error, OnError);
    }
    
    void OnError(NetworkMessage netMsg)
    {
        var errorMsg = netMsg.ReadMessage<ErrorMessage>();
        Debug.Log("Error:" + errorMsg.errorCode);
    }
}