1월 19, 2016

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


마지막 장입니다!
1 편에서 예고했던 대로, 동일한 네트워크 내에 존재하는 서버나, 클라이언트를 인식하고, 연결하는 것을 해보겠습니다.
예를 들어, 게임에 접속해서 방을 만들고, 접속한 유저들이 자동으로 뜨는 목록을 보고 싶다거나 할 때 유용하게 쓰일 것 같습니다.
다행히도, HLAPI 의 NetworkDiscovery 컴퍼넌트를 사용해서 이를 쉽게 구현해볼 수 있습니다.

이 컴퍼넌트는 전송 계층의 UDP Broadcasting 기능을 사용하며, 따라서 인터넷에서 작동하는 것이라 오로지 LAN 상에서만 사용할 수 있습니다.
컨셉은 단순히 특정 포트번호로 '방송'을 송신하는 개체와 수신하는 개체 두 가지가 있고, 방송을 수신하였을 때 이벤트를 받아서 송신한 개체의 IP에 접속하는 것입니다.(송신할 때 IP 주소나 기타 데이터를 를 같이 내보냅니다.)

역시나, NetworkManager 와 같이 빈 오브젝트에 NetworkDIscovery 컴퍼넌트를 추가하면 됩니다만,
우리는 기본 제공 GUI 를 사용하지 않고 커스텀하기 위해 코드를 조금 더 쳐 보겠습니다.
앞서 작성한 MyNetManager 를 불러와, 다음 노랗게 색칠한 코드 한 줄을 추가합니다.



 











다음은 서버와 클라이언트로 구동을 시작하는 SetupServer, SetupClient 메서드에 각각 
UDP 브로드캐스팅을 시작하는 명령을 넣습니다.
공통으로 Initialize() 를 실행하여 컴퍼넌트를 초기화 한 뒤,
서버에서는 StartAsServer( ), 클라이언트에서는 StartAsClient( ) 를 각각 실행하면
이제 동일한 네트워크 내의 유니티 게임들이 서로를 인식하게 됩니다.






























하지만 이대로 실행하면 인식을 했는지 전혀 알 수가 없겠죠??

클라이언트에서 방송을 수신했을 때 발생하는 이벤트를 가로채서 처리를 해야 합니다.

빈 게임오브젝트를 생성하고 이름을 'Broadcaster'로 변경하고, 다음 C# Script 를 새로 생성하여 붙입니다.

// MyNetworkDiscovery.cs


using UnityEngine;
using System.Collections;
using UnityEngine.Networking;

public class MyNetworkDiscovery : NetworkDiscovery
{

    public override void OnReceivedBroadcast(string fromAddress, string data)
    {
        //서버로부터 브로드캐스트 메시지를 받았을 때 실행됩니다.
        base.OnReceivedBroadcast(fromAddress, data);
        Debug.Log("recived broadcast from : " + fromAddress);

        StartCoroutine("TweenAnim");
    }
}

그리고 NetworkManager 컴퍼넌트의 인스펙터창에서 빈 칸으로 되어있는
NetworkDiscovery 에 Broadcaster 를 다음과 같이 끌어다 놓습니다.











































NetworkDiscovery 로 부터 상속받은 OnReceivedBroadcast 메서드는 fromAddress 에 
브로드캐스트 메시지를 송신한 개체의 IP 주소, 함께 보낸 data 를 인자로 받습니다.
IP 주소 같은 경우, 게임 내에서 빈번하게 쓰일 것이므로 위 콜백에

   NetworkManager.singleton.networkAddress = fromAddress;

코드를 추가하여 네트워크 매니저 싱글턴이 IP 주소를 저장하도록 할 수도 있습니다.

이제 두 모바일 기기를 같은 와이파이로 접속시킨 후, 각각을 서버와 클라이언트로 구동하여,
클라이언트에서는 OnReceivedBroadcast 콜백에서 라벨을 띄워준다거나, 어떤 표시를 하여 송수신이 이루어졌는지 확인해봅시다.

다음 동영상은 서버로부터 메시지를 수신하면 라벨에 트윈 애니메이션을 적용시켜 수신하였음을 알려주는 시연 동영상입니다.



완성된 코드는 다음 저장소에서 다운 받으실 수 있습니다.


지금까지 유니티5의 HLAPI 를 사용해 네트워크 객체를 서로 연결하고, 네트워크 메시지를 수신할 수 있는 기본적인 기능을 구현하는 법을 알아보았습니다.
읽어주셔서 감사드리고, 많은 도움이 됬으면 좋겠습니다^^

댓글 없음:

댓글 쓰기

댓글