NetworkManager
NetworkManager는 멀티플레이어 게임의 네트워킹 요소를 관리하는 컴포넌트입니다. 여러 유용한 기능들을 하나의 장소에 통합하여, 멀티플레이어 게임의 생성, 실행을 최대한 간단하게 만들어줍니다.
NetworkManager의 주요 기능은 다음과 같습니다:
- 게임 상태 관리
- 스폰 관리
- 씬 관리
각 씬에는 하나의 활성화된 NetworkManager만 존재할 수 있습니다(싱글톤). NetworkIdentity 컴포넌트가 있는 네트워크 게임 오브젝트에는 NetworkManager 컴포넌트를 배치하지 마세요. 씬 로드 시 이러한 오브젝트가 비활성화되기 때문입니다.
게임 상태 관리하기
네트워크 멀티플레이어 게임은 다음과 같은 세 가지 모드로 실행될 수 있습니다:
- 클라이언트: 호스트나 서버에 접속하는 일반 플레이어 모드
- 전용 서버: 게임을 호스팅하는 서버 전용 모드
- 호스트: 클라이언트와 서버를 동시에 실행하는 모드
시작 메서드
자체 UI를 구현할 때는 다음 메서드들을 사용하여 각 모드를 시작할 수 있습니다:
- StartClient: 클라이언트 모드로 시작
- StartServer: 전용 서버 모드로 시작
- StartHost: 호스트 모드로 시작
월드 서비스 연결하기
월드 서비스에 연결하기 위해서는 NetworkManager의 Use Cloud
변수를 반드시 true
로 설정해야 합니다.
스폰 관리하기
NetworkManager를 사용하여 프리팹에서 네트워크 게임 오브젝트의 스폰(네트워크 인스턴스화)을 관리할 수 있습니다.
대부분의 게임에는 플레이어를 나타내는 프리팹이 있으므로, NetworkManager에는 Player Prefab 슬롯이 있습니다. 이 슬롯에 플레이어 프리팹을 할당해야 합니다. 플레이어 프리팹이 설정되면 게임의 각 사용자에 대해 해당 프리팹에서 플레이어 게임 오브젝트가 자동으로 생성됩니다. 이는 호스트 서버의 로컬 플레이어와 원격 클라이언트의 원격 플레이어 모두에 적용됩니다.
Player Prefab을 이 필드에 할당하기 전에 NetworkIdentity 컴포넌트를 추가해야 합니다.
플레이어 프리팹을 할당한 후:
- 호스트로 게임을 시작하면 플레이어 게임 오브젝트가 생성됩니다.
- 게임을 중지하면 플레이어 게임 오브젝트가 제거됩니다.
- 다른 게임 클라이언트를 localhost에 연결하면 새로운 플레이어 게임 오브젝트가 생성됩니다.
- 클라이언트를 중지하면 해당 플레이어의 게임 오브젝트가 제거됩니다.
시작 위치 설정하기
NetworkManager는 기본적으로 정의된 transform 위치와 회전값에서 Player Prefab을 생성합니다. Player Spawn Method 속성을 사용하여 NetworkStartPosition 컴포넌트와 함께 시작 위치 선택 방법을 제어할 수 있습니다.
- Random: 임의로 선택된 startPosition에서 플레이어 생성
- Round Robin: 정해진 목록에서 순차적으로 startPosition 선택
커스텀 시작 위치가 필요한 경우:
- NetworkManager.startPositions 목록을 통해 사용 가능한 NetworkStart Position 컴포넌트에 접근할 수 있습니다.
- NetworkManager의 GetStartPosition 헬퍼 메서드를 OnServerAddPlayer 구현에서 사용하여 시작 위치를 찾을 수 있습니다.
씬 관리하기
대부분의 게임은 여러 씬으로 구성됩니다. NetworkManager는 멀티플레이어 게임에 적합한 방식으로 씬 상태와 씬 전환을 자동으로 관리하도록 설계되었습니다.
NetworkManager 인스펙터에는 두 개의 씬 슬롯이 있습니다:
- Offline Scene
- Online Scene
이 슬롯에 씬 에셋을 할당하면 네트워크 씬 관리가 활성화됩니다.
씬 관리 동작:
- 서버나 호스트가 시작되면 Online Scene이 로드됩니다.
- 이 씬이 현재 네트워크 씬이 됩니다.
- 서버에 연결하는 모든 클라이언트는 이 씬을 로드하도록 지시받습니다.
- 이 씬의 이름은 networkSceneName 속성에 저장됩니다.
- 네트워크가 중지되면(서버/호스트 중지 또는 클라이언트 연결 해제) Offline Scene이 로드됩니다.
게임이 활성화된 상태에서 ServerChangeScene을 호출하여 씬을 변경할 수 있습니다:
- 현재 연결된 모든 클라이언트의 씬이 변경됩니다.
- networkSceneName이 업데이트되어 새 클라이언트도 새 씬을 로드합니다.
- 씬 변경 시 이전 씬의 모든 게임 오브젝트가 제거됩니다.
- NetworkManager는 씬 간에 유지되어야 합니다. 그렇지 않으면 씬 변경 시 네트워크 연결이 끊어집니다.
- 이를 위해 인스펙터에서 Don't Destroy On Load 체크박스를 활성화하세요.