Asteroids Advanced
概要
HostMode
topology.The Fusion Asteroids Advanced サンプルは、PC向けUnity 2021.3(Windows)のPUN Asteroidsデモをオリジナルとしたリメイク版です。ここに以下のFusionのアドバンス機能を使用しています。
- ホストマイグレーション: ホストがセッションを退出すると、NetworkObjectsのオーナーシップが残されたクライアントの誰かに移行します。
- Addressables: 宇宙船とメインのゲームシーンは両方ともaddressableです。
- ラグ補正: 弾丸はラグ補正済みのレイキャストを使用して惑星との衝突を確認しています。
- カスタムオブジェクトハンドリング: 弾丸はNetworkObjectではありませんが、シンプルなナットワーク構造を使用してステートを管理し、またカスタムマネージャを使用してローカルのゲームオブジェクトと関連付けしています。
- カスタムSceneManager: addressablesのハンドリングに特に必要です。
開始する前に
サンプルを実行するには、まずPhotonEngine DashboardでFusion AppIDを作成し、Real Time Settings(Fusionメニューから)のApp Id Fusion
フィールドにペーストします。それからLaunch
シーンを読み込んでPlay
を押してください。
ダウンロード
バージョン | リリース日 | ダウンロード | |
---|---|---|---|
1.1.10 | Sep 11, 2024 | Fusion Asteroids Host Advanced 1.1.10 Build 654 |
アプリケーションフロー
The AsteroidsAdvanced-Menu
シーンは、プレイヤーがゲームのホストをしたり、他のホストとのセッション実行に参加したりすることを可能にします。セッションが開始されると、AsteroidsGameのインスタンスが初期化され、AsteroidsAdvanced-Game
シーンが読み込まれます。その後、クライアントはホストがゲームを開始するのを待機します。
この初期ステップは全てMenuフォルダのコードによって処理されます。
AsteroidsGame
はコアセッションハンドリングのみを担当します。追加ネットワークステートやオブジェクトは作成しません。代わりに読み込んだマップに、ゲームループを管理し、必要なオブジェクト(特に、プレイヤーの宇宙船や惑星、惑星はAsteroidSpawner
となる)をスポーンするGameStateController
が含まれています。
ゲームの実行中、SpaceshipController
がプレイヤーの入力の回収を行い、またその入力の予測・適用をFixedUpdateNetwork
で行います。各宇宙船は、独自の弾丸のリストと関連するローカルGameObjectsを、「シンプルな」ネットワークオブジェクトの配列としてSimpleObjectCollection
に保持しています。
タイムアップになったり、プレイヤーが3回死亡したりすると、ゲームが終了し最も高得点のプレイヤーが勝利します。惑星に飛べば勝てるという変則的なゲーム性ですが、このサンプルではそこはあまり関係ありません。
ホストが切断したら、MigrationManager
が引き継ぎホストマイグレーションプロセスを始めます。これにより、クライアントだった人が新しくホストとなり、保存されていたネットワークスナップショットを取得して元のゲームステートの選択的な部分を復元できるようになります。この例では、SpaceShipController
インスタンスとGameStateController
インスタンスが復元されています。この2つのみがMigrationBehaviour
を継承しているからです(このサンプルに特有の慣例で、一般的なFUsion機能ではありません)。
MigrationManager
ホストマイグレーションは、元のホストが退出した場合にクライアントがネットワークセッションに対するホストの責任を継承することを可能にするFusionの機能です。MigrationManager
試行は、いくつかの制限や慣例を導入することでこのプロセスを簡素化するためのものです。
具体的には、NetworkObjectが新しいホストに移行するためには、まさしくMigrationBehaviour
由来のコンポーネントが一つ必要であるということです。
MigrationBehaviour
は、いくつかの新しいプロパティと、オブジェクトが移行した後に呼び出される新しいコールバック(Migrated
と名付けられる)でもってNetworkBehaviour
を拡張します。
オブジェクトは、再度スポーンされステートが復元された時に「移行」となりますが、もともとそのオブジェクトの入力権限を有していたプレイヤーが新しく移行した先のセッションに再接続してもう一度オブジェクトのコントロールを取り戻した時にも移行となり、もしかしたらこちらの方が重要かもしれません。
MigrationManager
を使用する際にまず覚えておきたいのは、MigrationManager
が移行されるオブジェクトであり、入力権限の再接続前に再スポーンされるオブジェクトであるということです。ですから、一般的にはMigrated
が呼び出されるまで移行したオブジェクトの起動を遅らせておくべきでしょう。
これを簡単にするために、MigrationBehaviour
のデフォルトの実装は、移行が保留となっている場合、Spawned
でのゲームオブジェクトの無効化して保留でない場合即時でMigrated
を呼び出すこととなっています。Migrated
のデフォルトの実装は、それからゲームオブジェクトを有効化します。
結果として、継承されたクラスの多くはコードをSpawned
からMigrated
へ移動させることができるのみになりますが、上書きした実装からbase.Migrated
を呼び出すことを忘れないようにしてください。
SimpleObjectCollection
The SimpleObjectCollection
は、ネットワーク上で個々に特定する必要のないネットワークオブジェクト用の軽量なラッパーです。そのため、各ローカルゲームオブジェクトに対して完全なNetworkObjectを必要としていません。
衝突には、以下の2通りがあります。
- ネットワーク上で同期するのに必要な全てを含む特別な
INetworkStruct
である、ネットワーク済みステート(ISimpleState
を実装する構造体) このサンプルでは、BulletState
がこちらです。 ISimpleState
を実装するMonoBehaviour。ステートのビジュアルを代表します。このサンプルでは、BulletBehaviour
がこちらです。BulletBehaviour
はNetworkBehaviour
では ない のでご注意ください。
The SimpleObjectCollection
は、ステート構造体でSimpleFixedUpdateNetwork
を呼び出し、一つのティックから次のティックへとステートを進めます。そしてmono behaviourでSimpleRender
を呼び出し、ビジュアルをアップデートします。
レンダリングメソッドは、一般的なNetworkBehaviour
で使用されているものとは少し異なります。ステートのコピーを2つとそれら2つをノーマライズした、内挿値を表すオフセット提供しています。スナップショット並みの正確さが必要な場合は、to
値だけを使用して残りは無視してください。