1월 12, 2016

유니티 5 네트워킹 시스템 HLAPI를 사용하여 LAN 멀티플레이 기본 틀 만들기 - 2

전 편에서 서버와 클라이언트의 연결까지 되었으니,
이제 서로 메시지를 주고받는 기능을 넣어보겠습니다.

메시지를 보내기 위해서는 메시지의 '타입''자료형'
두가지에 대한 정의가 필요합니다.
간단한 정수나, 문자열, 구조체 등등 보내고 싶은 걸 보냅시다.
저는 간단하게 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

댓글 없음:

댓글 쓰기

댓글