Netcodeを使って共有オブジェクトを表示する
ARのマルチプレイ体験では、複数のユーザー向けに現実世界の同じ位置に仮想オブジェクトを表示し、同期した状態を保つ必要があります。 UnityのNetcode for Game Objects(NGO)システムを使用すると、プレイヤーの現実世界のデバイスの位置をターゲットとして追跡したり、デバイス間の位置関係を取得したり、プレイヤーのステータスを表示したり、その他のエフェクトを追加することができます。
前提条件
- この入門ガイドでは、 Netcodeを使用して共有ARシーンをセットアップする のプロジェクトをベースとして使用しています。 完了していない場合は、まずこのページの手順を実施してください。
- プロジェクトには、 VPS Colocalization または Image Tracking Colocalization(画像追跡コロカライゼーション ) のいずれかが必要です。
- Netcode for Game Objectsを使い慣れていない場合は、開始する前に Object Spawning(オブジェクトのスポーン) と Owner Authoritative Mode(所有者権限モード) を読んでおくことをお勧めします。
共有ネットワークオブジェクトの表示
Netcodeの オブジェクトのスポーン システムを使用すると、同じ共有AR体験内で全員が同じ場所にオブジェクトを表示することができます。
共有ネットワークオブジェクトを作成して表示するには、次の手順を行います。
-
Unityで ネットワークスポーン用のプレハブを登録する の手順を行います。
- NetworkObject コンポーネントを追加するよう指示された場合は、代わりに LightshipNetworkObject を追加します。 (これで、 NetworkObject も自動的に追加されます)。
-
NGO Object と同様に、オブジェクトをインスタンス化し、スポーンします。
-
オブジェクトがインスタンス化され、スポーンされると、 Hierarchy 内の XR Origin > Trackables > Persistent Anchor > ARLocation > SharedArRoot に表示されます。 このオブジェクトは、同じLightship Roomに接続されているすべてのデバイスに表示されます。
デバイスの位置を他のデバイスと同期させる
Owner Authoritative Mode(所有者権限モード) の NGO Object を使用して、ピアデバイスの位置を同期し、その位置にプレイヤーのアバターを表示することができます。
デバイスの位置を同期するには、以 下の手順を行います。
-
プレイヤーの位置を追跡するためのプレハブを作成します。 (VPS Colocalizationの の一部として、既にこのプロセスを行った場合は、この手順を省略しても構いません)。
- Hierarchy でARシーンを右クリックし、 Create Empty を選択します。 新しいオブジェクトに
playerPrefab
という名前を付けます。 playerPrefab
を Hierarchy から Project ウィンドウの Assets フォルダにドラッグしてプレハブにし、シーンから削除します。
- Hierarchy でARシーンを右クリックし、 Create Empty を選択します。 新しいオブジェクトに
-
Hierarchy で NetworkManager を選択し、 Inspector で
playerPrefab
を割り当てます。 -
ClientNetworkTransform
コンポーネントを NetworkTransform に追加して、プレイヤープレハブに拡張します。これで、クライアント権限のプレイヤーアバターが作成されます。 -
以下の
NetworkBehaviour
スクリプトをplayerPrefab
に追加します。 このスクリプトでは、カメラからトランスフォームをコピーして位置を更新します。クリックしてNetworkBehaviourスクリプトを表示
// Copyright 2023 Niantic, Inc. All Rights Reserved.
using Unity.Netcode.Components;
using UnityEngine;
public class PlayerAvatar: NetworkTransform
{
[HideInInspector]
private Transform _arCameraTransform;
protected override bool OnIsServerAuthoritative()
{
return false;
}
public override void OnNetworkSpawn()
{
if (IsOwner)
{
if (Camera.main)
{
_arCameraTransform = Camera.main.transform;
}
}
base.OnNetworkSpawn();
}
new void Update()
{
if (IsOwner)
{
if (_arCameraTransform)
{
// Get local AR camera transform
_arCameraTransform.GetPositionAndRotation(out var pos, out var rot);
// Since using the ClientNetworkTransform, just update world transform of the cube matching with the
// AR Camera's worldTransform. it's local transform will be synced.
transform.SetPositionAndRotation(pos, rot);
}
}
base.Update();
}
} -
このサンプルをビルドし、2台のデバイスで同時に実行します。 セッション内で、各デバイスにプレイヤーアバターが表示されます。
効率的に同期するためのヒント
NetworkTransform
やNetworkVariables
の使用や変更を最小限に抑える:NetworkTransform
を使用して動くオブジェクトを同期させたり、頻繁に同期処理を行うとネットワークに負荷がかかり、パフォーマンスに影響が生じることがあります。 更新頻度を減らし、補間を使用してギャップを埋めることで、同期による負荷を抑えるのに役立ちます。- Netcode
NetworkManager
の更新頻度も調整できます。 Hierarchy で NetworkManager を選択し、 Inspector で Tick Rate フィールドを探します。 デフォルトの更新頻度は1秒あたり30回に設定されていますが、必要に応じてこの数値を下げ、同期頻度を減らすことができます。