WayspotAnchorControllerを使用する

WayspotAnchorController には、Wayspot Anchorsを操作するための低レベルのインターフェイスが付属しています。 WayspotAnchorController を使用する場合は、必要に応じて作成または復元されたアンカーのキャッシュを維持し、アンカーのVPSイベントをすべて処理する必要があります。

WayspotAnchorController の使用例については、 Assets/ARDK/AR/WayspotAnchors/WayspotAnchorService.cs のARDKソースコード内の WayspotAnchorService の実装をご参照ください。

アンカーのキャッシュ方法のカスタマイズが不要な場合や、アンカーイベントを処理しない場合は、 WayspotAnchorController の代わりに、 WayspotAnchorService インターフェイスを使用してください。 WayspotAnchorService の詳しい使用方法については、 WayspotAnchorServiceを使用する をご参照ください。

Wayspot Anchorを作成する

Wayspot Anchorを作成するには、以下の手順で行います。

  1. WayspotAnchorController.WayspotAnchorsCreated イベントをサブスクライブします。ARDKイベントの詳細については、 ARDKイベントのサブスクライブ をご参照ください。

    WayspotAnchorController インスタンスを作成する場所には必ず、 WayspotAnchorController.WayspotAnchorsCreated のイベントハンドラを設定します。以下の例では、 HandleWayspotAnchorsCreated ハンドラ(後述)を設定します。

    WayspotAnchorController _wayspotAnchorController;
    
    _wayspotAnchorController.WayspotAnchorsCreated += HandleWayspotAnchorsCreated;
    
  2. ローカル座標空間内の特定の位置に新しいアンカーを作成します。

    ローカル座標空間内の1つ以上のアンカーの位置と向きのリストを指定して WayspotAnchorController.CreateWayspotAnchors() を呼び出します。アンカーを作成する前に、現在のローカライゼーションのステータスが LocalizationState.Localized であることを確認してください。この呼び出しによって、VPSバックエンドにリクエストが行われ、VPSが作成するアンカーのIDの配列が返ります。

    using Niantic.ARDK.AR.WayspotAnchors;
    
    private void PlaceWayspotAnchors(params Matrix4x4[] localPoses)
    {
        // ...Verified we've localized with a VPS-activated Wayspot, the most recent WayspotController.LocalizationStateUpdated event should indicate LocalizationState.Localized...
    
        var ids = _wayspotAnchorController.CreateWayspotAnchors(localPoses);
    
        // ...optionally cache IDs if you need to track successful or failed creations...
    }
    
  3. 作成したアンカーを WayspotAnchorsCreated イベントハンドラで処理する

    VPSによってアンカーが作成されると、 WayspotAnchorController によって WayspotAnchorsCreated イベントが作成されます。このイベントデータには、アンカー毎の IWayspotAnchor が含まれ、これにはアンカーが正常に作成されたかどうかの情報と、追加のアンカーデータが含まれます。

    以下のハンドラ例では、 IWayspotAnchor と、ID(アンカーが正常に作成された場合)をキャッシュしています。また、VPSで、作成されたアンカーの追跡が開始されるように WayspotAnchorController.ResumeTracking() を呼び出します。

    using Niantic.ARDK.AR.WayspotAnchors;
    
    private Dictionary<Guid, IWayspotAnchor> _wayspotAnchors;
    
    private void HandleWayspotAnchorsCreated(WayspotAnchorsCreatedArgs wayspotAnchorsCreatedArgs)
    {
        var wayspotAnchors = wayspotAnchorsCreatedArgs.WayspotAnchors;
        foreach (var wayspotAnchor in wayspotAnchors)
        {
            // Look up anchor.ID in our cache, add associated IWayspotAnchor
            if (!_wayspotAnchors.ContainsKey(wayspotAnchor.ID))
            {
                // Check if VPS couldn't restore the anchor
                if (wayspotAnchor.Status == WayspotAnchorStatusCode.Failed) {
                    // ...handle failed anchor restore condition...
                    continue;
                }
                _wayspotAnchors.Add(wayspotAnchor.ID, wayspotAnchor);
            }
            Debug.Log($"Created wayspot anchor {wayspotAnchor.ID}");
        }
        // Start tracking created anchors
        _wayspotAnchorController.ResumeTracking(wayspotAnchors);
    }
    
  4. アンカーに関連付けるGameObjectを作成します。

    正常に作成されたアンカーで IWayspotAnchor を取得したら、シーンにGameObjectを作成して、仮想オブジェクトをアンカーに関連付けることができます。次の例では、 _anchorPrefab のGameObjectをインスタンス化し、 WayspotAnchorTracker を使用してGameObjectをアンカーと関連付けています。

    using Niantic.ARDK.Extensions;
    
    private GameObject CreateWayspotAnchorGameObject
    (
        IWayspotAnchor anchor,
        Vector3 position,
        Quaternion rotation,
        bool startActive
    )
    {
        var go = Instantiate(_anchorPrefab, position, rotation);
    
        var tracker = go.GetComponent<WayspotAnchorTracker>();
        if (tracker == null)
        {
            tracker = go.AddComponent<WayspotAnchorTracker>();
        }
    
        tracker.gameObject.SetActive(startActive);
        tracker.AttachAnchor(anchor);
    
        return go;
    }
    
  5. アンカーペイロードを保存します。

    作成された IWayspotAnchor には Payload が含まれます。このバイナリブロブは、以前に作成したアンカーを復元する場合や、他のユーザーとアンカーを共有する場合のために保存しておく必要があります。このペイロードは、VPSで作成され、 IWayspotAnchor.StatusSuccess または Limited の場合のみ使用することができます。Wayspot Anchorのシリアライズやデシリアライズを行う方法については、 Wayspot Anchorsの永続化と共有 をご参照ください。

  6. アンカーの位置更新を追跡します。

    Wayspot Anchorが正常に作成されたら、アンカーの TransformUpdated イベントをサブスクライブして、ユーザーの動きに合わせてアンカーの位置や向きをVPSから修正してください。これを行う方法については アンカートラッキングの更新を処理する をご参照ください。

以前に作成したWayspot Anchorを復元する

以前に作成したWayspot Anchorを復元するには、次の手順で行います。

  1. アンカーを復元するには、アンカーペイロードを使用します。

    復元するアンカーを示す1つ以上のアンカーペイロードのリストを指定して、 WayspotAnchorController.RestoreWayspotAnchors() を呼び出します。 RestoreWayspotAnchors() より、 IWayspotAnchors の配列が返ります。

    以下の例では、事前にシリアライズしたペイロードの配列を使用して RestoreWayspotAnchors() を呼び出し、復元された各アンカーの位置追跡を有効にし、復元されたアンカーをシンプルなキャッシュに追加しています。

    using Niantic.ARDK.AR.WayspotAnchors;
    
    private Dictionary<Guid, IWayspotAnchor> _wayspotAnchors;
    
    // Deserialize/load saved payloads, using WayspotAnchorPayload.Deserialize() as needed
    // var payloads = ...load payloads...
    if (payloads.Length > 0)
    {
        var wayspotAnchors = _wayspotAnchorController.RestoreWayspotAnchors(payloads);
    
        // Resume tracking restored anchors
        _wayspotAnchorController.ResumeTracking(wayspotAnchors);
    
        // Add restored IDs and IWayspotAnchors to cache
        foreach (var wayspotAnchor in wayspotAnchors)
        {
            // Look up anchor.ID in our cache, add associated IWayspotAnchor
            if (!_wayspotAnchors.ContainsKey(wayspotAnchor.ID))
            {
                // Check if VPS couldn't restore the anchor
                if (wayspotAnchor.Status == WayspotAnchorStatusCode.Failed) {
                    // ...handle failed anchor restore condition...
                    continue;
                }
                _wayspotAnchors.Add(wayspotAnchor.ID, wayspotAnchor);
            }
            Debug.Log($"Restored wayspot anchor {wayspotAnchor.ID}");
        }
    }
    

    以前のWayspot Anchorペイロードをロードする必要がある場合は、 Wayspot Anchorsの永続化と共有 を参照の上、Wayspot Anchorsのシリアライズとデシリアライズの方法をご覧ください。

  2. アンカーの位置更新を追跡します。

    Wayspot Anchorが正常に復元されたら、アンカーの TransformUpdated イベントをサブスクライブして、ユーザーの動きに合わせてアンカーの位置や向きをVPSから修正する必要があります。これを行う方法については、 アンカートラッキングの更新を処理する をご参照ください。

Wayspot Anchorのトラッキングを一時停止する

AR体験では多数のWayspot Anchorsが使用されますが、関連するゲームオブジェクトを常にトラッキングして表示する必要はありません。たとえば、ゲームの特定のモードでプレイヤーの配置を視覚化するためのゲームオブジェクトがありますが、他のゲームモードではトラッキング(または表示)する必要がない場合があります。このような場合には、VPS Wayspot Anchorsのトラッキングを一時停止することで、計算やネットワークによるオーバーヘッドを削減できます。

アンカーのトラッキングを一時停止するには、トラッキングが不要なWayspotのアンカーを指定して WayspotAnchorController.PauseTracking() を使用します。これらのアンカーのトラッキングを再開する必要がある場合は、一時停止したWayspotのアンカーを指定して WayspotAnchorController.ResumeTracking() を使用してください。

using Niantic.ARDK.AR.WayspotAnchors;

IWayspotAnchor[] wayspotAnchors;

// ...populate wayspotAnchors array with IWayspotAnchors you want to pause...

// Pause tracking on anchors in the wayspotAnchors array
_wayspotAnchorController.PauseTracking(wayspotAnchors);

VPSセッションを停止する

Wayspot Anchorsを作成やトラッキングが不要になった場合は、ARセッションを停止せずにVPSサービスを停止することができます。この操作は、VPSが作動したWayspotの近くにユーザーがいないときにAR機能を提供する必要がある場合に必要になることがあります。たとえば、ユーザーがVPSが作動したさまざまなWayspot間を移動しているが、AR深度やARメッシングを使って仮想オブジェクトを表示する場合などがあります。

また、アプリにローカライズの問題が発生した場合に、VPSセッションの停止や再起動が必要になる場合があります。VPSを再起動する必要がある場合の例については、 VPSを使ってローカライズする の「ローカライゼーションフローを理解する」を参照してください。また、VPSセッションを再起動する際の詳細については、 VPSを使ってローカライズする の「VPSを再起動する」を参照してください。

WayspotAnchorController.StopVps() を使用して、VPSセッションを停止します。進行中のWayspot Anchorの作成やトラッキングはキャンセルされます。