반응형

클라이언트의 준비(Client Ready)


지난 섹션에서는 전반적인 네트워크 매니저 콜백에 대해서 알아보았다. 이번 섹션에서는 네트워크 과정 중에 하나인 클라이언트의 준비에 대해서 알아보자. 클라이언트의 준비란 서버에 접속한 클라이언트가 준비가 되었음을 알리는 과정인데, 유넷에서는 클라이언트 측에서 ClientScene.Ready() 함수를 호출함으로써 클라이언트가 서버에 동기화될 준비가 끝났음을 알린다.


이러한 클라이언트의 준비라는 과정을 네트워크 매니저 콜백 섹션에서 이야기하지 않고 별도의 섹션을 따로 만들어 이야기하는 것은 유넷에서의 클라이언트 준비라는 것이 상당히 중요한 역할을 하기 때문이다.





클라이언트 준비의 역할과 의미


지난 섹션 중 UNet Tutorial (7) - 오브젝트 스폰(Object Spawn) 의 내용 중에 다음과 같은 내용이 있다.


"스폰된 오브젝트는 유니티 네트워크의 스포닝 시스템이 관리하게 되며, 스포닝 시스템에 속하게 된 오브젝트가 서버에서 변화가 있으면 그것이 클라이언트에도 전송되고, 서버에서 오브젝트가 소멸하면 클라이언트에서도 소멸하게 된다. 그리고 스폰된 오브젝트는 서버가 관리하는 네트워크 오브젝트 집합에도 추가되기 때문에, 이후에 다른 클라이언트가 게임에 참여하더라도 프로그래머가 별도의 처리를 만들 필요없이 자동으로 오브젝트가 소환되고 동기화 되어야할 값들이 동기화된다."

스폰된 오브젝트는 유니티 네트워크의 스포닝 시스템이 관리하게 되며, 스포닝 시스템에 속하게 된 오브젝트가 서버에서 변화가 있으면 그것이 클라이언트에도 전송되고, 서버에서 오브젝트가 소멸하면 클라이언트에서도 소멸하게 된다. 그리고 스폰된 오브젝트는 서버가 관리하는 네트워크 오브젝트 집합에도 추가되기 때문에, 이후에 다른 클라이언트가 게임에 참여하더라도 프로그래머가 별도의 처리를 만들 필요없이 자동으로 오브젝트가 소환되고 동기화 되어야할 값들이 동기화된다.

출처: http://wergia.tistory.com/106?category=768883 [베르의 프로그래밍 노트]
스폰된 오브젝트는 유니티 네트워크의 스포닝 시스템이 관리하게 되며, 스포닝 시스템에 속하게 된 오브젝트가 서버에서 변화가 있으면 그것이 클라이언트에도 전송되고, 서버에서 오브젝트가 소멸하면 클라이언트에서도 소멸하게 된다. 그리고 스폰된 오브젝트는 서버가 관리하는 네트워크 오브젝트 집합에도 추가되기 때문에, 이후에 다른 클라이언트가 게임에 참여하더라도 프로그래머가 별도의 처리를 만들 필요없이 자동으로 오브젝트가 소환되고 동기화 되어야할 값들이 동기화된다.

출처: http://wergia.tistory.com/106?category=768883 [베르의 프로그래밍 노트]


위의 내용과 같이 네트워크를 통해서 스폰된 오브젝트는 유니티 네트워크의 스포닝 시스템이 관리하며, 게임 중에 다른 클라이언트가 참가하거나 게임 중에 접속이 끊어졌다가 재접속하는 유저에게 별도의 처리 없이 오브젝트나 값이 동기화 되는데, 바로 이 동기화 시작의 기준이 클라이언트의 준비 상태다.


즉, 클라이언트가 준비를 끝마친 후에야 네트워크 오브젝트들의 동기화가 시작된다. 거기에 지난 섹션들에서 언급한 SyncVar와 Hook, Command와 ClientRpc 역시 클라이언트 준비 이후에만 동기화 되고 원격 액션을 주고 받을 수 있게 된다. 이 말인 즉슨, SyncVar나 Command, ClientRpc로 게임을 준비하기 위한 초기화를 진행하려고 해서는 안된다는 것이다. 게임이 시작되기 전에 필요한 초기화를 SyncVar, Command, ClientRpc로 할 경우, 처음 접속은 올바르게 될 수도 있지만 재접속이나 게임 진행중에 접속하는 경우에 심각한 문제를 초래할 수 있다.


게임의 초기화를 위한 작업은 클라이언트의 네트워크가 준비되기 이전에 하는 것이 옳다. 원격 액션을 보내는 Command나 ClientRpc는 클라이언트가 준비된 이후에나 가능한데 그렇다면 클라이언트가 준비되기 이전에는 어떻게 통신해야 하는가는 이 다음 섹션에서 설명할 네트워크 메시지를 사용하면 된다. 네트워크 메시지의 경우에는 클라이언트가 준비되었느냐를 따지지 않고 서버와 클라이언트가 연결만 되어 있으면 주고 받을 수 있기 때문이다.





원하는 시점에서 클라이언트 준비하기


지난 네트워크 매니저 콜백 섹션에서 가볍게 이야기 했듯이, 유넷의 기본 네트워크 매니저에서는 클라이언트가 서버에 접속하면 별다른 처리 없이도 자동으로 ClientScene.Ready() 함수가 호출되어 클라이언트가 동기화될 준비가 끝났음을 서버에 알린다.


만약에 클라이언트가 서버에 접속하자마자 준비하는 것을 원하지 않고 일련의 다른 과정을 거친 후에 준비하기를 원한다면 다음과 별도의 처리가 필요하다.


public override void OnClientConnect(NetworkConnection conn)
{
    base.OnClientConnect(conn);
}


OnClientConnect 콜백을 커스텀 네트워크 매니저에서 오버라이드하면 위와 같이 코드가 작성되는데, 저기서 부모 클래스의 OnClientConnect를 호출하는 것을 볼 수 있다. 바로 이 부모 클래스의 OnClientConnect에서 ClientScene.Ready()와 ClientScene.AddPlayer()가 호출되기 때문에 클라이언트가 서버에 접속하자마자 자동으로 준비되는 것이다.


public override void OnClientConnect(NetworkConnection conn)
{
    //base.OnClientConnect(conn);
}


그렇기 때문에 서버에 접속하자 마자 클라이언트가 준비 신호를 보내고, 플레이어 객체를 생성하기를 원하지 않는다면 위의 코드 예시처럼 부모 클래스의 OnClientConnect()를 호출하는 라인을 주석처리하거나 삭제하고 아래의 예시 코드와 같이 개발자가 원하는 별도의 처리를 한 후에 ClientScene.Ready()와 ClientScene.AddPlayer()를 호출해주면 된다.


public override void OnClientConnect(NetworkConnection conn)
{
    //base.OnClientConnect(conn);

    /*
     * 개발자가 원하는 별도의 처리
     */

    ClientScene.Ready(client.connection);
    ClientScene.AddPlayer(0);
}



반응형
반응형

네트워크 매니저 콜백(Network Manager Callback)


지난 섹션에서는 유넷에서 제공하는 Network Manager HUD의 기능을 직접 구현해보았다. 그리고 그것을 테스트하는 중간에 네트워크 매니저가 보내는 콜백을 통해서 서버와 호스트, 클라이언트의 실행 여부와 접속 여부를 확인할 수 있었다. 네트워크 매니저 콜백은 그 외에도 유니티 네트워크가 지정한 특정한 상황을 알리고 그것에 대한 기본적인 처리를 하는 역할을 한다.


그 상황에 대한 기본적인 처리 외의 필요한 것은 콜백을 상속받아서 처리에 대한 코드를 직접 작성해주면 된다.


우선은 네트워크 매니저 콜백의 종류에 대해서 알아보자. 네트워크 매니저 콜백은 서버에서 호출되는 콜백, 클라이언트에서 호출되는 콜백, 호스트에서 호출되는 콜백, 이렇게 세 가지로 나눌 수 있다. 단, 호스트의 경우에는 서버와 클라이언트의 역할을 겸하기 때문에 호스트에서 호출되는 콜백 이외에도 서버 콜백과 클라이언트 콜백이 함께 호출된다.





서버 콜백(Server Callback)


public override void OnStartServer()


서버가 시작 되었을 때 호출되는 콜백이다.


public override void OnStopServer()


서버가 정지 되었을 때 호출되는 콜백이다.


public override void OnServerConnect(NetworkConnection conn)


서버에 새로운 클라이언트가 연결 되었을 때 호출되는 콜백이다. 매개변수로 새롭게 접속한 클라이언트의 Network Connection이 제공된다.


public override void OnServerReady(NetworkConnection conn)


서버에 접속한 클라이언트가 준비 되었을 때 호출되는 콜백이다. 매개변수로 준비된 클라이언트의 Network Connection이 제공된다.


public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)

public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId, NetworkReader extraMessageReader)


서버에 접속한 클라이언트가 ClientScene.AddPlayer() 함수를 호출해서 새 플레이어를 추가할 때, 호출되는 콜백이다. 이 콜백의 기본 처리는 네트워크 매니저에 등록된 playerPrefab을 이용해서 새 플레이어 객체를 소환한다. 매개변수를 통해서 플레이어를 생성한 클라이언트의 Network Connection과 새로 생성되는 플레이어 컨트롤러의 id, 클라이언트에서 보내는 추가적인 메시지가 전달된다.


public override void OnServerRemovePlayer(NetworkConnection conn, PlayerController player)


클라이언트가 플레이어를 제거할 때, 서버에서 호출되는 콜백이다. 이 콜백의 기본 처리는 해당 플레이어 객체를 파괴한다. 매개변수를 통해서 플레이어를 제거한 클라이언트의 Network Connection과 제거되는 플레이어 객체가 전달된다.


public override void OnServerDisconnect(NetworkConnection conn)


서버에 접속해있던 클라이언트가 연결이 끊어졌을 때 호출되는 콜백이다. 매개변수를 통해서 연결이 끊어진 클라이언트의 Network Connection이 전달된다.


public override void OnServerError(NetworkConnection conn, int errorCode)


클라이언트 연결에 대한 네트워크 오류가 발생하면 서버에서 호출되는 콜백이다. 매개변수를 통해서 문제가 발생한 클라이언트의 Network Connection과 에러 코드가 전달된다.


public override void OnServerSceneChanged(string sceneName)


씬 로드가 완료되거나, 서버에서 ServerChangeScene()로 씬 로드가 시작될 때 호출되는 콜백이다. 매개변수를 통해서 새롭게 로드되는 씬의 이름이 전달된다.





클라이언트 콜백(Client Callback)


public override void OnStartClient(NetworkClient client)


클라이언트가 시작할 때 호출되는 콜백이다. 매개변수를 통해서 네트워크 시스템에서 사용되는 네트워크 클라이언트 객체가 전달된다. 이 네트워크 클라이언트에는 네트워크 서버에 연결하는데 사용되는 Network Connection이 포함되어 있다. 이 콜백의 기본 처리는 매개변수로 전달받은 네트워크 클라이언트 객체를 NetworkManager.client 멤버 변수에 할당하는 역할을 주로한다. 이 client 멤버 변수를 이용해서 서버에 메시지를 보내거나 서버의 상태를 확인할 수 있다.


public override void OnStopClient()


클라이언트가 정지 되었을 때 호출되는 콜백이다.


public override void OnClientConnect(NetworkConnection conn)


클라이언트가 서버에 연결되었을 때 호출되는 콜백이다. 매개변수를 통해서 서버의 Network Connection이 전달된다. 그리고 이 콜백은 자기 자신의 클라이언트가 서버에 연결 되었을 때만 호출된다. 이 콜백의 기본 처리는 클라이언트를 준비(Ready) 시키고 플레이어를 추가(Adds a player)하는 작업을 한다. 만약 클라이언트가 서버에 연결되자마자 준비하고 플레이어를 추가하는 것을 원하지 않고 별도의 작업을 한 이후에 준비 하고 플레이어를 추가하길 원한다면 base.OnClientConnect()의 호출을 주석처리하거나 코드를 제거하는게 좋다.


public override void OnClientDisconnect(NetworkConnection conn)


서버와의 연결이 해제 되었을 때 호출되는 콜백이다. 매개변수를 통해서 서버의 Network Connection이 전달된다.


public override void OnClientError(NetworkConnection conn, int errorCode)


네트워크 오류가 발생했을 때 호출되는 콜백이다. 매개변수를 통해서 서버의 Networ kConnection과 에러 코드가 전달된다.


public override void OnClientNotReady(NetworkConnection conn)


서버에서 더 이상 클라이언트가 준비 상태가 아님을 알려왔을 때 호출되는 콜백이다. 매개변수를 통해서 서버의 Network Connection이 전달된다.


이 콜백은 주로 씬 전환에 사용된다.





호스트 콜백(Host Callback)


public override void OnStartHost()


호스트가 시작 되었을 때 호출되는 콜백이다.


public override void OnStopHost()


호스트가 정지 되었을 때 호출되는 콜백이다.


호스트 콜백의 경우에는 종류가 시작과 정지 두 가지 뿐이다. 호스트는 서버와 클라이언트를 겸하기 때문에 호스트 콜백과 더불어 서버 콜백과 클라이언트 콜백을 함께 호출한다.


네트워크 매니저에는 위에서 설명한 콜백 이외에도 몇 가지 콜백들이 더 있으나, 나머지 콜백들은 유니티 매치메이커에서 사용되는 콜백이기 때문에 이번 세션에서는 소개하지 않고 추후에 매치메이커 세션에서 설명하도록 하겠다.





콜백의 호출 순서


서버에 새로운 클라이언트가 연결되거나 연결이 끊어졌을 때 등, 여러가지 상황을 처리하는데 콜백은 유용하게 사용된다. 이러한 상황을 처리할 때에 순서가 중요한 경우가 많기 때문에 콜백의 호출 순서를 확인 해두는 것이 좋다.


서버 콜백의 호출 순서


1단계 : 서버 시작


- StartServer() 함수 호출

- OnStartServer

- OnServerSceneChanged


2단계 : 클라이언트 접속


- OnServerConnect

- OnServerReady

- OnServerAddPlayer


3단계 : 클라이언트 연결 해제


- OnServerDisconnect


4단계 : 서버 중지


- OnStopServer





클라이언트 콜백의 호출 순서


1단계 : 클라이언트 시작


- StartClient() 함수 호출

- OnStartClient

- OnClientConnect

- OnClientSceneChanged


2단계 : 서버 중지 or 클라이언트 중지


- OnStopClient

- OnClientDisconnect





호스트 콜백의 호출 순서


1단계 : 호스트 시작


- StartHost() 함수 호출

- OnStartHost

- OnStartServer

- ServerConnect

- OnStartClient

- OnClientConnect

- OnServerSceneChanged

- OnServerReady

- OnServerAddPlayer

- OnClientSceneChanged


2단계 : 클라이언트 접속


- OnServerConnect

- OnServerReady

- OnServerAddPlayer


3단계 : 클라이언트 연결 해제


- OnServerDisconnect


4단계 : 호스트 중지


- OnStopHost

- OnStopServer

- OnStopClient


앞에서 이야기 한 것과 같이 호스트는 서버와 클라이언트의 역할을 겸하기 때문에 서버의 콜백과 클라이언트의 콜백이 함께 호출된다.

반응형

+ Recent posts