이제 서로 메시지를 주고받는 기능을 넣어보겠습니다.
메시지를 보내기 위해서는 메시지의 '타입'과 '자료형'
두가지에 대한 정의가 필요합니다.
간단한 정수나, 문자열, 구조체 등등 보내고 싶은 걸 보냅시다.
저는 간단하게 int 형 변수 하나만 보내보겠습니다.
<자료형>
public class MyMessage : MessageBase
{
public int number;
}
메시지클래스는 MessageBase 기반 클래스를 상속받아 작성해야 합니다. 규칙입니다.<타입>
public class MyMsgType {
public static short CustomMsgType= MsgType.Highest + 1;
};
Msgtype 은 정의를 보면 아래와 같이 여러 네트워크 상황에 대한 상수를 정의해놓고 있습니다. Highest 가 46 으로 가장 높은 값을 가지므로 1을 더한 사용자정의 메시지타입을 정의하였습니다.다음으로 메시지를 수신하였을 때 호출할 콜백을 정의하고, 등록합니다.
<콜백 정의>
public void OnMessage(NetworkMessage netMsg)
{
MyMessage msg = netMsg.ReadMessage<MyMessage>();
Debug.Log("OnScoreMessage " + msg.number);
}
<콜백 등록>
public void SetupServer()
{
Debug.Log("SetupServer()");
StartServer();
NetworkServer.Listen(4444);
NetworkServer.RegisterHandler( MyMsgType.CustomMsgType, OnMessage); // 서버측에서 콜백을 등록하는 부분입니다.
}
전 편에서 서버를 셋업하는 코드에 콜백을 등록하는 한 줄만 추가했습니다.
이렇게 하면 서버에서는 클라이언트가 MyMsgType.CustomMsgType(47) 형 메시지를 보낸 것을 감지하면 OnMessage 콜백을 호출하게 되고,
NetworkMessage 타입 변수를 인자로 받아 메시지의 내용, 보낸 개체의 ip 등등 포함된 정보를 확인할 수 있습니다.
반대로 클라이언트에서 콜백을 등록하려면, NetworkClient 클래스에도 동일한 RegisterHandler 메서드가 있으므로 myClient.RegisterHandler 와 같이 사용하시면 됩니다.
그럼 마지막으로 제일 중요한 메시지를 보내는 부분을 작성하면 되겠네요.
<클라이언트에서 서버로 메시지 송신>
public void SendMessage(int number)
{
MyMessage msg = new MyMessage();
msg.number = number;
myClient.Send( MyMsgType.CustomMsgType, msg);
}
서버에서 보낼 때는 NetworkServer.Send , NetworkServer.SendToAll 와 같이 작성하면 됩니다.
코드를 다 작성하였으니 GUI 를 구성하고, Client 버튼에 SetupClient()를, Server 버튼에 SetupServer()를, Send 버튼은 SendMessage(int number) 에 각각 이벤트를 연결 시킵니다.
빌드 후 따로 실행시킨 프로그램은 클라이언트로,
에디터에서는 서버로 각각 접속한 후, 클라이언트에서 Send 버튼을 눌러봅시다.
참조 :
http://docs.unity3d.com/kr/current/Manual/UNetMessages.html
http://docs.unity3d.com/ScriptReference/Networking.NetworkClient.Send.html
댓글 없음:
댓글 쓰기
댓글