Skip to main content
Version: 0.2.0

커스텀 메시지

SyncVar, Command, RPC 외에 직접 네트워크 메시지를 정의할 수 있습니다. 플레이어 스폰 전 캐릭터 생성, 로비 통신 등에 활용합니다.

예시: 캐릭터 생성

1. 메시지 정의

public struct CreateCharacterMessage : NetworkMessage
{
public string characterName;
public int classId;
}

2. 서버 - NetworkManager에서 처리

public class GameNetworkManager : NetworkManager
{
[Header("직업별 프리팹")]
public GameObject warriorPrefab;
public GameObject magePrefab;
public GameObject archerPrefab;

// 클라이언트별 캐릭터 정보 저장
private Dictionary<NetworkConnection, CreateCharacterMessage> pendingCharacters = new Dictionary<NetworkConnection, CreateCharacterMessage>();

public override void OnStartServer()
{
base.OnStartServer();
NetworkServer.RegisterHandler<CreateCharacterMessage>(OnCreateCharacter);
}

void OnCreateCharacter(NetworkConnectionToClient conn, CreateCharacterMessage msg)
{
// 캐릭터 정보 저장 후 플레이어 스폰 요청
pendingCharacters[conn] = msg;
NetworkServer.AddPlayerForConnection(conn, null);
}

public override void OnServerAddPlayer(NetworkConnectionToClient conn)
{
if (!pendingCharacters.TryGetValue(conn, out var charData))
{
base.OnServerAddPlayer(conn);
return;
}

// 직업별 프리팹 선택
GameObject prefab = charData.classId switch
{
1 => warriorPrefab,
2 => magePrefab,
3 => archerPrefab,
_ => playerPrefab
};

Transform startPos = GetStartPosition();
GameObject player = Instantiate(prefab, startPos.position, startPos.rotation);
player.GetComponent<Player>().playerName = charData.characterName;

NetworkServer.AddPlayerForConnection(conn, player);
pendingCharacters.Remove(conn);
}
}

3. 클라이언트 - 캐릭터 생성 UI

public class CharacterCreateUI : MonoBehaviour
{
public void OnCreateButtonClick(string name, int classId)
{
var msg = new CreateCharacterMessage
{
characterName = name,
classId = classId
};
NetworkClient.Send(msg);
}
}

서버 → 클라이언트 전송

// 메시지 정의
public struct GameResultMessage : NetworkMessage
{
public bool isWin;
public int score;
}

// 클라이언트: 핸들러 등록
void Start()
{
NetworkClient.RegisterHandler<GameResultMessage>(OnGameResult);
}

void OnGameResult(GameResultMessage msg)
{
Debug.Log($"결과: {(msg.isWin ? "승리" : "패배")}, 점수: {msg.score}");
}

// 서버: 특정 클라이언트에게 전송
[Server]
void SendResult(NetworkConnectionToClient conn, bool win, int score)
{
conn.Send(new GameResultMessage { isWin = win, score = score });
}

지원 타입

네트워크 메시지 필드에 사용할 수 있는 타입은 다음과 같습니다.

분류타입 목록
기본 타입byte, sbyte, short, ushort, int, uint, long, ulong, float, double, decimal, bool, char, string
Unity 타입Vector2, Vector3, Vector4, Quaternion, Color, Color32, Rect, Plane, Ray
네트워크 타입NetworkIdentity, GameObject, NetworkBehaviour