Hlapiに関するよくある質問
高レベルネットワークAPIに関するよくある質問。
ネットワーク化されたUnityオブジェクト
独自のNetworkedBehaviourはどのように作成できますか?
MonoBehaviourを拡張するとスクリプトによってUnityのイベントやシステムと統合できるように、NetworkedBehaviourを拡張することでHlapiと統合できるようになります。(エディタ経由で)NetworkedUnityObjectにアタッチされ、そのオブジェクトの Behaviours
リストに登録された NetworkedBehaviour
はそれぞれ、そのオブジェクトがネットワークでスポーンされるたびに自動的に初期化されます。これにより、指定の Group
にNetworkedDataHandlerを登録することができます。オブジェクトの寿命やタグ付けはHlapiで処理されるため、気にする必要はありません。
たとえば、次のスクリプトでは、Transform
や Color
の複製を設定する NetworkedBehaviour
を実装します。スポーンされた NetworkedUnityObject
にはそれぞれ固有の NetworkGroup
が割り当てられるため、これらのNetworkedDataHandlerに書き込むことで、他のデバイス上の相当するオブジェクトにのみ影響を与えます。
using System; using Niantic.ARDK.Networking; using Niantic.ARDK.Networking.HLAPI.Data; using Niantic.ARDK.Networking.HLAPI.Object; using Niantic.ARDK.Networking.HLAPI.Object.Unity; using Niantic.ARDK.Utilities; using UnityEngine; [RequireComponent(typeof(AuthBehaviour))] public sealed class SampleNetworkedBehaviour : NetworkedBehaviour { [SerializeField] private TransformPiece _replicatedPieces = TransformPiece.All; // Reference to the material on the GameObject [SerializeField] private Material _material; private UnreliableBroadcastTransformPacker _transformPacker; private NetworkedField<Color> _networkedColorField; // Define an initializer that will be run as soon as the NetworkedUnityObject // has been spawned protected override void SetupSession(out Action initializer, out int order) { initializer = () => { NetworkedDataDescriptor authToObserverDescriptor = Owner.Auth.AuthorityToObserverDescriptor(TransportType.UnreliableUnordered); // Create an UnreliableBroadcastTransformPacker that // replicates Position, Rotation, and Scale _transformPacker = new UnreliableBroadcastTransformPacker ( "NetTransform", gameObject.transform, authToObserverDescriptor, _replicatedPieces, Owner.Group ); _networkedColorField = new NetworkedField<Color> ( "color", authToObserverDescriptor, Owner.Group ); _networkedColorField.ValueChangedIfReceiver += OnColorFieldChanged; }; order = 0; } // When this is called by the peer that has the role Authority, all // Observing peers will receive a ValueChangedIfReceiver event private void UpdateColorForAllPeers(Color newColor) { _networkedColorField.Value = newColor; } private void OnColorFieldChanged(NetworkedFieldValueChangedArgs<Color> args) { Optional<Color> optionalValue = args.Value; if (!args.Value.HasValue) { return; } _material.color = args.Value.Value; } private void OnDestroy() { _transformPacker.Unregister(); _networkedColorField.Unregister(); } }
NetworkedDataDescriptorは何に使用しますか?
NetworkedDataDescriptor
は、認証済みの送受信者や、ネットワークプロトコルに関する情報を含む構造体です。事前に構築されたHlapiの NetworkedDataHandler
の多くでは、そのハンドラが意図する送受信パターンを定義するために、構築時に NetworkedDataDescriptor
が必要になります。
NetworkedDataDescriptorExtension
には、よく使用されるパターン(権限者→監視者、監視者→権限者、全員→全員)を生成するためのボイラープレートメソッドがいくつか用意されています。
メッセージの受け渡し
メッセージはどのように送信されますか?
Hlapiは、HlapiSessionの SendQueuedData
メソッドで呼び出されます。デフォルトではUnityのUpdateループごとに1回呼び出されます。 SendQueuedData
を呼び出す頻度を手動で制御するには、GetOrCreateManagedSession
ではなく、コンストラクターで HlapiSession
を作成します。
SendQueuedData
が呼び出されると、 HlapiSession
は現在登録されている NetworkedGroups
に対してそれぞれクエリを実行します。これにより、グループに登録されている NetworkedDataHandler
にそれぞれクエリが実行されます。そこから、 NetworkedDataHandler
はそれぞれ、ネットワーク上に送信すべきアップデート(位置のアップデートや新しいメッセージなど)があるかどうかを判断し、そのデータをオブジェクト(または特定のオブジェクト NetworkedDataHandlerBase.NothingToWrite
)として返します。
続いて、 NetworkGroup
ごとに、データをパッケージ化して に渡します。ここで照合され、必要なメタデータを付加してシリアライズ``HlapiSession``され、ネットワークを介して関連するピアに送信されます。
上記の処理はセッション内のピアごとに1回実行され、各 NetworkedDataHandler
はそのピアに送信するデータがあるかどうかを判断します。これにより、すべてのデータをすべてのピアに送信するのではなく、さまざまなピアが選択的に一部のメッセージを送受信することができます。
メッセージはどのように受け取りますか?
Hlapiは、Hlapiメッセージタグの付いたメッセージを受け取ると、そのメッセージが上記の形式でパッケージされたデータであると仮定し、メッセージに含まれるグループデータを解凍して、正しい NetworkGroup
に送ります。まだ HlapiSession
に登録されていない NetworkGroup
宛のメッセージを受け取った場合、そのメッセージはキャッシュに保存され、 NetworkGroup
が登録されると処理されます(ただし、この処理は TransportType
の信頼性が高い場合にのみ行われ、信頼性の低いメッセージは廃棄されます)。
そこから NetworkGroup
は、登録した NetworkedDataHandlers
に対して同様のメッセージの解凍とアドレス指定を行います(信頼性が高い場合は、未知のハンドラへのメッセージのキャッシュも行います)。最後に、 NetworkedDataHandlers
は相手から送信されたメッセージを他のデバイスから受信し、そのデータで処理を行います。たとえば、UnreliableBroadcastTransformPacker
は、受信するすべてのデータが PackedTransform
であり、そのGameObjectの更新位置が含まれることを把握しているのに対し、 GreedyAuthorityReplicator
は Role
の要求をピアから受信しようとしていることを把握しています。
Hlapiのメッセージはどのようにシリアライズされますか?
Hlapiでは、ARDKに付属している GlobalSerializerシステム が使用されます。