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 という名前を付けます。
 
- 
NetworkManagerGameObjectに 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を参照してください。