スペース
スペース
スペースとマッチメイキング
ユーザーが行ける場所は「スペース」と呼ばれます。ユーザーはパブリックのスペースに参加するか、プライベートスペース(同じ「グループ」に所属するすべてのユーザーに制限されたスペース)に参加することができます。
特定のスペース/グループの組み合わせに対して同じルームにあまりにも多くのユーザーがいる場合、追加のユーザーは接続できるものの、新しいルームにルーティングされます。
このロジックは、Fusionのマッチメイキング機能を使用して実装されています。
ユーザーが参加したいスペースとグループは、セッションプロパティで記述されます(注:メタバースプロパティも必要に応じて追加のフィルタリングを許可するために使用されますが、全体的なロジックはそれなしでも同じです)。次に、ランナーに渡されるゲーム開始引数に明示的な部屋名が提供されないため、マッチメイキングシステムはユーザーをスペースID/グループIDフィルターに一致するセッションにルーティングします。最初に作成された部屋が満杯の場合、別の部屋が作成され、他のユーザーがそこに参加します。これにより、混雑したスペースでもさらにユーザーが接続するのを妨げることなく処理できるようになります。
このロジックはSpaceRoom
クラスによって処理され、ConnectionManager
が部屋名の代わりにセッションプロパティを使用するように設定されます。
グループの切り替え
SpaceRoom
はグループの切り替えも処理します。ユーザーがプライベートグループに参加したい場合(またはプライベートグループを離れてパブリックグループに参加したい場合)、SpaceRoom
は次のように処理します。
- 要求されたグループIDを
PlayerPrefs
に保存します。 - ユーザーの現在の位置を
PlayerPrefs
に保存します(SceneSpawnManager
コンポーネントを通じて)。 - ビューをフェードアウトします。
- シーンを再読み込みします。
SpaceRoom
はグループIDをConnectionManager
に提供し、マッチメイキングAPIでのセッションプロパティとして使用されます。- シーンのロード中に、ユーザーは
SceneSpawnManager
コンポーネントによって前回保存された位置に配置されます。
SpaceDescription
スペースIDは、インスペクターのSpaceRoom
コンポーネントで設定することもできますし、SpaceDescription
を準備して提供することも可能です。
SpaceDescription
はスクリプタブルオブジェクトで、以下のフィールドがあります。
spaceId
: 各スペースを一意に識別するための技術的データフィールドで、ユーザーをこのスペースに適したFusionルームにルーティングするセッションプロパティをSpaceRoom
コンポーネントに入力します。sceneName
: プレイヤーがこのスペースに参加したときにロードされるべきUnityシーンです。spaceName
: スペースの名前です。スペース間のポータルパネルにロードされます。IDとしては使用されず、プレゼンテーションテキストとしてのみ使用されます。spaceDescription
: スペースの説明です。スペース間のポータルパネルにロードされ、対象スペースの目的をユーザーに説明します。spaceParam
: オプションの技術データです。将来的に、複数のスペースが同じシーンを使用する際に、そのシーンにパラメーターを提供するために使用されます。spaceSecondaryParam
: オプションの技術データです。将来的に、複数のスペースが同じシーンを使用する際に、そのシーンにパラメーターを提供するために使用されます。
他のスペースへの参加
別のスペースに参加する操作はSpaceLoader
コンポーネントによって処理されます。完全なSpaceDescription
を提供することも、単にスペースIDの文字列を提供することで簡単に対応することも可能です。
どのUnityシーンをロードするかを知るために、SpaceLoader
はそのSpaceDescription
フィールドに提供されたシーンを読み取ることができます。また、よりシンプルなケースでは、提供されたスペースIDの文字列と同じシーン名を使用するものとみなします。
SwitchScene()
メソッドが呼ばれると、ターゲットシーンをロードすることでスペースの変更が行われます。このメソッドは以下のように動作します:
- まず、現在のランナーをシャットダウンします。
- 要求された
SpaceDescription
をSpaceRoom.RegisterSpaceRequest()
を使って記録します。入ってくるシーンのSpaceRoom
スペース説明は無視され、正確なSpaceDescription
がこのSpaceLoader
に保存されたものと一致するように変更されます。これは、現在のサンプル状態のようなシンプルなスペース構成には必要ありませんが、単一のUnityシーンが複数のスペースに使用されるようなより高度なシナリオを可能にします。 - その後、新しいUnityシーンをロードします。
C#
private async void SwitchScene()
{
...
await runner.Shutdown(true);
Debug.Log("Loading new scene " + SceneName);
SpaceRoom.RegisterSpaceRequest(spaceDescription);
SceneManager.LoadScene(SceneName, LoadSceneMode.Single);
}
他のスペースから戻る際のスポーンポイント
SpaceLoader
コンポーネントは、autoRegisterAsReturnPoint
がtrueの場合にreturnPosition
を提供することができ、ハブシーンが直接ロードされたときと、プレイヤーが別のシーンに参加した後に戻ってきたときのプレイヤーのスポーン位置を区別します。
ユーザーが現在のシーン(スペースAに関連付けられている)に参加する際、SpaceLoader
によってターゲットとされたスペース(スペースB)にいた直後の場合、ユーザーはスペースBに関連付けられたこのSpaceLoader
に対して設定されたreturnPosition
トランスフォームでスポーンします。これは、スペースBに関連付けられたこの戻り位置をSceneSpawnManager
に提供することで行われ、SceneSpawnManager
はユーザーのスポーン位置を管理します。
デモ
使用方法を説明するため、デモシーンが Assets\Photon\FusionAddons\Spaces\Demo\Scenes\
フォルダにあります。
各シーンには2つのポータルが含まれており、プレイヤーがそのポータルに入ると、SpaceLoader
コンポーネントのおかげで新しい「スペース」がロードされます。また、PortalSpaceDescriptionLoader
スクリプトは、ポータルパネルにスペースのプロパティを表示します。
ダウンロード
このアドオン最新バージョンはaddon projectに含まれています。
サポートされているトポロジ
- shared mode
Changelog
- Version 1.0.3: Change demo scripts name
- Version 1.0.2: Fix because of ConnectionManager namespace modification
- Version 1.0.1: Add demo scene + add namespace
- Version 1.0.0: First release