심화 Fusion Asteroids

Level Advanced

개요

이 샘플은 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.3 Oct 21, 2022 Fusion Asteroids Host Advanced 1.1.3 Build 57

메인 화면으로

애플리케이션 흐름

AsteroidsAdvanced-Menu 씬은 플레이어가 게임을 호스팅 하거나 다른 호스트와 함께 실행 세션에 조인할 수 있도록 합니다. 세션이 시작되면 AsteroidsGame의 인스턴스가 인스턴스화되고 AsteroidsAdvanced-Game 씬이 로드됩니다. 그러면 클라이언트는 호스트가 게임을 시작할 때까지 기다립니다.

이 초기 설정은 전적으로 메뉴 폴더의 코드에 의해 처리됩니다.

AsteroidsGame은 핵심 세션 처리만 담당합니다. 추가 네트워크 상태나 객체를 생성하지 않으며, 로드된 맵에는 게임 루프를 관리하고 필요한 객체, 특히 플레이어 우주선과 소행성을 생성하는 GameStateController가 포함되어 있지만, 후자는 AsteroidSpawner에 위임됩니다.

게임이 실행되는 동안 SpaceshipController는 플레이어로부터 입력을 수집하고 해당 입력을 FixedUpdateNetwork에서 예측/적용합니다. 각 우주선은 또한 "간단한" 네트워크 객체의 배열과 SimpleObjectCollection의 관련 로컬 게임 GameObjects로 자체 총알 목록을 유지합니다.

시간이 다 되거나 플레이어가 3번 죽으면 게임이 끝나고 더 많은 점수를 획득한 플레이어가 승리합니다. 아마도 선두에 선 플레이어가 소행성에 날아가서 이길 수 있기 때문에 게임 플레이의 이상한 형태이나 이 예제의 요점은 아닙니다.

호스트의 연결이 끊어지면 MigrationManager가 호스트 마이그레이션 프로세스를 대신하고 시작합니다. 기본적으로 이전 클라이언트가 새 호스트가 되어 원래 게임 상태의 일부분을 복원할 수 있는 이전에 저장된 네트워크 스냅샷을 얻을 수 있습니다. 이 예에서는 SpaceShipControllerGameStateController 인스턴스가 복원됩니다. 이 두 인스턴스만 MigrationBehaviour에서 파생되기 때문입니다(이것은 일반적인 Fusion 기능이 아니며 이 샘플에서만 특별히 사용되는 규칙입니다).

메인 화면으로

MigrationManager

호스트 마이그레이션은 원래 호스트가 나갈 때 클라이언트가 네트워크 세션에 대한 호스팅 책임을 상속할 수 있도록 하는 Fusion 기능입니다. MigrationManager는 몇 가지 제한과 규약을 도입하여 이 과정을 간소화합니다.

특히 NetworkObject가 새 호스트로 마이그레이션 되려면 MigrationBehaviour에서 파생되는 컴포넌트가 정확히 하나 있어야 합니다.

MigrationBehaviour는 객체가 마이그레이션 된 후(Migrated로 명명됨) 호출되는 몇 가지 새로운 속성과 새로운 콜백을 갖고 있으며 NetworkBehaviour로 부터 상속됩니다.

객체가 다시 생성되고 상태가 복원되었을 때 객체가 "migrated"되지만, 더 중요한 것은 원래 객체의 입력 권한을 가지고 있던 플레이어가 다시 마이그레이션 된 새 세션에 연결되고 객체를 다시 제어할 수 있다는 것입니다.

MigrationManager를 사용할 때 기억해야 할 가장 중요한 점은 마이그레이션 되는 객체는 입력 권한을 다시 연결하기 전에 다시 설정되기 때문에 일반적으로 Migrated가 호출될 때까지 마이그레이션 된 객체의 활성화를 연기해야 한다는 것입니다.

이를 단순화하기 위해 마이그레이션이 보류 중인 경우 MigrationBehaviour의 기본 구현은 Spawned에서 게임 객체를 비활성화하지만 그렇지 않은 경우 즉시 Migrated를 호출합니다. 그러면 Migrated의 기본 구현이 게임 객체를 사용할 수 있도록 합니다.

결과적으로 대부분의 파생 클래스는 코드를 Spawned에서 Migrated로 이동시킬 수 있지만 오버라이드 된 구현에서 base.Migrated를 호출하는 것을 기억해야 합니다.

메인 화면으로

SimpleObjectCollection

SimpleObjectCollection은 네트워크에서 개별적으로 식별할 필요가 없는 네트워크 객체를 위한 경량 래퍼이므로 각 로컬 게임 객체에 대해 모든 네트워크 객체를 필요로 하지 않습니다.

컬렉션에서는 2개의 파트가 있습니다:

1) 네트워크 상태(ISimpleState를 구현하는 구조체)는 특별한 INetworkStruct로 네트워크를 통해 동기화되어야 하는 모든 것을 포함합니다. 이 예제에서는 BulletState입니다. 2) 상태를 시각적으로 나타내는 ISimpleObject를 구현하는 MonoBehaviour. 이 샘플에서는 BulletBehaviour입니다. BulletBehaviourNetworkBehaviour아님에 주의하세요.

SimpleObjectCollection은 상태 구조체에서 SimpleFixedUpdateNetwork를 호출하여 상태를 한 틱에서 다음 틱으로 진행하고, mono behaviour에서 SimpleRender를 호출하여 시각적 자료를 갱신합니다.

렌더링 메소드는 보간 ㄴ된 값을 나타내야 하는 두 개의 상태 복사본과 둘 사이의 정규화된 오프셋을 제공한다는 점에서 일반적인 NetworkBehaviour에서 사용되는 것과 약간 다릅니다. 스냅샷 정확도를 원하는 경우 to 값을 사용하고 나머지는 무시합니다.


기술문서 TOP으로 돌아가기