심화 Asteroids
개요
HostMode
토폴로지를 사용합니다.삼화 Fusion Asteroids 샘플은 PC(Windows)용 유니티 2021.3의 원래 PUN Asteroids 데모를 리메이크한 것입니다. Fusion의 몇 가지 심화 기능을 사용합니다.
- 호스트 마이그레이션: 호스트가 세션을 종료하면 NetworkObjects의 소유권이 나머지 클라이언트 중 하나로 전송됩니다.
- 주소 지정 가능: 우주선과 메인 게임 씬은 모두 주소 지정이 가능합니다.
- 지연 보상: 총알은 소행성과의 충돌을 확인하기 위해 지연 보상 레이캐스트를 사용합니다.
- 사용자 지정 GameObject 처리: 총알은 NetworkObjects가 아니지만 보다 간단한 네트워크 구조를 사용하여 상태를 관리하고 사용자 지정 관리자를 사용하여 해당 상태를 로컬 게임 객체와 연결합니다.
- 사용자 지정 씬 관리자: 주소 지정을 처리하는 데 특히 필요합니다.
시작하기 전에
샘플을 실행하기 위해서, PhotonEngine 관리 화면에서 Fusion AppId를 생성하고 Real Time 설정 (Fusion 메뉴에서 이동 가능)의 App Id Fusion
필드에 붙여 넣습니다. 그리고 Launch
씬을 로드하고 Play
를 누릅니다.
다운로드
버전 | 릴리즈 일자 | 다운로드 | |
---|---|---|---|
1.1.10 | Sep 11, 2024 | Fusion Asteroids Host Advanced 1.1.10 Build 654 |
애플리케이션 흐름
AsteroidsAdvanced-Menu
씬은 플레이어가 게임을 호스팅 하거나 다른 호스트와 함께 실행 세션에 조인할 수 있도록 합니다. 세션이 시작되면 AsteroidsGame의 인스턴스가 인스턴스화되고 AsteroidsAdvanced-Game
씬이 로드됩니다. 그러면 클라이언트는 호스트가 게임을 시작할 때까지 기다립니다.
이 초기 설정은 전적으로 메뉴 폴더의 코드에 의해 처리됩니다.
AsteroidsGame
은 핵심 세션 처리만 담당합니다. 추가 네트워크 상태나 객체를 생성하지 않으며, 로드된 맵에는 게임 루프를 관리하고 필요한 객체, 특히 플레이어 우주선과 소행성을 생성하는 GameStateController
가 포함되어 있지만, 후자는 AsteroidSpawner
에 위임됩니다.
게임이 실행되는 동안 SpaceshipController
는 플레이어로부터 입력을 수집하고 해당 입력을 FixedUpdateNetwork
에서 예측/적용합니다. 각 우주선은 또한 "간단한" 네트워크 객체의 배열과 SimpleObjectCollection
의 관련 로컬 게임 GameObjects로 자체 총알 목록을 유지합니다.
시간이 다 되거나 플레이어가 3번 죽으면 게임이 끝나고 더 많은 점수를 획득한 플레이어가 승리합니다. 아마도 선두에 선 플레이어가 소행성에 날아가서 이길 수 있기 때문에 게임 플레이의 이상한 형태이나 이 예제의 요점은 아닙니다.
호스트의 연결이 끊어지면 MigrationManager
가 호스트 마이그레이션 프로세스를 대신하고 시작합니다. 기본적으로 이전 클라이언트가 새 호스트가 되어 원래 게임 상태의 일부분을 복원할 수 있는 이전에 저장된 네트워크 스냅샷을 얻을 수 있습니다. 이 예에서는 SpaceShipController
및 GameStateController
인스턴스가 복원됩니다. 이 두 인스턴스만 MigrationBehaviour
에서 파생되기 때문입니다(이것은 일반적인 Fusion 기능이 아니며 이 샘플에서만 특별히 사용되는 규칙입니다).
MigrationManager
호스트 마이그레이션은 원래 호스트가 나갈 때 클라이언트가 네트워크 세션에 대한 호스팅 책임을 상속할 수 있도록 하는 Fusion 기능입니다. MigrationManager
는 몇 가지 제한과 규약을 도입하여 이 과정을 간소화합니다.
특히 NetworkObject가 새 호스트로 마이그레이션 되려면 MigrationBehaviour
에서 파생되는 컴포넌트가 정확히 하나 있어야 합니다.
MigrationBehaviour
는 객체가 마이그레이션 된 후(Migrated
로 명명됨) 호출되는 몇 가지 새로운 속성과 새로운 콜백을 갖고 있으며 NetworkBehaviour
로 부터 상속됩니다.
객체가 다시 생성되고 상태가 복원되었을 때 객체가 "migrated"되지만, 더 중요한 것은 원래 객체의 입력 권한을 가지고 있던 플레이어가 다시 마이그레이션 된 새 세션에 연결되고 객체를 다시 제어할 수 있다는 것입니다.
MigrationManager
를 사용할 때 기억해야 할 가장 중요한 점은 마이그레이션 되는 객체는 입력 권한을 다시 연결하기 전에 다시 설정되기 때문에 일반적으로 Migrated
가 호출될 때까지 마이그레이션 된 객체의 활성화를 연기해야 한다는 것입니다.
이를 단순화하기 위해 마이그레이션이 보류 중인 경우 MigrationBehaviour
의 기본 구현은 Spawned
에서 게임 객체를 비활성화하지만 그렇지 않은 경우 즉시 Migrated
를 호출합니다. 그러면 Migrated
의 기본 구현이 게임 객체를 사용할 수 있도록 합니다.
결과적으로 대부분의 파생 클래스는 코드를 Spawned
에서 Migrated
로 이동시킬 수 있지만 오버라이드 된 구현에서 base.Migrated
를 호출하는 것을 기억해야 합니다.
SimpleObjectCollection
SimpleObjectCollection
은 네트워크에서 개별적으로 식별할 필요가 없는 네트워크 객체를 위한 경량 래퍼이므로 각 로컬 게임 객체에 대해 모든 네트워크 객체를 필요로 하지 않습니다.
컬렉션에서는 2개의 파트가 있습니다:
- 네트워크 상태(
ISimpleState
를 구현하는 구조체)는 특별한INetworkStruct
로 네트워크를 통해 동기화되어야 하는 모든 것을 포함합니다. 이 예제에서는BulletState
입니다. - 상태를 시각적으로 나타내는
ISimpleObject
를 구현하는 MonoBehaviour. 이 샘플에서는BulletBehaviour
입니다.BulletBehaviour
는NetworkBehaviour
가 아님에 주의하세요.
SimpleObjectCollection
은 상태 구조체에서 SimpleFixedUpdateNetwork
를 호출하여 상태를 한 틱에서 다음 틱으로 진행하고, mono behaviour에서 SimpleRender
를 호출하여 시각적 자료를 갱신합니다.
렌더링 메소드는 보간 ㄴ된 값을 나타내야 하는 두 개의 상태 복사본과 둘 사이의 정규화된 오프셋을 제공한다는 점에서 일반적인 NetworkBehaviour
에서 사용되는 것과 약간 다릅니다. 스냅샷 정확도를 원하는 경우 to
값을 사용하고 나머지는 무시합니다.