Unity의 고수준 API(HLAPI) 시스템에서 멀티플레이어 게임은 다음을 포함합니다.
서버: 서버는 다른 모든 플레이어가 함께 플레이하고 싶을 때 연결하는 게임 인스턴스입니다. 서버는 종종 다양한 게임 활동(예: 점수 기록)을 관리하고 해당 데이터를 클라이언트에 다시 전송합니다.
클라이언트: 클라이언트는 일반적으로 여러 컴퓨터를 서버와 연결해 주는 게임 인스턴스입니다. 클라이언트는 로컬 네트워크 또는 온라인을 통해 연결할 수 있습니다.
클라이언트는 서버와 연결되는 게임 인스턴스이므로, 플레이어는 자신의 클라이언트에 연결된 다른 플레이어와 게임을 플레이할 수 있습니다.
서버는 “전용 서버” 또는 “호스트 서버”일 수 있습니다.
전용 서버: 서버로만 동작하는 게임 인스턴스입니다.
호스트 서버: 전용 서버가 없는 경우 클라이언트 중 하나가 서버 역할을 맡을 수도 있습니다. 이 클라이언트가 “호스트 서버”입니다. 호스트 서버는 서버와 클라이언트 모두로 동작하는 단일 게임 인스턴스(호스트)를 생성합니다.
아래 다이어그램은 멀티플레이어 게임을 플레이하는 세 명의 플레이어를 보여줍니다. 이 게임에서 하나의 클라이언트는 호스트 역할도 수행합니다. 다시 말해, 클라이언트 자체가 “로컬 클라이언트”입니다. 로컬 클라이언트는 호스트 서버에 연결되고, 이 두 개는 모두 동일한 컴퓨터에서 동작합니다. 다른 두 플레이어는 원격 클라이언트입니다. 즉, 이들은 호스트 서버에 연결된 다른 컴퓨터에 존재합니다.
호스트는 동시에 서버와 클라이언트로 동작하는 단일 게임 인스턴스입니다. 호스트는 로컬 클라이언트 커뮤니케이션을 위해 특별한 종류의 내부 클라이언트를 사용합니다. 로컬 클라이언트는 직접 함수 호출과 메시지 대기열을 통해 서버와 통신하는데, 이는 동일한 프로세스에 있기 때문입니다. 또한 실제로 서버와 씬을 공유합니다. 원격 클라이언트는 일반 네트워크 연결을 통해 서버와 통신합니다. Unity의 HLAPI를 사용하면 이 모든 작업이 자동으로 처리됩니다.
멀티플레이어 시스템의 주요 목적 중 하나는 로컬 클라이언트와 원격 클라이언트의 코드를 동일하게 만드는 것입니다. 이렇게 하면 게임을 개발할 때 하나의 클라이언트 타입만 고려하면 됩니다. 대부분의 경우 Unity가 이러한 차이를 자동으로 인식하고 처리하므로 사용자는 로컬 클라이언트와 원격 클라이언트에서 실행되는 코드의 차이를 신경 쓸 필요가 없습니다.
Unity로 싱글플레이어 게임을 만들 때는 일반적으로 GameObject.Instantiate
메서드를 사용하여 런타임 시점에 새 게임 오브젝트를 생성합니다. 하지만 멀티플레이어 시스템의 경우 서버가 직접 게임 오브젝트를 “스폰”해야 네트워크로 연결된 게임 내에서 게임 오브젝트를 활성화할 수 있습니다. 서버가 게임 오브젝트를 스폰하면 연결된 클라이언트에서 게임 오브젝트 생성이 트리거됩니다. 스폰 시스템은 게임 오브젝트의 주기를 관리하고, 게임 오브젝트의 설정 방법에 따라 게임 오브젝트의 상태를 동기화합니다.
네트워크 기반 인스턴스화 및 스폰에 대한 자세한 내용은 게임 오브젝트 스폰에 대한 문서를 참조하십시오.
Unity 멀티플레이어 HLAPI 시스템은 플레이어 게임 오브젝트를 논플레이어 게임 오브젝트와 다르게 처리합니다. 새 플레이어가 게임에 참가하면, 즉 새 클라이언트가 서버에 연결되면 해당 플레이어의 게임 오브젝트는 해당 플레이어의 클라이언트에서 “로컬 플레이어” 게임 오브젝트가 되고, Unity는 플레이어의 연결을 플레이어의 게임 오브젝트와 연관짓습니다. Unity는 게임 플레이어 한 명당 하나의 플레이어 게임 오브젝트를 연결하고, 네트워크 커맨드를 해당 개별 게임 오브젝트로 라우팅합니다. 플레이어는 다른 플레이어가 아닌 자신의 게임 오브젝트에 대해서만 커맨드를 호출할 수 있습니다.
자세한 내용은 플레이어 게임 오브젝트에 대한 문서를 참조하십시오.
서버와 클라이언트 모두 게임 오브젝트의 동작을 관리할 수 있습니다. “권한”의 개념은 게임 오브젝트의 관리 방식 및 위치를 나타냅니다. Unity의 HLAPI는 기본 상태에서 “서버 권한”에 기반합니다. 즉, 서버(호스트)가 플레이어를 나타내지 않는 모든 게임 오브젝트에 대한 권한을 보유합니다. 플레이어 게임 오브젝트는 특별한 경우로, “로컬 권한”을 보유한 것으로 취급됩니다. 게임을 빌드할 때는 다양한 권한 시스템을 사용하는 것이 좋습니다. 자세한 내용은 네트워크 권한을 참조하십시오.