本文へスキップ

Netcodeを使って共有オブジェクトを表示する

ARのマルチプレイヤー・エクスペリエンスでは、複数のユーザーが同じ現実世界の場所に仮想オブジェクトを表示し、同期を保つ必要がある。 UnityのNetcode for Game Objects (NGO)システムを使えば、プレイヤーの実世界のデバイス位置をトラッキングしてターゲットとして使ったり、デバイス同士の相対位置を取得したり、プレイヤーのステータスを表示したり、その他のエフェクトを追加したりすることもできます。

前提条件

  1. このHow-Toでは、Shared ARとNetcodeのプロジェクトをベースとしています。 まだ完了していない場合は、そこから始めてください。
  2. あなたのプロジェクトには、VPSコロカライゼーションか イメージトラッキングコロカライゼーションが必要です。
  3. ゲームオブジェクトのネットコードに慣れていない場合は、始める前に「オブジェクトのスポーン」と「オーナーの権限モード」をお読みください。

共有ネットワークオブジェクトの表示

NetcodeのObject Spawnningシステムを使えば、同じShared AR体験の中で、全員が同じ場所にオブジェクトを表示することができる。

共有ネットワーク・オブジェクトを作成して表示するには

  1. Unityでネットワークをスポーンするプレハブを登録する手順です。

    1. NetworkObjectComponent を追加するように指示されたら、代わりにLightshipNetworkObject を追加します。 (これでNetworkObjectも自動的に追加される)。
    共有ネットワークオブジェクト
  2. NGOオブジェクトと同じようにオブジェクトをインスタンス化し、スポーンする。

  3. オブジェクトがインスタンス化され、スポーンされると、XR Origin > Trackables > Persistent Anchor > ARLocation > SharedArRootの下の階層に表示されます。 同じライトシップ・ルーム内のすべての接続機器に表示されるはずです。

    共有ネットワークオブジェクト

デバイスの位置を他のデバイスと同期させる

オーナー権限モードのNGOオブジェクトを使用して、ピアデバイスの位置を同期し、その位置にプレーヤーのアバターを表示することができます。

デバイスの位置を同期させる:

  1. 選手のポジションを追跡するプレハブを作成する。 (VPS Colocalizationの一環として既にこの作業を行った場合は、この手順を省略できます):

    1. 階層で、ARシーンの下を右クリックし、Create Emptyを選択します。 新しいオブジェクトにplayerPrefab という名前を付けます。
    2. playerPrefabを Hierarchyから ProjectウィンドウのAssetsフォルダにドラッグしてプレハブにし、シーンから削除します。
  2. Hierarchyで NetworkManagerを選択し、Inspectorで playerPrefabを割り当てます。

  3. NetworkTransformに ClientNetworkTransformComponentを追加して、プレーヤープレファブに拡張し、クライアント権限のあるプレーヤアバターを作成します。

  4. 以下の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();
    }
    }
  5. このサンプルをビルドし、2台のデバイスで同時に実行します。 セッション内の各デバイスにプレーヤーアバターが表示される必要があります。

効率的な同期のためのヒント

  • NetworkTransformと NetworkVariablesの使用と変更を最小限に抑える:
    • NetworkTransformを使って動くオブジェクトを同期させたり、高い周波数で同期させたりすると、コストがかかることがある。 更新頻度を減らし、ギャップを埋めるために補間を使うことで、同期コストを削減することができる。
    • NetcodeNetworkManagerの更新頻度も調整できます。 HierarchyNetworkManager を選択し、InspectorTick Rateフィールドを見つけます。 デフォルトの更新頻度は毎秒30回だが、必要であればこれを下げて同期頻度を下げることもできる。

共有ネットワークオブジェクト