This document is about: FUSION 2
SWITCH TO

Fusion Golf

Level 4

概要

Fusion Golf サンプルは、物理に焦点を当てたアーケードゴルフレーシングゲームをサーバー権限、クライアント予測モデルで作成する方法を示しています。セッションブラウザと、ルームコードを介した直接接続機能があります。ホストは、各ホールの最大時間、最大ショット数、プレイヤー同士の衝突の有無、セッションブラウザにセッションが表示されるかどうかなど、さまざまなゲーム設定を変更できます。このサンプルには、キャノン、スピナー、ブーストトンネル、エレベータープラットフォームなど、さまざまな物理駆動オブジェクトを備えた18ホールコースがあります。Fusion Golf は、元々Fusion 1.0を使用して作成されましたが、Fusion 2.0にポートされており、Fusion 1.0バージョンの大部分の機能を保持しています。

始める前に

サンプルを実行するには、まずPhotonEngine DashboardでFusion AppIdを作成し、それをFusionメニューからアクセスできるリアルタイム設定の「App Id Fusion」フィールドに貼り付けます。その後、Scenesフォルダ内のMenuシーンを読み込み、Playを押してください。

ダウンロード

バージョン リリース日 ダウンロード
2.0.1 May 27, 2024 Fusion Golf 2.0.1 Build 557

特徴

  • 完全なネットワーク対応ゲームステートシステム(プレゲーム、イントロ、プレイ、アウトロ、ポストゲーム)
  • 他のプレイヤーの観戦機能
  • カスタマイズ可能なゲーム設定(衝突、ホール数、最大ショット数、最大時間)
  • 世界内のオブジェクトの同期された状態
  • ロビーブラウザ(およびルームをプライベートにする機能)
  • 物理重視のオブジェクト(キャノン、スピナー、エレベータープラットフォーム、ブーストトンネル)
  • カスタマイズ可能なプレイヤー視覚(RGBスライダー)
  • リージョン設定、ニックネーム設定、グラフィックオプション

プロジェクト

フォルダ構造

主なScriptsフォルダ/Scriptsには、Fusionとのインターフェースを持つことを主な機能とするスクリプトが含まれているNetworkingというサブフォルダがあります。
注目すべきスクリプト:

PlayerRegistry

PlayerRegistryは、部屋内の各プレイヤーへの参照を保存し、プレイヤーのカウント、選択、および1人または多数のプレイヤーに対してアクションを実行するためのユーティリティメソッドを提供します。ユーティリティ関数のデフォルトの動作は、観戦者(スペクテイター)を無視することですが、includeSpectatorsパラメータがtrueの場合は、すべてのプレイヤーのコレクションに対して操作を行います。

観戦者

観戦者は、ゲームに参加するのではなく、見ることを明示的に選んだプレイヤーです。観戦者のPlayerObjectには、決してControllerが割り当てられません。

GameState

ゲームロジックのフローと動作は、GameState NetworkBehaviourによって制御されます。GameStateは、ゲームのフェーズの列挙型を定義しており、ネットワーク化されたStateMachineプロパティがその状態として使用します。StateMachine<T>は、onEnteronExitonUpdateの3つのフィールドを持つStateHooksクラスを定義しています。StateMachineクラスを使用する際、各列挙型状態には、状態に入るとき、出るとき、そしてその状態に留まっている間に何が起こるかを定義するStateHooksを持つことができます。

ゲームへの参加

ユーザーは、セッションブラウザまたはセッションコードを介して、セッションをホストまたは参加できます。ホストする場合、セッションコードを入力することはオプションであり、空白のままにすると自動的に生成されます。セッション内に入ると、コードが画面の上部に表示されます。

セッションコードは、次のようにアクセスされます: runner.SessionInfo.Name

リージョン選択

ホストするか参加する前に、ユーザーにはどのPhoton Cloudリージョンを使用するかを選択するためのドロップダウンが表示されます。ドロップダウンオプションは、リージョンドキュメントに従って選択されています。

マッチメイカー

ホスティング、参加、およびセッションブラウザはすべてMatchmakerクラスによって処理されます。このクラスはNetworkRunner.StartGameメソッドのラッパーとして機能し、接続エラーが発生した場合、エラーをDisconnectUIに転送してユーザーに表示されるようにします。

入力の処理

入力はPlayerInputBehaviour.csによってカスタムINetworkInput構造体PlayerInputに取り込まれます。このサンプルの入力は、マウスをクリックして移動させることだけで構成されています。
PlayerInputは比較的シンプルで、次の3つのフィールドのみを含んでいます:

  • isDragging - プレイヤーがマウスボタンを押し続けているかどうか
  • dragDelta - プレイヤーのマウスがどれだけ下にドラッグされたか
  • yaw - プレイヤーが向いているAngle

このデータはPutterプレイヤースクリプトによって処理され、ボールを打つことに加え、ローカルプレイヤーおよび観戦者が適切なUIを見ることを可能にします。

プレイヤー

プレイヤーは2つの部分で処理されます:

  • PlayerObject - このオブジェクトが関連付けられているPlayerRef値、プレイヤーのコントローラー(Putter)への参照、部屋内でのインデックス、ニックネーム、選択された色、およびスコアに関連するゲームプレイデータを含みます。
  • Putter - 物理およびUIに対する入力に応じる役割を担います。

移行ノート

既に述べたように、Fusion GolfはFusion 1.0からFusion 2.0に移植されました。Fusion 1.0からFusion 2.0への移行に関する詳細はこちらを参照してください。以下は、その移植プロセス中に行われた変更のいくつかです。

  • 物理:Fusion 2.0は、物理用の別のアドオンを使用します。インポート後、ゲームで使用されるNetworkRunnerRunnerSimulatePhysics3Dコンポーネントを必要とします。このゲームは物理シミュレーションに大きく依存しているため、このコンポーネントのClient Physics Simulationプロパティは「Simulate Always」に設定することが重要であることに注意してください。
Settings for Runner Simulate Physics 3D.
Settings for Runner Simulate Physics 3D.

さらに、すべてのNetworkRigidbodyコンポーネントはNetworkRigidbody3Dに置き換える必要があります。このサンプルでは、Sync Parentパラメータをfalseに設定する必要があります(以下のように):

Settings for most NetworkRigidbody3D Components in this sample.
Settings for most NetworkRigidbody3D Components in this sample.
  • スクリプトとプロトタイピング: Fusion 1.0に存在し、PlayerSpawnerPrototypeなどのプロトタイピング用のさまざまなツールが含まれているAssets/Fusion/Scriptsフォルダは、Fusion 2.0には存在しなくなりました。このディレクトリ内の多くのスクリプトはアップグレード可能ですが、多くは冗長で、過度に複雑で、または不要なものであったため、これらのアイテムはこのサンプルから削除されました。新たに作成する必要があった唯一のクラスはPlayerSpawnerであり、これはプレイヤーが参加したときにNetworkObjectを生成し、離脱したときにデスポーンさせる役割を持つNetworkRunnerプレハブに付随するSimulationBehaviourです。

C#

public class PlayerSpawner : SimulationBehaviour, IPlayerJoined, IPlayerLeft
{
    public NetworkObject playerObject;

    public void PlayerJoined(PlayerRef player)
    {
        // In a ClientServer topology, only the server can spawn players.
        if (Runner.Topology == Topologies.ClientServer)
        {
            if (Runner.CanSpawn)
            {
                Runner.Spawn(playerObject, inputAuthority: player);
            }
        }
        // In a shared topology, every player can spawn, however, we only want the local player to spawn their own player
        else if (Runner.LocalPlayer == player)
        {
            Runner.Spawn(playerObject, inputAuthority: player);
        }
    }

    public void PlayerLeft(PlayerRef player)
    {
        bool canDespawn = (Runner.Topology == Topologies.ClientServer && Runner.IsServer) ||
            (Runner.Topology == Topologies.Shared && Runner.IsSharedModeMasterClient);

        if (canDespawn)
        {
            PlayerObject leavingPlayer = PlayerRegistry.GetPlayer(player);
            Runner.Despawn(leavingPlayer.Object);
        }
    }
}
  • FixedUpdateNetwork: Fusion 2.0では、FixedUpdateNetworkはプロキシでは実行されません。これにより、移植時に奇妙な動作が発生することがあります。例えば、このサンプルでは、GameStateがホストでのみ状態遷移を実行しているという問題がありました。そのため、Spawnedメソッドの最後近くに以下の行が追加されました:

C#

...
// Ensures that FixedUpdateNetwork is called for all proxies.
Runner.SetIsSimulated(Object, true);
...
  • スポーン: Fusion 1.0では、プレイヤーがRunner.Spawnを呼び出そうとした際に、権限を持たない(例えば、ClientServerトポロジーを使用しているゲームのクライアント)場合、スポーンは静かに失敗します。しかし、Fusion 2.0では、クライアントがオブジェクトを生成できない状態で生成を試みると、例外がスローされ、さまざまな問題を引き起こす可能性があります。このサンプルでは、Runner.Spawnを呼び出す前に、Runner.CanSpawnを使用してチェックを行い、このエラーを防いでいます。

サードパーティアセット

ゴルフサンプルには、それぞれのクリエイターによって提供された複数のアセットが含まれています。これらのアセットの完全なパッケージは、それぞれのサイトでご自分のプロジェクト用に入手できます:

重要: 商業プロジェクトで使用するには、各クリエイターからライセンスを購入する必要があります。

Back to top