ロケーションARとコードを一緒に使用する
この入門ガイドでは、以下の内容について説明します。
ARLocationManager
パブリック API を使 ったARLocation
の管理と追跡- 登録されたARLocationに対する更新をリッスンする
- ARLocationを基準としてコンテンツを配置する
- ARセッション中にトラッキングされたARロケーションを切り替える
前提条件
- ARDKがインストールされたUnityプロジェクトと、セットアップされた基本的なARシーンが必要です。 詳しくは、ARDK 3のセットアップおよび基本ARシーンのセットアップを参照してください。
- APIキーを追加していない場合は、有効なAPIキーが必要です。
- この入門ガイドを進めるには、プロジェクトのARシーンに
ARLocationManager
が含まれている必要があります。ARLocationManager
とARLocation
をプロジェクトに追加する方法については、現実世界の場所をUnityに追加するのステップ4をご覧ください。 (ARLocationの交換では、複数のARLocation
が必要になります)。
トラッキングするARLocationを登録する
ARLocationManagerに
ARLocation を追加するには、
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);
}
}
このスニペットでは、ARLocation
の GameObject
はトラッキング状態に応じて有効化または無効化されます。 これは、 ARLocation
の仮想コンテンツが正しくトラッキングされなくなった場合に、トラッキングの損失を処理し、ARカメラフィードからずれてしまう可能性がある場合に役立ちます。
ARLocationを基準としてコンテンツを配置する
ランタイムに ARLocation
を基準としてスポーンされた仮想コンテンツは、 ARLocation
の GameObject
の子オブジェクトにする必要があります。 これにより、 ARLocation
に対するトラッキングの更新が仮想コンテンツにも反映されます。 また、グローバルな変換メソッド(position
、 rotation
)ではなく、ローカルな変換メソッド(localPosition
、 localRotation
)を使用することで、仮想コンテンツが 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();
}.
}