本文へスキップ
バージョン: 3.6

ネットコードで共有オブジェクトを表示する方法

マルチプレイヤーエクスペリエンスでは、Shared ARエクスペリエンス中に複数のユーザーに同じオブジェクトを同じ現実世界の場所に表示し、同期を保つ必要がある。 また、プレーヤーの実世界のデバイス位置を追跡して、ターゲットとして使用したり、デバイス同士の相対的な位置を取得したり、プレーヤーのステータスを表示したり、その他のエフェクトを追加したりすることもできます。

前提条件

  1. 共有AR体験の作り方については、共有ARの使い方を参照し、GameObjectsのNetcode、特にObject Spawnningと Owner Authoritative Modeについてよく理解してください。
  2. VPSコロカライゼーションまたはイメージトラッキングコロカライゼーションのいずれかを使用する。

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

NetcodeのObject Spawnningを使えば、Shared AR体験を使っている全員が同じ場所にオブジェクトを表示できる。 以下の手順に従ってください:

  1. NetworkObject コンポーネントを追加する代わりに、 LightshipNetworkObjectを追加する以外は、 Network Spawning Object をUnityに登録する手順に従ってください。 (これにより、 NetworkObjectも自動的に追加される)。

    共有ネットワークオブジェクト
  2. NGO Objectと同じようにオブジェクトをインスタンス化し、スポーンします。

  3. インスタンス化され、スポーンされると、オブジェクトはシーン内の XR Origin > Trackables > Persistent Anchor > ARLocation > SharedArRoot の下に表示され、同じLightship Room内のすべての接続されたデバイス上のUnityシーンの Hierarchy に表示されます。

    Shared NetworkObjects

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

Owner Authoritative Mode を使用して、 NGO Object を使用し、ピアデバイスの位置を同期することができます。 これを利用して、選手のアバターを正しい位置に表示することができる。 以下の手順に従ってください:

  1. プレハブを作成し、 NetworkManager にプレーヤープレハブとして登録します。
  2. NetworkTransform を拡張する ClientNetworkTransform Component を、クライア ント権限を持つプレーヤ アバター用のプレーヤ プレハブに追加します。
  3. カメラのトランスフォームをコピーして位置トランスフォームを更新する 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();
    }
    }
  4. このサンプルをビルドし、2台のデバイスで同時に実行します。 セッション内の各デバイスにプレーヤープレファブが表示されるはずです。

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

  • NetworkTransform、NetworkVariablesの使用と変更を最小限に抑える。
    • NetworkTransformを使用して、多くの動くオブジェクトを同期させたり、高い周波数で同期させたりすると、コストがかかることがある。 ネットワークトラフィックを節約するために、補間による更新頻度を低くすることは有効である。
    • Netcode NetworkManagerのネットコード更新頻度を調整できる。 NetworkManagerパネルで "Tick Rate "フィールドを見つける。 デフォルトは毎秒30回。 これは更新頻度全体をコントロールするものであることに留意してほしい。

    Shared NetworkObjects