참고: UNet은 지원이 중단되었으며 향후 Unity에서 삭제될 예정입니다. 현재 새로운 시스템이 개발 중입니다. 자세한 내용과 다음 단계는 이 블로그 포스트를 참조하십시오. |
이 페이지에서는 멀티플레이어 프로젝트를 설정할 때 필요한 가장 기본적이고 일반적인 사항에 대해 간략히 설명합니다. 다음과 같은 항목이 프로젝트에 필요합니다.
네트워크 관리자
사용자 인터페이스(플레이어가 게임을 찾아 참가하도록 지원)
네트워크로 연결된 플레이어 프리팹(플레이어가 제어하도록 지원)
멀티플레이어 인식 스크립트 및 게임 오브젝트
이 리스트에는 변수가 나와 있습니다. 예를 들어, 멀티플레이어 체스 게임 또는 실시간 전략(RTS) 게임에서는 플레이어를 나타낼 가시적인 게임 오브젝트가 필요하지 않습니다. 하지만 플레이어를 나타낼 눈에 보이지 않는 빈 게임 오브젝트가 필요할 수 있으며, 스크립트를 여기에 연결해야 합니다. 이는 플레이어가 수행할 수 있는 동작과 관련됩니다.
이 도입부 페이지에는 위에 나열된 각 항목에 대한 짧은 설명이 나와 있습니다. 하지만 각 섹션은 더 상세한 문서와 연결되므로, 계속 읽어나가며 완전히 이해할 수 있습니다.
또한 게임을 빌드할 때 이해하고 선택해야 할 중요한 개념도 있습니다. 이러한 개념은 크게 다음과 같이 요약할 수 있습니다.
클라이언트, 서버 및 호스트 간의 관계
게임 오브젝트 및 액션에 대한 권한 개념
이러한 개념에 대한 자세한 내용은 네트워크 시스템 개념에 대한 문서를 참조하십시오.
Network Manager는 멀티플레이어 게임의 네트워크 요소를 관리합니다. 한 번에 하나의 Network Manager만 씬에서 활성화되어 있어야 합니다.
Unity의 빌트인 Network Manager 컴포넌트는 멀티플레이어 게임을 관리하는 데 필요한 모든 기능을 단일 컴포넌트에 담았습니다. 이 컴포넌트가 제공하지 않는 커스텀 요구 사항이 있는 경우 이 컴포넌트를 사용하는 대신 고유한 Network Manager를 스크립트로 작성할 수 있습니다. 멀티플레이어 게임을 막 시작하는 경우에는 이 컴포넌트를 사용하십시오.
자세한 내용은 Network Manager 관련 문서를 참조하십시오.
거의 대부분의 멀티플레이어 게임이 플레이어들에게 게임 “인스턴스”(일명 “매치”)를 발견하고, 생성하고, 참가할 수 있는 방법을 제공합니다. 이러한 게임 요소는 일반적으로 “로비”라고 부르며, 때때로 채팅 같은 추가 기능을 제공합니다.
Unity는 NetworkManagerHUD라고 하는 매우 기본적인 빌트인 버전의 인터페이스를 제공합니다. 이 인터페이스를 사용하면 고유 UI를 구현하지 않고도 매치를 생성하고 게임을 테스트할 수 있기 때문에 게임 제작 초기 단계에서 매우 유용합니다. 하지만 아주 기본적인 기능 및 시각 디자인 요소만을 제공하기 때문에 프로젝트를 마치기 전에 고유 UI로 대체해야 합니다.
자세한 내용은 Network Manager HUD에 대한 문서를 참조하십시오.
대부분의 멀티플레이어 게임에는 캐릭터 또는 차량과 같이 플레이어가 제어할 수 있는 오브젝트가 포함되어 있습니다. 체스, 실시간 전략 게임 같은 일부 멀티플레이어 게임의 경우에는 눈에 보이는 단일 “플레이어 오브젝트”가 없는 대신, 플레이어가 많은 유닛과 아이템을 조종할 수 있습니다. 캔버스 공유 그림 그리기 게임처럼 구체적인 오브젝트가 아예 없는 경우도 있습니다. 하지만 이 모든 상황에서 대개 게임에서 플레이어를 개념적으로 나타내는 게임 오브젝트를 만들어야 합니다. 이 게임 오브젝트를 프리팹으로 만든 후 모든 스크립트를 여기에 연결하십시오. 이 스크립트가 게임에서 플레이어가 수행할 수 있는 동작을 제어합니다.
Unity의 Network Manager 컴포넌트를 사용하는 경우(위의 Network Manager 참조) 프리팹을 Player Prefab 필드에 할당하십시오.
게임이 실행 중일 때 Network Manager는 매치에 연결되는 각 플레이어에 대해 플레이어 프리팹의 복사본(“인스턴스”)을 생성합니다.
하지만 이 부분에서 많은 멀티플레이어 프로그래밍 입문자들이 혼란을 겪습니다. 플레이어 프리팹 인스턴스의 스크립트는 인스턴스를 제어하는 플레이어가 호스트 컴퓨터(게임을 관리하는 컴퓨터) 또는 클라이언트 컴퓨터(게임을 관리하는 컴퓨터와 다른 컴퓨터)를 사용하고 있는지 인식하고 있어야 합니다.
이는 두 가지 상황이 동시에 발생하기 때문입니다.
멀티플레이어 게임을 위한 스크립트 작성은 싱글플레이어 게임을 위한 스크립트 작성과 다릅니다. 멀티플레이어 게임을 위한 스크립트를 작성할 때는 스크립트가 실행되는 다양한 컨텍스트를 고려해야 합니다. 여기에서 논의되는 네트워킹 개념에 대한 자세한 내용은 네트워크 시스템 개념에 대한 문서를 참조하십시오.
예를 들어, 플레이어 프리팹에 배치하는 스크립트는 “소유자”가 해당 플레이어 인스턴스를 제어할 수 있도록 허용해야 합니다. 하지만 다른 사람들은 제어하도록 허용하면 안 됩니다.
서버 또는 클라이언트가 스크립트 동작에 대한 권한을 보유하는지를 고려해야 합니다. 때때로 서버와 클라이언트 모두에서 스크립트가 실행되도록 해야 할 수 있습니다. 다른 경우에는 스크립트가 서버에서만 실행되고, 클라이언트가 게임 오브젝트가 움직이는 방식을 모방하도록 해야 할 수 있습니다. 예를 들어, 플레이어가 수집 가능 게임 오브젝트를 수집하는 게임에서 스크립트는 서버에서만 실행되어야 하며, 그래야만 서버가 수집된 게임 오브젝트 수에 대한 권한을 가질 수 있습니다.
스크립트 동작에 따라 각 상황에서 활성화할 스크립트 요소를 결정해야 합니다.
플레이어 게임 오브젝트의 경우 각 플레이어는 대개 자신의 플레이어 인스턴스에 대한 액티브 권한을 보유합니다. 즉, 각 클라이언트가 자체 플레이어에 대한 로컬 권한을 가지고, 서버는 클라이언트가 알려주는 플레이어 동작을 수락합니다.
논플레이어 게임 오브젝트의 경우 대개 서버는 일어나는 상황(예: 아이템이 수집되었는지 여부)에 대한 권한을 보유하고, 모든 클라이언트는 서버가 알려준 해당 게임 오브젝트에 일어난 상황을 수락합니다.