Unity 向け ARCore Geospatial Creator を使用すると、新しい 3D タイル形式で Google マップのデータを表示することで、Unity エディタで地理空間コンテンツをプレビューできます。これにより、アプリの構築中に、コンテンツが現実世界に配置される場所を視覚化できます。
Geospatial Creator は、AR Foundation 用 ARCore Extensions の一部として提供されています。このクイックスタートでは、Unity で Geospatial Creator を使用して、ARCore Geospatial サンプルアプリに Geospatial AR コンテンツを追加する方法について説明します。
Geospatial Sample の代わりに既存のアプリを使用する場合は、まず Unity 向け Geospatial デベロッパー ガイドに沿って操作する必要があります。アプリで Geospatial API を使用するように構成したら、下の必要な依存関係を追加するの手順に進んでください。
前提条件
「AR Foundation 向け ARCore Extensions のスタートガイド」に沿って、AR 体験を作成するように Unity 環境を構成します。
ARCore Extensions は以前のバージョンの Unity をサポートしていますが、Geospatial Creator には Unity 2021.3 以降が必要です。
API の承認
ARCore Geospatial API と Google Map Tiles API を使用するには、API アクセスを設定する必要があります。
Google Map Tiles API
Map Tiles API は、サポートされている場所の 3D のフォトリアリスティックな表現を提供します。これらのタイルは、Unity エディタで AR シーン周辺のエリアをプレビューするために使用します。
API を有効にして Map Tiles の詳細を確認するには、Map Tiles API のページをご覧ください。
ARCore Geospatial API
ARCore Geospatial API は、アプリが実行時に Geospatial アンカーを作成して操作するために使用されます。
Geospatial API を有効にするには、アプリケーションで ARCore API を設定します。キーレス(推奨)または API キーの認証方法を使用できます。
Geospatial サンプルアプリを拡張する
このガイドでは、Geospatial Creator を使用して ARCore Geospatial サンプルアプリに地理空間コンテンツを追加する方法について説明します。
地理空間サンプルを構成する
まず、ARCore Geospatial サンプルアプリについて理解します。新しい Unity プロジェクトで、Unity Package Manager を開き、ARCore Extensions パッケージを選択します。Package Manager の詳細パネルで、[サンプル] を展開し、Geospatial Sample を Unity プロジェクトにインポートします。
アプリを実行する前に、プロジェクトで ARCore と Geospatial の機能を有効にする必要があります。[Edit] > [Project Settings...] > [XR Plug-in Management] をクリックします。適切なチェックボックスをオンにして、Android 用の ARCore プラグイン プロバイダまたは iOS 用の ARKit プラグイン プロバイダを有効にします。
次に、[Edit] > [Project Settings...] > [XR Plug-in Management] を選択し、[ARCore Extensions] パネルを開きます。[Geospatial] がオンになっていることを確認し(Geospatial Creator を有効にする必要はまだありません)、API 認証情報を入力します。詳しくは、Android と iOS の「Geospatial Unity API を有効にする」のドキュメントをご覧ください。
ARCore を使用する Unity アプリに必要な、プラットフォーム固有の Player 設定がいくつかあります。必要な変更については、ドキュメントのプレーヤー設定の構成セクションをご覧ください。
この時点では、地理空間サンプルを実行するために必要なもの以外に、シーン内にゲーム オブジェクトはありません。ここでアプリをビルドして実行します。正しく構成されていれば、実行時にデバイスのカメラビューが表示されます。移動すると、画面上部に表示される地理空間の精度が向上し始めます。画面をタップすると、移動しても元の場所に残る Geospatial アンカーが作成されます。
次に、Geospatial Creator を使用して Unity エディタ内で高度な AR コンテンツを作成して可視化する方法について説明します。このコンテンツは、世界の特定の緯度 / 経度の位置にあるアプリに表示されます。
必要な依存関係を追加する
Geospatial Creator は、Cesium というサードパーティの Unity パッケージを使用して、Unity エディタの Scene ウィンドウに Google マップタイルをレンダリングします。Geospatial Creator の機能を有効にする前に、Cesium パッケージをプロジェクトに追加しましょう。
Cesium の GitHub ページから Cesium for Unity パッケージの最新バージョンをインストールすることをおすすめします。
- Cesium for Unity のプリコンパイル済み
.tgzの最新バージョンを、GitHub リリースページからダウンロードします。現在推奨されている Cesium for Unity パッケージのバージョンは 1.1.0 です。 - Unity の [Window] メニューをクリックし、[Package Manager] を選択して、Unity Package Manager を開きます。
- プラス(+)アイコンをクリックし、[Add package from tarball] を選択します。
- ステップ 1 でダウンロードした Cesium for Unity の .tgz ファイルを選択します。
- Text Mesh Pro などの追加の依存関係をインストールするよう求められることがあります。

Geospatial Creator を有効にする
これで、Geospatial Creator を有効にする準備が整いました。
- [Build Settings] ダイアログで、選択したプラットフォームが [Android] または [iOS] のいずれかであることを確認します。現在のところ、他のプラットフォームでは Geospatial Creator の機能はご利用いただけません。
- [Project Settings] > [XR Plug-in Management] > [ARCore Extensions] に移動します。
- 前の手順で ARCore Android API キーまたは iOS API キーを設定していない場合は、ここで設定してください。
- [Geospatial] と [Geospatial Creator] の両方の切り替えを有効にします。[Geospatial Creator] 切り替えボタンをクリックして有効にすると、プロジェクトが Geospatial Creator と互換性があることを確認するための非モーダル ウィザードが表示されます。
- ウィザードで [完了] をクリックします。
ウィザードを終了すると、Unity がスクリプトのコンパイルをトリガーします。再コンパイルが完了するまで待ってから続行します。(選択したプラットフォームが [Android] または [iOS] ではない場合は、ここでいずれかに切り替えます)。
Map Tiles を使用して Geospatial Creator の原点を追加する
シーンには「Geospatial Creator Origin」オブジェクトが 1 つだけ必要です。このオブジェクトは、現実世界の緯度、経度、高度の値を Unity ゲーム座標に変換するための基準点として使用されます。
シーンに Geospatial Creator Origin を追加するには、[Game Object] > [XR] > [Geospatial Creator Origin] を選択します。新しく作成されたオブジェクトには、特定の緯度、経度、高度をゲーム座標の原点の位置にリンクするジオリファレンスが必要です。Geospatial Creator Origin の [Inspector] ペインで、[Add Cesium Georeference Component] ボタンをクリックして、地理参照を追加します。

Cesium Georeference は、AR オブジェクトの参照点となるだけでなく、Cesium 3D Tileset オブジェクトをシーンに追加します。このオブジェクトは、エディタのシーンビューに Google マップタイルをレンダリングし、AR コンテンツが世界中のどこに表示されるかを正確に視覚化できるようにします。Geospatial Creator Origin のインスペクタには、以前に設定した Map Tiles API キーを追加するフィールドがあります。このキーを設定すると、シーンビューに地図タイルが読み込まれます。
次に、緯度、経度、高さのフィールドを変更して、アプリで AR コンテンツを表示したい場所の近くに配置します。
エディタのシーンビューに、原点の指定された緯度と経度の地図タイルが表示されます。実行時にアプリが AR カメラを使用することを想定しているため、Geospatial Creator はすでに Cesium 3D マップ タイルセット オブジェクトを「EditorOnly」タグで構成しています。そのため、ゲームの実行時にタイルがダウンロードまたはレンダリングされることはありません。これは、Cesium3DTileset オブジェクトのインスペクタから変更できます。Cesium の Georeference と 3D Tileset GameObject について詳しくは、Cesium for Unity のドキュメントをご覧ください。
Geospatial Creator アンカーを追加して配置する
これで、シーンに AR コンテンツを配置する準備が整いました。[GameObject] > [XR] > [Geospatial Creator Anchor] をクリックして、シーンの階層にアンカーを追加します。アンカーのインスペクタで、正確な緯度、経度、高さを指定できます。オブジェクトの変換がシーン内の正しい位置にすぐに更新され、オブジェクトが現実世界のどこに表示されるかを確認できます。

アンカーの緯度と経度を微調整する際は、近くの場所を選択して、実行時に正しい場所に配置されていることを確認できるようにします。Geospatial Creator アンカーの高度を設定する際には、次の 3 つのオプションがあります。
- Terrain は、指定された緯度と経度の地面レベルにアンカーを配置します。グラウンド レベルは、実行時に Visual Positioning System によって決定されます。ARCore の Geospatial API を初めて使用する場合は、「地形」がおすすめです。アンカーが地面に直接解決され、垂直方向の精度が高くなります。[Altitude Offset] フィールドでは、アンカーを地面の上下に一定の距離(メートル単位)で配置できます。たとえば、オフセットを「1.0」に指定すると、アンカーが地形から 1 メートル浮き上がります。
- Rooftop は、指定された緯度と経度にある構造物の最上部を基準にアンカーを配置します。地形アンカーと同様に、[高度オフセット] フィールドでは、屋根の位置を基準としてアンカーを上下に移動できます(単位はメートル)。
- WGS84 は、WGS84 座標系に基づいて、特定の絶対高度(メートル単位)にアンカーを配置します。この方法でオブジェクトを配置するには、試行錯誤が必要になる場合があります。WSG84 の高さが「0」であっても、必ずしも平均海面を示しているとは限らず、GPS の高度と一致しない場合があるためです。また、レンダリングされた 3D タイルの緯度と経度は非常に正確ですが、3D タイルを参照してオブジェクトを地面に配置しようとすると、高さに数メートルもの誤差が生じる可能性があります。
ARCore Geospatial Anchor のさまざまなタイプについて詳しくは、地理空間デベロッパー ガイドをご覧ください。
地形アンカーと屋上アンカーの両方に WGS84 高度フィールドがあります。この値は、エディタ モードでのみ使用され、シーン ビューのオブジェクトの高さを設定します。地形と屋上の高さは実行時にのみ決定されるため、WGS84 標高フィールドを使用すると、アプリの開発中に特定の高さでアンカーを可視化できます。地形と屋上のアンカーの場合、実行時には WGS84 標高フィールドは無視されます。
アンカーにジオメトリを追加する
ここでアプリをビルドして実行しても、AR 対応アプリにアンカーは表示されません。これは、アンカーにジオメトリが関連付けられていないためです。アンカーにシンプルな 3D プリミティブを追加しましょう。シーンの階層で、AR Geospatial Creator アンカー オブジェクトを右クリックします。コンテキスト メニューから、[3D オブジェクト > 立方体] を選択します。シーンビューに、アンカーの子として灰色の立方体が表示されます。エディタでオブジェクトの位置や回転を移動する場合は、子キューブ プリミティブではなく、ルート アンカー オブジェクトを移動することをおすすめします。これにより、緯度 / 経度からゲーム座標への変換におけるエラーを減らすことができます。

もちろん、アンカーに複雑なジオメトリや任意のコンポーネントと子を追加することもできます。
アプリをビルドして実行する
アンカーを現実世界に表示してみましょう。アプリをビルドして実行し、キューブが表示されるはずの場所に移動します。そこにありますか?お疲れさまでした。これで、Geospatial Creator を使用して、より複雑な AR エクスペリエンスを構築できるようになりました。
問題が発生した場合は、トラブルシューティング ガイドをご覧ください。
この機会に、さまざまなジオメトリの AR Geospatial Creator Anchor を追加しましょう。複数の屋上アンカーと地形アンカー、およびそれらのオフセットを試してみてください。スクリプトを追加して、オブジェクトをアニメーション化したり、オブジェクトとのインタラクションを有効にしたりします。
Geospatial Creator アンカーと ARGeospatialAnchor クラスについて
複雑でインタラクティブな AR エクスペリエンスを構築する際は、Geospatial Creator アンカーと ARCore の ARGeospatialAnchor C# クラスの関係を理解しておくと便利です。
ARGeospatialAnchor は、ARAnchorManager の関数を呼び出すことで実行時にのみ作成でき、AR セッションが安定してからでなければ作成できません。Geospatial Creator アンカーは、シーン内に存在するプレースホルダと考えることができます。このプレースホルダは、AR セッションが ARGeospatialAnchor オブジェクトを解決する準備ができるのを待っています。セッションの準備が整うと、プレースホルダは ARAnchorManager を自動的に呼び出して ARGeospatialAnchor を作成し、解決します。
ランタイム アンカーが解決されるとすぐに、シーン階層内の Geospatial Creator アンカーが新しい GameObject の子としてアタッチされます。つまり、Geospatial Creator Anchor のコンポーネントまたは子要素は、新しい ARGeospatialAnchor GameObject のサブコンポーネントまたは孫要素になります。たとえば、Geospatial Creator Anchor にアタッチされたジオメトリ プリミティブの transform は ARGeospatialAnchor の transform から継承されるため、ランタイム AR セッションの想定される場所に配置されます。
実行時に特定の ARGeospatialAnchor GameObject を識別する必要がある場合は、name プロパティが Geospatial Creator を使用して作成されたアンカーと一致するオブジェクトをシーン内で検索できます。AR セッションが初期化されている場合、そのオブジェクトの parent は対応する ARGeospatialAnchor オブジェクトになります。
トラブルシューティング
アンカーが移動するのはなぜですか?
特にアプリの初回起動時に、アンカーがゆっくりと「漂流」したり、数メートルも突然ジャンプしたりすることがあります。これは、VPS セッションがカメラの正確な位置を特定して調整しているときに発生します。水平方向と垂直方向の精度が複数のフレームで向上するにつれて、アンカーがより正確な位置に再描画され、動きの錯覚が生じます。位置情報の精度が特定のしきい値に達するまで、オブジェクトのレンダリング方法を変更したり、レンダリングしないようにしたりすることもできます。これを行うには、ARCoreEarthManager.CameraGeospatialPose プロパティをクエリして、現在のフレーム更新の精度を判断します。
アンカーが間違った高度に表示されるのはなぜですか?
Geospatial Creator アンカーに「手動」の高度タイプを使用する場合、アンカーの高度は WGS84 に従って(メートル単位で)設定されます。特定の場所では、マップタイルに表示される見かけの地盤面と、Google の Visual Positioning System(VPS)によって報告される実際の地盤面との間に、数メートル程度のずれが生じることがあります。実行時に Geospatial Anchor の位置が正しくないと思われる場合は、サンプルアプリのデバッグ オーバーレイを使用して VPS の高さを直接確認することをおすすめします。その後、Unity エディタで高度を変更して、その場所の既知の VPS の高さと一致させることができます。
エディタのシーンビューで地図タイルが正しくレンダリングされない
Cesium3DTileset がタイルを読み込んでいるように見えるのに、シーンビューでマゼンタ一色でレンダリングされる場合は、Unity の Shader Graph パッケージをプロジェクトに追加します。このパッケージは Cesium で必要ですが、Unity の組み込みレンダラを使用するプロジェクトにはデフォルトで含まれていません。
Shader Graph を追加するには、Unity Package Manager([Window] > [Package Manager])を開きます。Package Manager ウィンドウの上部にあるプルダウン メニューから [Packages: Unity Registry] を選択して、Unity Package Registry で利用可能なパッケージを閲覧していることを確認します。com.unity.shadergraph パッケージを検索して、最新バージョンをインストールします。パッケージが読み込まれると、3D タイルが再読み込みされ、シーンビューに正しくレンダリングされます。
アプリの実行時にカメラビューではなく黒い画面が表示される
Unity のユニバーサル レンダリング パイプライン(URP)は、デフォルトでは AR カメラ用に構成されていません。実行時にカメラの出力ではなく黒い画面が表示される場合は、シーン内の各 URP レンダラに AR Background Renderer Feature を追加する必要があります。

この機能を追加するには、プロジェクトで「renderer」を検索します。URP Renderer オブジェクトごとに、インスペクターの [Add Renderer Feature] ボタンをクリックして、AR Background Renderer を追加します。
原点から離れた場所に配置されたアンカーが正しく配置されていないように見えるのはなぜですか?
WGS84 座標から Unity ゲーム座標への変換は、浮動小数点演算の精度による誤差の影響を受けます。この誤差は、原点が AR アンカーの近くにあることを確認することで最小限に抑えることができます。20 km を超える距離では、不正確な結果になる可能性があります。AR エクスペリエンスが広範囲に及ぶ場合は、複数のシーンを使用し、各シーンに固有のアンカーを設定することをおすすめします。