Netcodeを使用して共有ARシーンをセットアップする
共有ARは、マルチプレイヤーのAR体験を作成できるARとネットワーク機能の集合です。 この入門ガイドでは、ネットワークマルチプレイヤーの設定、現実世界のトラッキングの有効化、そしてUnityのNetcode for GameObjectsを使用してLightship Network Serverに接続する方法について学びます。
前提条件
- Lightship ARを有効にしたUnityプロジェクト(../../setup.mdx)が必要です。
- Shared-ARプラグインをインストール](../../setup.mdx#setting-up-lightship-ardk)する必要があります。
- ARSessionとXROrigin](../../setup.mdx#setting-up-a-basic-ar-scene)を持つARシーンが必要です。
- UnityドキュメントのGet started with NGOを参照して、Netcode for Gameobjectsの概念と使用方法を理解しておきます。
シーンにコンポーネントを追加する
共有ARを使用するには、Unityシーンに以下のコンポーネントを追加する必要があります。
-
Network Manager オブジェクトをシーンのルートに追加します。
- Hierarchy でARシーン内を右クリックし、 Create Empty を選択します。 新しいGameObjectに NetworkManager という名前を付けます。
-
NetworkManager
GameObjectに NetworkManager コンポーネントを追加します。- Hierarchy で、 NetworkManager を選択します。
- Inspector 画面で Add Component をクリックします。
- 検索ボックスに「Network Manager」と入力し、選択して追加する。
- Network Transport の下にある Select transport... をクリックし、 LightshipNetcodeTransport を選択します。 これで、 Lightship Netcode Transport コンポーネントが自動的に追加されます。
-
次のように、 SharedSpaceManager コンポーネントを XROrigin に追加します。
-
Hierarchy のARシーンで、
XR Origin
を選択します。 -
Inspector 画面で Add Component をクリックします。
-
検索ボックスに「Shared Space Manager」と入力し、表示されたものを選択して
XR Origin
に追加します。 -
Shared Space Managerで、 Colocalization Type を Mock Colocalization に設定します。 VPS Colocalization、またはImage Tracking Colocalizationを使用する際は、必ず対応するColocalization Type(コロカライゼーションタイプ)に変更してください。
-
SharedSpaceManagerを使用してNetcodeセッションを開始する
SharedSpaceManager
を使用して、ユーザーが接続し、ネットワークセッションを開始できるように、シーンとコードを設定します。
SharedARのUIとマネージャーを設定するには、次の手順を行います。
-
Hierarchy でARシーンを右クリックし、 UI メニューを開いて、 Button - TextMeshPro を選択してボタンを追加します。 この手順を繰り返し、もう1つのボタンとテキストフィールドを追加します。 ボタンはホストとクライアントが参加するために使用し、テキストフィールドは接続状況の出力に使用します。 ボタンに
JoinAsHost
とJoinAsClient
、テキストフィールドにLocalizationStatusText
を設定します。 -
Hierarchy でARシーンのルートを右クリックし、 Create Empty を選択します。 新しいオブジェクトに
NetworkDemo
という名前を付けます。 -
Project ウィンドウの Assets フォルダで右クリックし、 Create メニューを開いて C# Script を選択します。 新しいスクリプトに
NetworkDemoManager.cs
という名前を付けます。NetworkDemoManager.cs
を開き、コードを以下のスニペットに置き換え、UI要素とSharedSpaceManager
を初期化します。
using Niantic.Lightship.SharedAR.Colocalization;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
public class NetworkDemoManager : MonoBehaviour
{
[SerializeField]
private Text _statusText;
[SerializeField]
private Button _joinAsHostButton;
[SerializeField]
private Button _joinAsClientButton;
[SerializeField]
private SharedSpaceManager _sharedSpaceManager;
}
void Start()
{
// We will fill this in later!
} -
次のように、
NetworkDemoManager.cs
のフィールドをNetworkDemo
に接続します。- Hierarchy のARシーンで、 NetworkDemo コンポーネントを選択します。
- Inspector 画面で Add Component をクリックします。
- 検索ボ ックスに「Network Demo Manager」と入力し、それを選択して追加します。
- テキストフィールドやボタンと、
SharedSpaceManager
を含む XR Origin を、 Hierarchy から Network Demo Manager コンポーネント内の対応するフィールドにドラッグ&ドロップします。 これで、NetworkDemo
は次のように表示されます。
ルームの作成とイベントの処理
次に、マルチプレイヤールームを作成し、ユーザー接続などの共有ARイベントを処理するためのコードをスクリプトに追加します。 Network Demo Managerをマルチプレイヤー対応にするために、次の手順を行います。
-
次の手順で、コードスニペットを
NetworkDemoManager.cs
に追加し、ルームへの接続準備を行います。ISharedSpaceTrackingOptions.CreateMockTrackingOptions()
を呼び出して、ルームのトラッキングオプションを作成します。ISharedSpaceRoomOptions.CreateLightshipRoomOptions()
を使用してルームオプションを作成し、マルチプレイヤールームをインスタンス化します。- SharedSpaceManager に
sharedSpaceManagerStateChanged
イベントのハンドラを追加します。 最後に、次のコードスニペットをコピーしてこの機能をNetworkDemoManager.cs
に追加します。
protected void Start()
{
// Set room to join
var mockTrackingArgs = ISharedSpaceTrackingOptions.CreateMockTrackingOptions();
var roomArgs = ISharedSpaceRoomOptions.CreateLightshipRoomOptions(
"ExampleRoom", // use fixed room name
32, // set capacity to max
"vps colocalization demo (mock mode)" // description
);
_sharedSpaceManager.StartSharedSpace(mockTrackingArgs, roomArgs);
}
次に、重要なイベントについて説明し、イベント処理のコードをNetwork Demo Managerスクリプトに追加します。
- トラッキングステータスが変更されると、
SharedSpaceManager.sharedSpaceManagerStateChanged
が呼び出されます。 このイベントを監視し、トラッキングが良好な状態になるまで待ってから進めることで、ユーザーはトラッキングの動作に集中できるだけでなく、視覚コンテンツが不適切に動く可能性を減らすことができます。 Mock Colocalization Modeでは、このイベントはすぐに呼び出されます。 - 接続が確立されると、
NetworkManager.OnClientConnectedCallback
が呼び出されます。 ここでは、シングルトンバージョンであるNetworkManager.Singleton.OnClientConnectedCallback
にコールバックを設定し、接続するプレイヤーをホストがキャッチできるようにしています。 (プレイヤーがクライアントの場合、このイベントはホストが参加したときに呼び出されます。) この例では、新しい接続があることをユーザーに通知するテキストも追加されています。 - ホストとしてNetcodeセッションを開始するには、
NetworkManager.Singleton.StartHost
を呼び出します。 クライアントとして開始するには、NetworkManager.Singleton.StartClient
を呼び出します。 この例では、これらのイベントをそれぞれのボタンに追加することで、ユーザーは適切にホストやクライアントとして参加することができます。
クリックしてNetworkManagerスクリプトを表示
```cs
protected void Start()
{
// UI event listeners
_joinAsHostButton.onClick.AddListener(OnJoinAsHostClicked);
_joinAsClientButton.onClick.AddListener(OnJoinAsClientClicked);
// Netcode connection event callback
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnectedCallback;
// Set SharedSpaceManager and start it
_sharedSpaceManager.sharedSpaceManagerStateChanged += OnColocalizationTrackingStateChanged;
// Set room to join
var mockTrackingArgs = ISharedSpaceTrackingOptions.CreateMockTrackingOptions();
var roomArgs = ISharedSpaceRoomOptions.CreateLightshipRoomOptions(
"ExampleRoom", // use fixed room name
32, // set capacity to max
"vps colocalization demo (mock mode)" // description
);
_sharedSpaceManager.StartSharedSpace(mockTrackingArgs, roomArgs);
}
private void OnColocalizationTrackingStateChanged(
SharedSpaceManager.SharedSpaceManagerStateChangeEventArgs args)
{
if (args.Tracking)
{
_joinAsHostButton.gameObject.SetActive(true);
_joinAsClientButton.gameObject.SetActive(true);
}
}
private void OnJoinAsHostClicked()
{
NetworkManager.Singleton.StartHost();
HideButtons();
}
private void OnJoinAsClientClicked()
{
NetworkManager.Singleton.StartClient();
HideButtons();
}
private void HideButtons()
{
_joinAsHostButton.gameObject.SetActive(false);
_joinAsClientButton.gameObject.SetActive(false);
}
private void OnClientConnectedCallback(ulong clientId)
{
Debug.Log($"Client connected: {clientId}");
}
```
ホストはユーザー1人であり、残りのユーザーはクライアントであることを確認してください。
Network Demo Managerの最終スクリプト
この時点で、 NetworkDemoManager.cs
は次のようになります。
クリックして、Network Demo Managerの最終コードを表示
using Niantic.Lightship.SharedAR.Colocalization;
using Unity.Netcode;
using UnityEngine;
using UnityEngine.UI;
public class NetworkDemoManager : MonoBehaviour
{
[SerializeField]
private Text _statusText;
[SerializeField]
private Button _joinAsHostButton;
[SerializeField]
private Button _joinAsClientButton;
[SerializeField]
private SharedSpaceManager _sharedSpaceManager;
protected void Start()
{
// UI event listeners
_joinAsHostButton.onClick.AddListener(OnJoinAsHostClicked);
_joinAsClientButton.onClick.AddListener(OnJoinAsClientClicked);
// Netcode connection event callback
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnectedCallback;
// Set SharedSpaceManager and start it
_sharedSpaceManager.sharedSpaceManagerStateChanged += OnColocalizationTrackingStateChanged;
// Set room to join
var mockTrackingArgs = ISharedSpaceTrackingOptions.CreateMockTrackingOptions();
var roomArgs = ISharedSpaceRoomOptions.CreateLightshipRoomOptions(
"ExampleRoom", // use fixed room name
32, // set capacity to max
"shared ar demo (mock mode)" // description
);
_sharedSpaceManager.StartSharedSpace(mockTrackingArgs, roomArgs);
}
private void OnColocalizationTrackingStateChanged(
SharedSpaceManager.SharedSpaceManagerStateChangeEventArgs args)
{
// Show Join UI
if (args.Tracking)
{
_joinAsHostButton.gameObject.SetActive(true);
_joinAsClientButton.gameObject.SetActive(true);
}
}
private void OnJoinAsHostClicked()
{
NetworkManager.Singleton.StartHost();
HideButtons();
}
private void OnJoinAsClientClicked()
{
NetworkManager.Singleton.StartClient();
HideButtons();
}
private void HideButtons()
{
_joinAsHostButton.gameObject.SetActive(false);
_joinAsClientButton.gameObject.SetActive(false);
}
private void OnClientConnectedCallback(ulong clientId)
{
_statusText.text = $"Connected: {clientId}";
}
}
次のステップ
NetcodeでVPS Colocalizationを使用してARマルチプレイヤーを開始する方法については、How to use VPS Colocalization with Netcodeを参照してください。