本文へスキップ

Netcodeを使用して共有ARシーンをセットアップする

共有ARは、マルチプレイヤーのAR体験を作成できるARとネットワーク機能の集合です。 この入門ガイドでは、ネットワークマルチプレイヤーの設定、現実世界のトラッキングの有効化、そしてUnityのNetcode for GameObjectsを使用してLightship Network Serverに接続する方法について学びます。

SharedAR Set up video

前提条件

  1. Lightship ARを有効にしたUnityプロジェクト(../../setup.mdx)が必要です。
  2. Shared-ARプラグインをインストール](../../setup.mdx#setting-up-lightship-ardk)する必要があります。
  3. ARSessionとXROrigin](../../setup.mdx#setting-up-a-basic-ar-scene)を持つARシーンが必要です。
  4. UnityドキュメントのGet started with NGOを参照して、Netcode for Gameobjectsの概念と使用方法を理解しておきます。
注意!
Updating the Unity Transport package

シーンにコンポーネントを追加する

共有ARを使用するには、Unityシーンに以下のコンポーネントを追加する必要があります。

  1. Network Manager オブジェクトをシーンのルートに追加します。

    1. Hierarchy でARシーン内を右クリックし、 Create Empty を選択します。 新しいGameObjectに NetworkManager という名前を付けます。
  2. NetworkManager GameObjectに NetworkManager コンポーネントを追加します。

    1. Hierarchy で、 NetworkManager を選択します。
    2. Inspector 画面で Add Component をクリックします。
    3. 検索ボックスに「Network Manager」と入力し、選択して追加する。
    4. Network Transport の下にある Select transport... をクリックし、 LightshipNetcodeTransport を選択します。 これで、 Lightship Netcode Transport コンポーネントが自動的に追加されます。
    Adding the Lightship Netcode Transport
  3. 次のように、 SharedSpaceManager コンポーネントを XROrigin に追加します。

    1. Hierarchy のARシーンで、 XR Origin を選択します。

    2. Inspector 画面で Add Component をクリックします。

    3. 検索ボックスに「Shared Space Manager」と入力し、表示されたものを選択して XR Origin に追加します。

    4. Shared Space Managerで、 Colocalization TypeMock Colocalization に設定します。 VPS Colocalization、またはImage Tracking Colocalizationを使用する際は、必ず対応するColocalization Type(コロカライゼーションタイプ)に変更してください。

      Mock colocalization in SharedSpaceManager

SharedSpaceManagerを使用してNetcodeセッションを開始する

SharedSpaceManager を使用して、ユーザーが接続し、ネットワークセッションを開始できるように、シーンとコードを設定します。

SharedARのUIとマネージャーを設定するには、次の手順を行います。

  1. Hierarchy でARシーンを右クリックし、 UI メニューを開いて、 Button - TextMeshPro を選択してボタンを追加します。 この手順を繰り返し、もう1つのボタンとテキストフィールドを追加します。 ボタンはホストとクライアントが参加するために使用し、テキストフィールドは接続状況の出力に使用します。 ボタンに JoinAsHostJoinAsClient、テキストフィールドに LocalizationStatusText を設定します。

  2. Hierarchy でARシーンのルートを右クリックし、 Create Empty を選択します。 新しいオブジェクトに NetworkDemo という名前を付けます。

  3. Project ウィンドウの Assets フォルダで右クリックし、 Create メニューを開いて C# Script を選択します。 新しいスクリプトに NetworkDemoManager.cs という名前を付けます。

    1. 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!
    }
  4. 次のように、 NetworkDemoManager.cs のフィールドを NetworkDemo に接続します。

    1. Hierarchy のARシーンで、 NetworkDemo コンポーネントを選択します。
    2. Inspector 画面で Add Component をクリックします。
    3. 検索ボックスに「Network Demo Manager」と入力し、それを選択して追加します。
    4. テキストフィールドやボタンと、 SharedSpaceManager を含む XR Origin を、 Hierarchy から Network Demo Manager コンポーネント内の対応するフィールドにドラッグ&ドロップします。 これで、 NetworkDemo は次のように表示されます。
    Mock colocalization in SharedSpaceManager

ルームの作成とイベントの処理

次に、マルチプレイヤールームを作成し、ユーザー接続などの共有ARイベントを処理するためのコードをスクリプトに追加します。 Network Demo Managerをマルチプレイヤー対応にするために、次の手順を行います。

  1. 次の手順で、コードスニペットを NetworkDemoManager.cs に追加し、ルームへの接続準備を行います。

    1. ISharedSpaceTrackingOptions.CreateMockTrackingOptions() を呼び出して、ルームのトラッキングオプションを作成します。
    2. ISharedSpaceRoomOptions.CreateLightshipRoomOptions() を使用してルームオプションを作成し、マルチプレイヤールームをインスタンス化します。
    3. 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スクリプトに追加します。

  1. トラッキングステータスが変更されると、 SharedSpaceManager.sharedSpaceManagerStateChanged が呼び出されます。 このイベントを監視し、トラッキングが良好な状態になるまで待ってから進めることで、ユーザーはトラッキングの動作に集中できるだけでなく、視覚コンテンツが不適切に動く可能性を減らすことができます。 Mock Colocalization Modeでは、このイベントはすぐに呼び出されます。
  2. 接続が確立されると、 NetworkManager.OnClientConnectedCallback が呼び出されます。 ここでは、シングルトンバージョンである NetworkManager.Singleton.OnClientConnectedCallback にコールバックを設定し、接続するプレイヤーをホストがキャッチできるようにしています。 (プレイヤーがクライアントの場合、このイベントはホストが参加したときに呼び出されます。) この例では、新しい接続があることをユーザーに通知するテキストも追加されています。
  3. ホストとして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}";
}
}

SharedAR Set up video

次のステップ

NetcodeでVPS Colocalizationを使用してARマルチプレイヤーを開始する方法については、How to use VPS Colocalization with Netcodeを参照してください。