本文へスキップ

ロケーションARとコードを一緒に使用する

Using Location AR With Code

この入門ガイドでは、以下の内容について説明します。

  • ARLocationManagerパブリック API を使ったARLocationの管理と追跡
  • 登録されたARLocationに対する更新をリッスンする
  • ARLocationを基準としてコンテンツを配置する
  • ARセッション中にトラッキングされたARロケーションを切り替える

前提条件

  1. ARDKがインストールされたUnityプロジェクトと、セットアップされた基本的なARシーンが必要です。 詳しくは、ARDK 3のセットアップおよび基本ARシーンのセットアップを参照してください。
  2. APIキーを追加していない場合は、有効なAPIキーが必要です。
  3. この入門ガイドを進めるには、プロジェクトのARシーンに ARLocationManager が含まれている必要があります。 ARLocationManagerARLocation をプロジェクトに追加する方法については、現実世界の場所をUnityに追加するのステップ4をご覧ください。 (ARLocationの交換では、複数のARLocationが必要になります)。

トラッキングするARLocationを登録する

ARLocationManagerARLocation を追加するには、ARLocationManager` の SetARLocations を呼び出して設定します。

このメソッドを呼び出すたびに、以前に設定されたロケーションはすべてクリアされます。 SetARLocations()は、StartTracking()を呼び出す前にのみ呼び出すことができる。 トラッキングする ARLocation を設定したら、ARLocationManager の StartTracking() をコールしてトラッキングを開始します。

どの場所をトラッキングするかを設定したら、ARLocationManagerの StartTracking()をコールしてトラッキングを開始します。

備考

ARLocationは同時に5つまで登録できるが、トラッキングに成功した最初の1つだけが更新を報告する。 同時に複数のロケーションをトラッキングしようとすると、トラッキングに必要なネットワーク帯域幅が増加します。 ユーザーの位置が明確である場合や、特定の位置をターゲットにしている場合は、トラッキングするARロケーションを1つだけ登録することをお勧めします。 ターゲットが明確でない場合は、複数のロケーションを登録しておくと便利です。

using Niantic.Lightship.AR.LocationAR;
using UnityEngine;

public class ARLocationTracking : MonoBehaviour
{
[SerializeField]
private ARLocationManager ArLocationManager;

[SerializeField]
private ARLocation[] ArLocations;

public void StartTracking()
{
ArLocationManager.SetARLocations(ArLocations);
ArLocationManager.StartTracking();
}
}

登録されたARLocationに対する更新をリッスンする

登録された ARLocations の更新を受信して処理するには、locationTrackingStateChanged を購読します。

イベントの引数には、更新された ARLocation と、その現在のトラッキング状態を報告する Tracking という名前のブール値が含まれています。 複数のロケーションが登録されている場合、イベントは最初にトラッキングが開始された ARLocation でのみ発生します。 それ以外の ARLocations はすべて、追跡リストから自動的に削除されます。

クリックして、更新後のARLocationTrackingスクリプトを表示
using Niantic.Lightship.AR.LocationAR;
using UnityEngine;
using Niantic.Lightship.AR.PersistentAnchors;

public class ARLocationTracking : MonoBehaviour
{
[SerializeField]
private ARLocationManager ArLocationManager;

[SerializeField]
private ARLocation[] ArLocations;

private bool firstTrackingUpdateReceived = false;

public void StartTracking()
{
ArLocationManager.locationTrackingStateChanged += OnLocationTrackingStateChanged;
ArLocationManager.SetARLocations(ArLocations);
ArLocationManager.StartTracking();
}

private void OnLocationTrackingStateChanged(ARLocationTrackedEventArgs args)
{
var trackedLocation = args.ARLocation;
var isTracking = args.Tracking;

if (!firstTrackingUpdateReceived && isTracking){
Debug.Log("最初のトラッキング更新を受信しました");
firstTrackingUpdateReceived = true;
}

trackedLocation.gameObject.SetActive(isTracking);
}
}

このスニペットでは、ARLocationGameObject はトラッキング状態に応じて有効化または無効化されます。 これは、 ARLocation の仮想コンテンツが正しくトラッキングされなくなった場合に、トラッキングの損失を処理し、ARカメラフィードからずれてしまう可能性がある場合に役立ちます。

ARLocationを基準としてコンテンツを配置する

ランタイムに ARLocation を基準としてスポーンされた仮想コンテンツは、 ARLocationGameObject の子オブジェクトにする必要があります。 これにより、 ARLocation に対するトラッキングの更新が仮想コンテンツにも反映されます。 また、グローバルな変換メソッド(positionrotation)ではなく、ローカルな変換メソッド(localPositionlocalRotation)を使用することで、仮想コンテンツが ARLocation に対して常に相対的な位置に配置されるようになります。 ARLocationからの相対的なローカル変換を保存し、将来のセッションで取得することで、仮想コンテンツを同じ場所に配置することができる。

クリックしてARLocationPlacementスクリプトを表示
using Niantic.Lightship.AR.LocationAR;
using UnityEngine;

public class ARLocationPlacement : MonoBehaviour
{
[SerializeField]
private GameObject GameAsset;

// 既にトラッキングされているARLocation
private ARLocation ArLocation;

// ワールド空間の指定されたポーズ(平面に対するヒットテストの結果など)でオブジェクトをインスタンス化
public GameObject SpawnObjectFromHitTest(Vector3 position, Quaternion rotation)
{
var go = Instantiate(GameAsset, position, rotation);

// 既に設定されたポーズを保持しつつ、アセットをARLocationの子オブジェクトとして設定
go.transform.SetParent(ArLocation.transform, true);

return go;
}

public void UpdateObjectPosition(Vector3 localPosition, Quaternion localRotation, GameObject go)
{
go.transform.localPosition = localPosition;
go.transform.localRotation = localRotation;
}
}

コンテンツの位置がずれた場合にトラッキングを更新する

時間が経つにつれて、ARSessionのドリフトやARトラッキングが失われることで、ARLocationが現実世界とずれることがあります。 ARLocation のトラッキングが失われた場合、 ARLocationManager はトラッキングが回復すると、自動的に ARLocation との再接続を試みます。 しかし、すべてのトラッキング・ロスが報告され、処理されているわけではありません。 手動で ARLocation トラッキングを開始するには、ARLocationManager の TryUpdateTracking() を呼び出します。

クリックして、更新後のARLocationTrackingスクリプトを表示
using Niantic.Lightship.AR.LocationAR;
using UnityEngine;

public class ARLocationTracking : MonoBehaviour
{
[SerializeField]
private ARLocationManager ArLocationManager;

// ボタンにアタッチするか、タイマーで呼び出すことができる
// ARLocationが事前にトラッキングされている必要がある
public void UpdateTracking()
{
ArLocationManager.TryUpdateTracking();
}
}

位置情報のトラッキングを停止する

ARLocationManager の StopTracking() を呼び出すことで、ARLocationのトラッキングを停止することができます。 これにより、トラッキングされているロケーションに関連付けられたARPersistentAnchorsはすべて削除され、すべてのロケーションが非アクティブに設定され、まだ存在している場合には各ARLocationがHierarchy内の元の親に戻されます。 トラッキングセッション間でGameObjects が残らないように、インスタンス化されたGameObjectsをデスポーンおよび破棄してからStopTracking()` を呼び出すことをお勧めします。

クリックしてStopTrackingコードスニペットを表示
using LocationAR;
using UnityEngine;

public class ARLocationTracking : MonoBehaviour
{
[SerializeField]
private ARLocationManager ArLocationManager;

// 実行時に生成されるGameObject
private GameObject[] SpawnnedGameObjects;

public void StopTracking()
{
foreach (var go in SpawnnedGameObjects)
{
Destroy(go);
}.

ArLocationManager.StopTracking();
}.
}

コードを使用してロケーションを切り替える

ARLocations は、トラッキングが停止しているときのみ切り替えることができます。 この方法を使用すると、ユーザーが新しいロケーションに移動した場合などにトラッキングされる ARLocation を更新できます。 StopTracking() を呼び出した後、トラッキングする新しい ARLocation を設定して StartTracking() を呼び出します。 SetARLocations の呼び出しを行わない場合は、以前に設定された ARLocations が引き続き使用されます。

クリックしてロケーション切り替えのコードスニペットを表示
using System.Collections;

using Niantic.Lightship.AR.LocationAR;
using UnityEngine;

public class ARLocationTracking :MonoBehaviour
{
[SerializeField]
private ARLocationManager ArLocationManager;

// 既にトラッキング中
[SerializeField]
private ARLocation InitialLocation;

[SerializeField]
private ARLocation SecondLocation;

public void UpdateLocationForTracking()
{
StartCoroutine(UpdateLocationCoroutine());
}

private IEnumerator UpdateLocationCoroutine()
{
ArLocationManager.StopTracking();
ArLocationManager.SetARLocations(SecondLocation);

// ネイティブシステムとトラッキングをクリアするために1フレーム待ちます
yield return null;
ArLocationManager.StartTracking();
}.
}

詳細情報