スペース
スペース
スペースとマッチメイキング
ユーザーが行ける場所は「スペース」と呼ばれます。ユーザーはパブリックのスペースに参加するか、プライベートスペース(同じ「グループ」に所属するすべてのユーザーに制限されたスペース)に参加することができます。
特定のスペース/グループの組み合わせに対して同じルームにあまりにも多くのユーザーがいる場合、追加のユーザーは接続できるものの、新しいルームにルーティングされます。
このロジックは、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