This document is about: FUSION 1
SWITCH TO

Asteroids Advanced

Level 4

概要

This sample uses the 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.6 Apr 26, 2023 Fusion Asteroids Host Advanced 1.1.6 Build 186

アプリケーションフロー

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通りがあります。

  1. ネットワーク上で同期するのに必要な全てを含む特別なINetworkStruct である、ネットワーク済みステート(ISimpleStateを実装する構造体) このサンプルでは、BulletStateがこちらです。
  2. ISimpleStateを実装するMonoBehaviour。ステートのビジュアルを代表します。このサンプルでは、BulletBehaviourがこちらです。BulletBehaviourNetworkBehaviourでは ない のでご注意ください。

The SimpleObjectCollectionは、ステート構造体でSimpleFixedUpdateNetworkを呼び出し、一つのティックから次のティックへとステートを進めます。そしてmono behaviourでSimpleRenderを呼び出し、ビジュアルをアップデートします。

レンダリングメソッドは、一般的なNetworkBehaviourで使用されているものとは少し異なります。ステートのコピーを2つとそれら2つをノーマライズした、内挿値を表すオフセット提供しています。スナップショット並みの正確さが必要な場合は、to値だけを使用して残りは無視してください。

Back to top