Spaces
Spaces
スペースとマッチメイキング
ユーザーが行ける各場所は「スペース」と呼ばれます。
ユーザーは、パブリックスペースかプライベートスペース(同じ「グループ」のユーザーに制限されたスペース)に参加します。
あるスペース/グループに対して、同じルームのユーザーが多すぎる場合は、新規ユーザーは新しいルームに接続されます。
このロジックは、Fusionのマッチメイキングで実装されています。
ユーザーが参加するスペースとグループは、セッションプロパティ(備考:metaverseプロパティは必要に応じた詳細なフィルタリングに使用されますが、全体のロジックは同様です)で表されます。そして、NetworkRunner
のStartGameArgs
で明示的なルーム名を指定しなければ、マッチメイキングシステムによって、スペースID/グループIDでフィルタリングされたセッションにユーザーが参加します。作成された最初のルームが満員なら、他のユーザーが参加できるように別のルームが作成されるため、ユーザーの接続を失敗させることなく混雑したスペースを管理できます。
このロジックはSpaceRoom
クラスで制御され、ConnectionManager
を調整して、ルーム名のかわりにセッションプロパティを使用します。
グループの切り替え
SpaceRoom
は、グループの切り替えも制御します。ユーザーがプライベートグループに参加したい時(または、プライベートグループを退出して、パブリックグループに参加する時)、SpaceRoom
は以下のように動作します。
- リクエストされたグループIDを
PlayerPrefs
に保存する PlayerPrefs
にユーザーの現在位置を保存する(SceneSpawnManager
コンポーネントを通して)- ビューをフェードアウトする
- シーンをリロードする
SpaceRoom
がConnectionManager
にグループIDを渡し、マッチメイキングAPIのセッションプロパティに使用される- シーンロード中、ユーザーは
SceneSpawnManager
コンポーネントによって先ほど保存した位置に移動する
SpaceDescription
スペースIDは、SpaceRoom
コンポーネントのインスペクター上から設定するか、SpaceDescription
を用意して設定することが可能です。
SpaceDescription
はScriptableObject
で、以下のフィールドを持ちます。
spaceId
:各スペースを識別するユニークなデータフィールドで、SpaceRoom
コンポーネントでは、ユーザーを適切なFusionのルームに参加させるためのセッションプロパティになります。sceneName
:プレイヤーがこのスペースに参加した時にロードされるUnityのシーンです。spaceName
:スペース名です。スペース間のポータルのパネルでロードされます。IDではなく、表示用テキストとして使用されます。spaceDescription
:スペースの説明です。スペース間のポータルのパネルでロードされます。ユーザーに対象のスペースの目的を説明します。spaceParam
:オプションのデータです。活用例としては、複数のスペースが同じシーンを使用している時にシーンにパラメーターを渡すなどです。spaceSecondaryParam
:オプションのデータです。活用例としては、複数のスペースが同じシーンを使用している時にシーンにパラメーターを渡すなどです。
別のスペースへの参加
別のスペースへの参加は、SpaceLoader
コンポーネントで制御されます。完全なSpaceDescription
を渡すか、単純にスペースIDの文字列を渡すかが可能です。
SpaceLaoder
がどのUnityシーンをロードするかを知るには、SpaceDescription
フィールドで与えられるシーンを読み込むか、シーン名がスペースIDと同じ文字列であると仮定することになります。
SwitchScene()
メソッドが呼び出されると、スペース変更が発生し、対象シーンのロードが行われます。
- 最初に現在の
NetworkRunner
をShutdown
する SpaceRoom.RegisterSpaceRequest()
を使用して、リクエストされたSpaceDescription
を記録する。遷移先シーンのSpaceRoom
のスペースの説明は無視され、SpaceLoader
に保存されたSpaceDescription
に合わせるように変更されます。これはこのサンプルのような設定のシンプルなスペースでは必要ありませんが、単一の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
の場合に、returnPoisition
を提供することもできます。これによって、Hubシーンから直接ロードされた時と、別のシーンから戻ってきた時とのスポーン地点を差別化できます。
あるユーザーが現在のシーン(スペースA)に参加する際に、直前まで別のスペース(スペースB)にいたことがSpaceLoader
に設定されていたら、ユーザーはスペースBに繋がるSpaceLaoder
のreturnPosition
の位置にスポーンします。このスペースBに関連したreturnPosition
はSceneSpawnManager
から与えられ、ユーザーのスポーン位置を制御します。
依存関係
- ConnectionManagerアドオン
デモ
使用方法を示すデモシーンはAssets\Photon\FusionAddons\Spaces\Demo\Scenes\
フォルダーにあります。
各シーンには2つのポータルがあり、各ポータルはSpaceLaoder
コンポーネントによって、プレイヤーが中に入る時に新しいSpace
をロードします。
またPortalSpaceDescriptionLoader
スクリプトは、ポータルパネル上でスペースのプロパティを表示します。
ダウンロード
このアドオンの最新バージョンは、Industries アドオンのプロジェクトに含まれています。
対応するトポロジー
- 共有モード
更新履歴
- Version 2.0.0: Fusion 2.0 support
- 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