移動の概要
Meta Horizonプラットフォームにおける移動には、以下の2つの定義があります。
- ユーザーがアプリ内のデスティネーションに移動する
- ユーザーが招待を受け取って、アプリのデスティネーションに到着する
移動とは、ユーザーまたはユーザーのグループが、Meta Questヘッドセットのある場所からプラットフォーム機能を使って別の場所に移動することです。一般的に、移動はいくつかのプラットフォーム機能をグループ化して、ユーザーがアプリ内の特定のデスティネーションに到着したり、友達をアプリ内の特定のデスティネーションに招待したりできるような、シームレスな移動エクスペリエンスを作成します。
ユーザーがその場所(デスティネーション)に移動できるなら、招待メニューから友達やフォロワーをその場所に招待することもできます。
このドキュメントでは以下の点を扱います。
- 移動の概念とそれがアプリのユーザーエクスペリエンスをどのように高めるか
- 移動を実装することで、スムーズなマルチプレイヤーパーティーエクスペリエンスを実現する方法
- どのMetaプラットフォームの機能が連携してアプリでの移動を可能にするか
- ユーザーはどのようにグループを形成してパーティーのデスティネーションに移動できるか
アプリでのレベル1の実装が完了した後、アプリでの移動を可能にするために追加のプラットフォーム機能を使う必要があります。これらの機能には以下が含まれます。
デスティネーション - デスティネーションとはアプリ内で設定可能な場所のことであり、グループプレゼンスで表示することができます。アプリでデスティネーションを追加および設定する手順は以下のとおりです。
- Meta Horizon開発者センターを開きます。
- アプリを選択します。
- [Engagement (エンゲージメント)] > [Destinations (デスティネーション)]の順にクリックします。
- [Create Multiple Destinations (複数のデスティネーションを作成)]または[Create a Single Destination (1つのデスティネーションを作成)]をクリックします。
アプリに招待 - [アプリに招待]で、ユーザーが現在使っているアプリのデスティネーションに、友達、フォロワー、または最近つながった人を招待することができます。
招待リンク - 招待リンク機能により、ユーザーが現在のデスティネーションに対応するリンクを作成し、友達やフォロワーにそのリンクを送信したり、ほかのユーザーが参加できるように投稿したりすることができます。
クイック招待 - クイック招待APIを使えば、Meta Questのオーバーレイを表示しなくても、ユーザーはアプリから友達やフォロワーに招待を送信することができます。
アプリ間の移動 - [アプリ間の移動]機能により、ユーザーは、あるアプリのデスティネーションから受信側アプリの別のデスティネーションに移動することができます。
これらの機能が有効になると、あなたのアプリはMeta Questエコシステム内にあるほかのデスティネーションとの間でユーザーの移動を可能にします。
デスティネーションはこの移動システムの重要な要素であり、ユーザーの移動先となるアプリ内のエンドポイントとして必要です。
アプリ内の任意の場所やルーム、またはイベントさえも、Meta Questダッシュボードで[Engagement (エンゲージメント)] > [Destinations (デスティネーション)]の順に進むことで、デスティネーションとして設定できます。デスティネーションを設定したら、ユーザーがデスティネーションに着いた後に、ほかのユーザーがそのデスティネーション情報を見ることができるように、アプリにグループプレゼンスを実装することが必要になります。
グループプレゼンスを有効にすると、[アプリに招待]機能を使用してアプリ内のデスティネーションにユーザーを招待することができます。
これらの3つの機能(デスティネーション、グループプレゼンス、アプリに招待)は、プラットフォーム機能のレベル1実装として便利にグループ化されています。
以下は、一般的な移動のユースケースとエクスペリエンスの例です。これらは、ユーザーが通常Meta Questの移動システムや機能をどのように操作するかを示す代表的な例です。
注 これらの例は、
SharedSpaces Sampleアプリがベースになっています。これには、デスティネーションがアタッチされた一連のルーム(赤、緑、青、紫)があり、テストユーザーのAliceとBobがいます。さらに、これらのサンプルは、サンプルアプリのネットワーキングソリューションとしてPhotonを使用しています。
このフローは、デスティネーション、グループプレゼンス、招待、ディープリンクの使用を紹介しています。
- Alice Aがアプリを起動します。
- アプリケーションが招待に応じてではなく通常起動すると、イベントはそのユーザーのグループプレゼンス情報を設定します。
- デスティネーションAPI名はデフォルトのデスティネーション「Lobby」とマップになります。
- Aliceはこのロビーに行きますが、セッションロビーIDがまだ設定されていないので、ランダムなIDが新規作成されます。この例では「Lobby_123」を使用します。マッチセッションIDはありません。
- 次のステップは、Photonを使用してトランスポート層を確立することです。彼女のロビーセッションID「Lobby_123」と同じ名前のルームに参加するか、存在しない場合は作成します。このケースでは、この新しい名前は作成されたばかりなので、彼女がこのルームで最初の人となり、彼女用のルームとして作成されます。
- UE4のレベルで、彼女は自分のPhotonルームのマスタークライアントであるため、彼女は自分のヘッドセット上でUE4サーバーのホスティングを始めます。
- Aliceは自分のいるlobby_123にBobを招待します。
- Bobはその招待を、ゲーム中あるいはHorizonホームで受け取ります。
- Bobが招待を受け入れると、Aliceのグループプレゼンスを含むディープリンクを使ってアプリケーションが起動され、Aliceの現在のデスティネーション「Lobby」、ロビーセッション「Lobby_123」、マッチIDなしの状態で完了します。
- その同じデスティネーションを使用するよう、Bobのグループプレゼンスが更新されます。これはロビーに参加する招待なので、BobのロビーIDもAliceのロビーIDと同じになるように更新されます。
- Photonレベルで、Bobはまったく同じフローをたどります。Lobby_123というルームがあれば参加し、なければ作成するという操作を試みます。ルームがすでに存在するため、単に通常のクライアントとして参加することになります。
- Unreal Engineレベルでは、アプリは彼を通常のクライアントとして(現在のPhotonルームのマスタークライアントである) Aliceに接続します。
以下は、現在進行中のマッチに参加するユーザーの例です。
- Bobが青ルームに入ります。
- 彼のマッチIDが、青ルームのIDに設定されます。このプライベートルームIDは、アタッチしているロビーに由来し、「BlueRoom_for_lobby_123」のようになります。
- 青ルームは、Aliceのロビーlobby_123に関連付けられたプライベートルームです。
- 特定のロビーにいる人は、それにつながっているどのプライベートルームにも参加できます。1.Bobがルームに参加します。つまり、マッチセッションIDにちなんで名付けられたPhotonルームに参加する、なければ作成することになります。2.彼がそのルームの最初の人なので、Photonルームは彼のために作成され、彼が現在のマスタークライアントになります。そのため彼は、自分のヘッドセット上の対応するUE4サーバーをホスティングする人となります。(UE4)固有3.サーバーを開始し、サーバーの最初のクライアントになります。スターター位置を見つけます。
- Aliceが青色ルームに入ります。
- 彼女のマッチIDが、青色ルームのID「BlueRoom_for_lobby_123」に設定されます。
- 現在Bobがホストなので、彼女はBobのサーバーに接続します。(UE4)
- これでAliceはBobと共存関係になります。
- 彼らは同じロビーID「lobby_123」と同じマッチID「BlueRoom_for_lobb_123」を共有しています。
以下のプロセスは、アプリのデスティネーションにいるあなたに合流するよう、友達やフォロワーに招待を送信するユースケースを示します。
- 青色ルームで、Aliceが参加者リストを開きます。
- 彼女とBobは同じチームの代表です。なぜなら彼らは同じロビーID「lobby_123」を持っているからです。
- Aliceが参加者リストの下のほうにある招待ボタンをクリックすると、招待パネルが表示されます。
- 次に彼女は、招待パネルからCharlieを選びます。
- Charlieは、Meta Questヘッドセットの任意の場所から招待を受け取って、それを受け入れます。
- GroupPresenceJoinIntentを受け取ります。これは、その招待に基づいて、デスティネーションAPI名、ロビーID、マッチIDを設定するために使用されます。
- それによりNetworkLaunchカスタムイベントが発行されます。これは招待によって開始されたため、「青ルーム」のデスティネーションに関する情報、ロビーlobby_123、マッチBlueRoom_for_lobby_123という情報があるディープリンクメッセージが使用されます。
- これはマッチへの招待なので、Charlieのグループプレゼンスは、そのデスティネーションとロビーの情報で更新されます。
- しかし、CharlieのロビーセッションIDは変更されません。同じIDのままになり、IDがなかった場合は新しいものがランダムに生成されます。そのため彼のロビーセッションは、BobとAliceが共有するものとは異なっています(例: Lobby_456)。
- BlueRoom_for_Lobby_123というPhotonルームに接続すると、CharlieにBobがホストであることが知らされます。CharlieがBobに接続します。
- AliceとBobとCharlieが青ルームで共存状態になります。
友達やフォロワーをロビーに招待して、一緒にマッチに移動する
次のユースケースでは、あるユーザーが、現在自分がいるロビーに友達やフォロワーを招待し、パーティーを結成した後に、マッチデスティネーションに移動します。
- 彼らは青ルームを出てロビーに戻ります。
- 彼らのマッチIDがNULLに設定されます。
- AliceとBobは共有ロビーID「lobby_123」のAliceのロビーに戻ります。
- Charlieは彼自身のロビーID「lobby_456」に一人で戻ります。
- Aliceが自分のロビーからCharlieに招待を送ります。彼女は複数のマッチをまたいで一緒に移動し、同じロビーに戻るようにしたいと思っています。
- Charlieが招待を受け入れます。
- グループプレゼンス情報の設定に使用されるGroupPresenceJoinIntentを受け取ります。
- デスティネーションAPI名、ロビーID「lobby_123」、招待ディープリンクメッセージに基づくマッチID。
- これにより、BobのグループプレゼンスロビーIDが、AliceのロビーID「lobby_123」に更新されます。
- これにより彼はPhotonルームに関連付けられます。
- Charlieのグループプレゼンスが更新され、ロビーIDがAliceとBobのものと同じになります。
- AliceとBobとCharlieはロビーに同時に存在しており、一緒にマッチに参加した後、同じロビーに戻ることができます。
進行中のマッチに途中参加しようとする、またはユーザーが参加不可のデスティネーションにいる
次のユースケースは、ユーザーが進行中のロビーやセッションに参加しようとしている場合、または参加不可のデスティネーション(メインメニューやオプションメニュー)にいるときの例です。
- Aliceは、友達リストでBobの現在のデスティネーションを明らかにしているグループプレゼンスによって、Bobが現在ゲームロビーにいることがわかりました
- Bobは現在参加不可のゲーム状態にあるため、彼のグループプレゼンスis_joinableはfalseに設定されています
- Bobのis joinableがfalseに設定されているため、AliceはBobが現在いるデスティネーションでBobに合流することができません。
- マッチやセッションが進行中でも参加可能なデスティネーションにBobがいる場合は、彼のis_joinableはtrueに設定されたままになります
- Aliceが参加しようとすると、Bobの現在のデスティネーションでGroupPresenceJoinIntentを受け取ります
- Bobの現在のゲームセッションは一時停止され、Bobとほかのパーティーメンバーはロビーに戻されます
- Aliceがルームに参加すると、彼女のロビーIDはボブのロビーIDと同じに設定されます
- AliceはBobとその他ロビーにいるメンバーと共存関係になります
- AliceとBobがグループとして一緒にゲームやアプリの体験を進めることができるようになりました