ネットコードで共有オブジェクトを表示する方法
ARのマルチプレイヤー・エクスペリエンスでは、複数のユーザーが同じ現実世界の場所に仮想オブジェクトを表示し、同期を保つ必要がある。 UnityのNetcode for Game Objects (NGO)システムを使えば、プレイヤーの実世界のデバイス位置をトラッキングしてターゲットとして使ったり、デバイス同士の相対位置を取得したり、プレイヤーのステータスを表示したり、その他のエフェクトを追加したりすることもできます。
前提条件
- このHow-Toでは、Shared ARとNetcodeのプロジェクトをベースとしています。 まだ完了していない場合は、そこから始めてください。
- あなたのプロジェクトには、VPSコロカライゼーションか イメージトラッキングコロカライゼーションが必要です。
- ゲームオブジェクトのネットコードに慣れていない場合は、始める前に「オブジェクトのスポーン」と「オーナーの権限モード」をお読みください。
共有ネットワークオブジェクトの表示
NetcodeのObject Spawnningシステムを使えば、同じShared AR体験の中で、全員が同じ場所にオブジェクトを表示することができる。
共有ネットワーク・オブジェクトを作成して表示するには
-
Unityでネットワークをスポーンするプレハブを登録する手順です。
- NetworkObjectComponent を追加するように指示されたら、代わりにLightshipNetworkObject を追加します。 (これでNetworkObjectも自動的に追加される)。
-
NGOオブジェクトと同じようにオブジェクトをインスタンス化し、スポーンする。
-
オブジェクトがインスタンス化され、スポーンされると、XR Origin > Trackables > Persistent Anchor > ARLocation > SharedArRootの下の階層に表示されます。 同じライトシップ・ルーム内のすべての接続機器に表示されるはずです。
デバイスの位置を他のデバイスと同期させる
オーナー権限モードのNGOオブジェクトを使用して、ピアデバイスの位置を同期し、その位置にプレーヤーのアバターを表示することができます。
デバイスの位置を同期させる:
-
選手のポジションを追跡するプレハブを作成する。 (VPS Colocalizationの一環として既にこの作業を行った場合は、この手順を省略できます):
- 階層で、ARシーンの下を右クリックし、Create Emptyを選択します。 新しいオブジェクトに
playerPrefab
という名前を付けます。 playerPrefabを
Hierarchyから ProjectウィンドウのAssetsフォルダにドラッグしてプレハブにし、シーンから削除します。
- 階層で、ARシーンの下を右クリックし、Create Emptyを選択します。 新しいオブジェクトに
-
Hierarchyで NetworkManagerを選択し、Inspectorで
playerPrefabを
割り当てます。 -
NetworkTransformに
ClientNetworkTransform
Componentを追加して、プレーヤープレファブに拡張し、クライアント権限のあるプレーヤアバターを作成します。 -
以下の
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フィールドを見つけます。 デフォルトの更新頻度は毎秒30回だが、必要であればこれを下げて同期頻度を下げることもできる。