Fusion Golf
概要
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>
は、onEnter
、onExit
、onUpdate
の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は、物理用の別のアドオンを使用します。インポート後、ゲームで使用される
NetworkRunner
はRunnerSimulatePhysics3D
コンポーネントを必要とします。このゲームは物理シミュレーションに大きく依存しているため、このコンポーネントのClient Physics Simulation
プロパティは「Simulate Always」に設定することが重要であることに注意してください。
さらに、すべてのNetworkRigidbody
コンポーネントはNetworkRigidbody3D
に置き換える必要があります。このサンプルでは、Sync Parent
パラメータをfalseに設定する必要があります(以下のように):
- スクリプトとプロトタイピング: 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
を使用してチェックを行い、このエラーを防いでいます。
サードパーティアセット
ゴルフサンプルには、それぞれのクリエイターによって提供された複数のアセットが含まれています。これらのアセットの完全なパッケージは、それぞれのサイトでご自分のプロジェクト用に入手できます:
- Skybox Extended Shader by BOXOPHOBIC
- Kenney's Minigolf Kit by Kenney
- Toon Water Shader by Erik Roystan Ross
- Low Poly Cliff Pack by Broken Vector
- Low Poly Tree Pack by Broken Vector
- Fredoka One font by Milena B Design
重要: 商業プロジェクトで使用するには、各クリエイターからライセンスを購入する必要があります。
Back to top