Mirror Networking

[Mirror Networking] Network Message란?

오락쟁이의 블로그 2025. 1. 10. 15:47
목차
1. Network Message란?
2. Network Message 사용법
 2-1. NetworkMessage를 상속하는 구조체 혹은 클래스를 생성
 2-2. 서버나 클라이언트에서 메시지를 등록
 2-3. 메시지에 데이터를 담고 메시지를 발송
 2-4. 통합

 

Network Message란?

Network Message는 Mirror Networking에서 클라이언트와 서버 간 데이터를 전송하기 위한 기본 단위입니다. 이를 통해 게임의 네트워크 시스템에서 특정 데이터를 주고받을 수 있습니다. 예를 들어, 플레이어의 입력, 상태 정보, 또는 게임 이벤트를 전달하는 데 사용됩니다.

 

Network Message 사용법

1. NetworkMessage를 상속하는 구조체 혹은 클래스를 생성

메시지 크기가 작고, 가비지 컬렉션에 가해지는 부하가 적은 구조체를 사용하시는 것을 권장드립니다.

using Mirror;
using UnityEngine;
using System;

public struct MyNetworkMessage : NetworkMessage
{
    public int i;
    public string str;
}

2. 서버나 클라이언트에서 메시지를 등록

NetworkServer나 NetworkClient에서 RegisterHandler 혹은 ReplaceHandler를 사용해서 메시지를 등록합니다. 메시지를 등록할 때는 메시지를 수신했을 때 메시지를 처리할 핸들러도 등록해야 합니다.

서버에서 핸들러를 등록할 때는 NetworkConnection과 수신할 메시지를 매개변수로 설정해야 합니다.

클라이언트에서 핸들러를 등록할 때는 수신할 메시지를 매개변수로 설정해야 합니다. 

using Mirror;
using UnityEngine;
using System;

public class MyNetworkClass : NetworkBehaviour
{
    int myInt = 0;
    string myStr = String.Empty;
    
    public override void OnStartServer()
    {
        base.OnStartServer();
        
        // 서버에서 MyNetworkMessage를 수신 받을 경우 ReceiveMyNetworkMessageInServer를 호출
        // RegisterHandler: 기존 핸들러가 없을 때만 작동하며, 중복 등록을 시도하면 오류가 발생
        NetworkServer.RegisterHandler<MyNetworkMessage>(ReceiveInServer);
    }

    public override void OnStartClient()
    {
        base.OnStartClient();
        
        // 클라이언트에서 MyNetworkMessage를 수신 받을 경우 ReceiveMyNetworkMessageInClient를 호출
        // ReplaceHandler: 기존 핸들러가 있든 없든 상관없이 무조건 새로운 핸들러로 설정
        NetworkClient.ReplaceHandler<MyNetworkMessage>(ReceiveInClient);
    }
    
    private void ReceiveInServer(NetworkConnection conn, MyNetworkMessage message) 
    {
        // 메시지를 처리할 코드
        i = message.i;
    }
    
    private void ReceiveInClient(MyNetworkMessage message) 
    {
        // 메시지를 처리할 코드
        myStr = message.str;
    }
    
    public struct MyNetworkMessage : NetworkMessage
    {
        public int i;
        public string str;
    }
}

3. 메시지에 데이터를 담고 메시지를 발송

서버에서 클라이언트에게 메시지를 발송: 특정 NetworkConnection.Send(메시지);

클라이언트에서 서버에게 메시지를 발송: NetworkClient.Send(메시지);

using Mirror;
using UnityEngine;
using System;

public class MyNetworkClass : NetworkBehaviour
{
    private void SendServerToClient(NetworkConnection conn, int newInt, string newStr)
    {
        message = new MyNetworkMessage
        {
            i = newInt,
            str = newStr
        };
        
        conn.Send(message);
    }
    
    private void SendClientToServer(int newInt, string newStr)
    {
        message = new MyNetworkMessage
        {
            i = newInt,
            str = newStr
        };
        
        NetworkClient.Send(message);
    }
    
    public struct MyNetworkMessage : NetworkMessage
    {
        public int i;
        public string str;
    }
}

4. 통합

using Mirror;
using UnityEngine;
using System;

public class MyNetworkClass : NetworkBehaviour
{
    int myInt = 0;
    string myStr = String.Empty;
    
    public override void OnStartServer()
    {
        base.OnStartServer();
        
        // 서버에서 MyNetworkMessage를 수신 받을 경우 ReceiveMyNetworkMessageInServer를 호출
        // RegisterHandler: 기존 핸들러가 없을 때만 작동하며, 중복 등록을 시도하면 오류가 발생
        NetworkServer.RegisterHandler<MyNetworkMessage>(ReceiveInServer);
    }

    public override void OnStartClient()
    {
        base.OnStartClient();
        
        // 클라이언트에서 MyNetworkMessage를 수신 받을 경우 ReceiveMyNetworkMessageInClient를 호출
        // ReplaceHandler: 기존 핸들러가 있든 없든 상관없이 무조건 새로운 핸들러로 설정
        NetworkClient.ReplaceHandler<MyNetworkMessage>(ReceiveInClient);
    }
    
    private void ReceiveInServer(NetworkConnection conn, MyNetworkMessage message) 
    {
        // 메시지를 처리할 코드
        i = message.i;
    }
    
    private void ReceiveInClient(MyNetworkMessage message) 
    {
        // 메시지를 처리할 코드
        myStr = message.str;
    }
    
    private void SendServerToClient(NetworkConnection conn, int newInt, string newStr)
    {
        message = new MyNetworkMessage
        {
            i = newInt,
            str = newStr
        };
        
        conn.Send(message);
    }
    
    private void SendClientToServer(int newInt, string newStr)
    {
        message = new MyNetworkMessage
        {
            i = newInt,
            str = newStr
        };
        
        NetworkClient.Send(message);
    }
    
    public struct MyNetworkMessage : NetworkMessage
    {
        public int i;
        public string str;
    }
}