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