반응형

네트워크 매니저(Network Manager)


이전 섹션들에서는 유니티 네트워크에서 오브젝트를 스폰하는 법, 원격 액션을 주고 받는 법과 멤버 변수의 값을 동기화하는 SyncVar의 사용법에 대해서 알아보았고, 그 와중에 사용되는 네트워크 매니저는 기본적인 네트워크 매니저를 사용하고, 서버 열기와 클라이언트의 연결을 간단히 하기 위해서 유니티 네트워크에서 기본적으로 제공하는 Network Manager HUD를 사용해왔다.


유넷에서 제공하는 기본 네크워크 매니저와 네트워크 매니저 HUD


이렇게 기본적으로 제공되는 매니저와 HUD는 매우 기본적인 유넷 서버 열기와 클라이언트의 접속 기능을 제공하고 간단한 UI를 통해 서버를 열고 클라이언트로서 서버에 접속하게 할 수 있게 해준다.


Network Manager HUD를 사용하고 게임을 플레이하면 이러한 UI들을 출력해서 손쉽게 서버를 열고 접속할 수 있게 만들어준다.


기본적으로 제공되는 매니저와 HUD는 가볍고 손쉽게 유넷을 테스트할 수 있게 도와주지만, 게임 제작자의 경우, 간단한 테스트를 넘어서 자신이 원하는 기능을 구현하고자 할 것이다. 그렇기 때문에 이번 세션에서는 네트워크 매니저에서 서버와 호스트를 여는 기능과 열린 서버와 호스트에 클라이언트로서 접속하는 기능을 유니티 네트워크가 제공하는 HUD를 사용하지 않고 구현하는 방법을 알아볼 것이다.





네트워크 매니저에서 서버 & 호스트 열기와 클라이언트로 접속하는 기능의 구현


네트워크 매니저를 커스터마이즈하기 위해서는 우선 클래스를 하나 만들어서, Network Manager를 상속받아야 한다.


using UnityEngine.Networking;

public class CustomUNetManager : NetworkManager
{
}


우선은 간단하게 네트워크 매니저 HUD가 제공하는 기능을 직접 구현해보도록 하자.



유니티가 제공하는 기본 Ui를 이용해서 위의 이미지와 같이 버튼 세 개를 만들어 보자. 그리고 다음의 코드를 작성한 이후에 각 버튼과 매칭을 시켜주면 된다.


using UnityEngine.Networking;

public class CustomUNetManager : NetworkManager
{
    public void OpenServer()
    {
        StartServer();  
    }

    public void OpenHost()
    {
        StartHost();
    }

    public void ConnectClientToServer()
    {
        StartClient();
    }
}


위의 예시 코드에서 StartServer() 함수는 서버를 시작하는 것, StartHost() 함수는 호스트로서 서버와 클라이언트를 동시에 시작하는 것, StartClient() 함수는 클라이언트를 시작하고 서버에 연결하는 역할을 한다.


서버와 클라이언트, 호스트에 대한 설명은 유넷 튜토리얼 2번 섹션인 UNet Tutorial (2) - 간단한 개념에서 이야기했었다.


그 다음으로는 서버가 제대로 열리고 클라이언트가 제대로 접속되었는지 확인하기 위한 코드들을 작성해보자. 다음의 코드들은 CustomUNetManager 클래스 내에 작성되어야 한다.





public override void OnStartServer()
{
    base.OnStartServer();
    Debug.Log("[Server]Start Server");
}


StartServer() 함수를 호출해서 서버가 정상적으로 시작된 이후에 호출될 콜백 함수이다.


public override void OnStartHost()
{
    base.OnStartHost();
    Debug.Log("[Host]Start Host");
}


StartHost() 함수를 호출해서 호스트가 정상적으로 시작된 이후에 호출될 콜백 함수이다.


public override void OnStartClient(NetworkClient client)
{
    base.OnStartClient(client);
    Debug.Log("[Client]Start Client");
}


StartClient() 함수를 호출해서 클라이언트가 정상적으로 시작된 이후에 호출될 콜백 함수이다.





public override void OnServerConnect(NetworkConnection conn)
{
    base.OnServerConnect(conn);
    Debug.Log("[Client]Connect Server Sucess.");
}


서버에 클라이언트가 연결되었을 때, 서버에서 호출될 콜백 함수이다.


public override void OnClientConnect(NetworkConnection conn)
{
    base.OnClientConnect(conn);
    Debug.Log("[Server]Connected Client.");
}


서버에 클라이언트가 연결되었을 때, 클라이언트에서 호출될 콜백 함수이다.


네트워크 매니저에 포함된 콜백 함수들은 위의 5가지 이 외에도 여러 가지가 있지만, 이것에 대한 설명은 다른 섹션에서 진행할 것이다.


위의 코드를 모두 추가한 뒤에 빌드를 해서 서버나 호스트를 열고 클라이언트를 접속시켜보면 서버와 호스트, 클라이언트가 접속되는지 확인할 수 있을 것이다.


서버를 열고 클라이언트를 접속시켰을 때의 로그



호스트를 열고 클라이언트를 접속시켰을 때의 로그


클라이언트가 서버나 호스트에 연결되었을 때의 로그





서버 주소와 포트 설정하기


위의 예시에서는 같은 컴퓨터에 열린 로컬 서버에 클라이언트가 접속했다. 하지만 실제의 네트워크 게임에서는 서버와 클라이언트가 실행되는 컴퓨터가 다르기 때문에, 접속하고자 하는 서버의 IP와 Port를 지정해주어야 한다. 이번에는 사용자로부터 서버의 IP 주소와 Port를 입력받기 위한 Input Field를 만들어보자.



Input Field를 모두 추가한 이후에 아래와 같이 코드를 수정하고 Input Field들을 넣어주면 된다.


using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;

public class CustomUNetManager : NetworkManager
{
    [SerializeField]
    InputField ipInputField;
    [SerializeField]
    InputField portInputField;

    public void OpenServer()
    {
        networkPort = int.Parse(portInputField.text);

        StartServer();  
    }

    public void OpenHost()
    {
        networkPort = int.Parse(portInputField.text);

        StartHost();
    }

    public void ConnectClientToServer()
    {
        networkAddress = ipInputField.text;
        networkPort = int.Parse(portInputField.text);

        StartClient();
    }

}



네트워크 매니저 테스트를 위한 예제는 아래의 첨부파일을 통해 받아볼 수 있다.

NetworkManagerTest.unitypackage


반응형
  1. unity초보 2018.07.17 22:58

    좋은 글 감사히 보고갑니다.
    제가 궁금한게 생겼는데 유니티상에서 지원하는 네트워크 기능을 사용해서 서버랑 클라이언트 네트워크 통신을 했는데 이경우 서버의 컴퓨터를 끄면 클라이언트가 닫히는 문제점이 있어서 서버를 웹에 올려놓고 쓰는 방법을 알고싶습니다

    • 2018.07.18 10:24

      비밀댓글입니다

+ Recent posts