Maps SDK for Unity のサンプルシーン

Maps SDK for Unity には、この SDK の基本的な機能を例示する Unity のサンプルシーン コレクションが用意されています。これらのサンプルシーンは、Maps SDK for Unity のインストール時に /GoogleMaps/Examples/ ディレクトリにインストールされます。

Unity でサンプルシーンを実行するには

  1. スタートガイドの手順に沿って Maps SDK for Unit をダウンロードし、Unity に統合します。

  2. [Project] ペインで、/Assets/GoogleMaps/Examples/ フォルダに移動します。サンプルシーンのフォルダ構成は次のとおりです。

    フォルダ メインシーン 説明
    01_GettingStarted HelloWorld 地図を読み込む最も簡単な方法を示します。
    02_Fundamentals MapsService101 マップサービスを使用して SDK と通信する方法の詳細を説明します。
    03_MapsStyling StylingMaps101 スタイル付き地図対象物の全般的なサンプルをランタイム時に提供します。
    04_Advanced 複数のシーン 編集(スタイル設定)時プレビュー、ミックスズーム、プレイアブル ロケーション、経路探索、高度なスタイル設定など、高度なトピックを例示するいくつかのサンプルを再構成します。
  3. 実行するサンプルシーンをダブルクリックします。選択したシーンが [Hierarchy] ペインに表示されます。

  4. SDK と Google サーバーが適切に通信できるようにするには、シーンを実行する前に apiKey を追加する必要があります。apiKey は MapsService Unity コンポーネントのパラメータです。通常、このパラメータは、サンプル GameObject またはその子に追加されます。

  5. [Run] ボタンをクリックします。

基本的な機能

このサンプルシーンは、Maps SDK for Unity の最も基本的な要素で構成されています。デフォルトでは、自由の女神の座標が読み込まれ、[Scene] ペインと [Editor] ペインの両方に、「自由の女神」ゲーム オブジェクトと周囲のジオメトリが表示されます。

シーンを停止し、([Inspector] の [Basic Example (Script)] コンポーネントで)[Latitude] フィールドと [Longitude] フィールドに新しい座標値を入力できます。その後でシーンを再実行すると、世界の別のシーンが表示されます。

Maps SDK for Unity との通信を可能にするコードは、次のスクリプトの Start() 関数で定義されています。

private void Start () {
   // Get required Maps Service component on this GameObject.
   MapsService mapsService = GetComponent<MapsService>();

   // Set real-world location to load.
   mapsService.InitFloatingOrigin(LatLng);

   // Register a listener to be notified when the map is loaded.
   mapsService.Events.MapEvents.Loaded.AddListener(OnLoaded);

   // Load map with default options.
   mapsService.LoadMap(ExampleDefaults.DefaultBounds,ExampleDefaults.DefaultGameObjectOptions);
}

このサンプルでは、デフォルトの境界とスタイル指定とともに地図が読み込まれます。MapsService コンポーネントは、Maps SDK for Unity と通信するためのゲートウェイです。このサンプルでは、緯度と経度のペアによって、地図のフローティング起点が初期化されます。境界パラメータにより、その起点を中心とする読み込みエリアが定義されます。

MapsService 101

このサンプルシーンは、MapsService コンポーネントを使用し、さまざまな方法で Maps SDK for Unity を操作する方法を例示します。

このシーンでは、独自の Unity シーンで使用できるいくつかの特殊なコンポーネントが実行されます。これらのコンポーネントは、シーン階層の MapsExample ゲーム オブジェクトに割り当てられ、地図読み込みのライフサイクルを示します。このサンプルでは一人称視点が使用されています。

コンポーネント 説明
BaseMapLoader 指定した Lat Lng を起点として MaxDistance の半径内の地図を読み込みます。BaseMapLoader コンポーネントは、SDK で発生した読み込みエラーの処理方法を例示します。
DynamicMapsUpdater ユーザー(この場合はメインカメラ)が世界中を移動するのに合わせて、地図の他の部分を動的に読み込んだりまたはアンロードしたりします。DynamicMapsUpdater コンポーネントは常に Camera.main ビューポートが読み込まれ、ビューポートの外のすべてがアンロードされるようにします。
FloatingLatLngOriginUpdater ユーザー(この場合はメインカメラ)が初期位置から FloatingOriginRange の距離に到達したときに、フローティング起点を移動し、読み込まれた地図のすべての対象物の相対位置を更新します。

FloatingLatLngOriginUpdater コンポーネントは、MapsService.MoveFloatingOrigin メソッドを使用して、gameworld を再び中心に配置する方法を例示します。これは、ゲームプレイがゲームの起点から遠ざかるにつれて地図の対象物が徐々にずれる(浮動小数点丸め誤差)ため必要な処理です。詳しくは、フローティング起点をご覧ください。
RoadNamesUpdater RoadNamesUpdater コンポーネントがアクティブな場合、読み込まれた地図には道路名がラベルとして表示されます。
BuildingNamesUpdater BuildingNamesUpdater コンポーネントがアクティブな場合、読み込まれた地図には建物名がラベルとして表示されます。
ProgressBarUpdater ProgressBarUpdater コンポーネントがアクティブな場合、HUD には現在の読み込みの進行状況が表示されます。
SearchByPlaceIdUpdater SearchByPlaceIdUpdater コンポーネントがアクティブな場合、読み込まれた placeId を追跡し、選択された placeId で指定された gameobject を読み込まれた地図で検索する方法が提供されます。
MapFeaturesController MapFeaturesController コンポーネントがアクティブな場合、読み込まれた地図ジオメトリを複数の定義済みバケット(異なる gameobject ペアレンティング)にディスパッチする方法が提供されます。読み込む必要のある MapFeatures カテゴリを MapsService に指示する方法も提供されます。

このサンプルのデフォルトでは、マンハッタン(米国ニューヨーク市)の座標が読み込まれます。シーンを停止すると、([Inspector] の [Dynamic Maps Service Script] コンポーネントで)[Latitude] フィールドと [Longitude] フィールドに新しい座標値を入力できます。シーンを再実行すると、世界の別のシーンが表示されます。

Maps Styling 101

このサンプルシーンでは、Maps SDK for Unity を使用して、読み込みプロセス中に作成される地図対象物をスタイル設定しています。

ランタイム時に地図のスタイルを設定するには、次の 3 つの方法があります。

  1. 地図の読み込み時に、MapsService コンポーネントにスタイル設定(GameObjectOptions)を提供する。
  2. WillCreate イベントを使用して、特定の地図の GameObject にカスタム スタイル指定を追加し、SDK でインスタンス化する。
  3. GameObject を作成した後、ランタイム時にスタイル設定する(DidCreate イベント中、または MapLoaded イベントの受信後)。

「Maps Styling 101」サンプルシーンでは、最初の 2 つのアプローチを例示します。

各パラメータ セットを処理するコードは、/Assets/GoogleMaps/Examples/03_MapsStyling/Scripts の下に配置されている次のクラスにあります。

AreaWaterConfigView
ExtrudedStructureConfigView
ModeledStructureConfigView
RegionConfigView
SegmentConfigView

地図対象物のスタイルをすべて収集して、MapsService API に渡すコードは、MapsStylingEditorView クラスにあります。

Maps Pathfinding 101

このサンプルシーンでは、SDK に組み込まれている経路探索機能の使用方法を例示します。このサービスは、A* アルゴリズムと、読み込まれた地図の道路ラティス(走査可能なグラフ)を使用します。

このサンプルでは 2 つのキャラクターが画面上に表示されます。1 つはプレーヤーが操作し、もう 1 つは人工知能によって制御されます。

サンプルシーンを起動すると、邪悪なボット(赤色)がアバター(緑色)を追いかけます。すべての経路はリアルタイムで更新されます。

このサンプルシーンでは、読み込まれた地図上で、通行可能な道路ラティスノード(地点)のグラフがハイライト表示されます。

なお、これらのノードには視覚的な表現はありません。地図上に表示される白い球は、説明のためのものです。

このサンプルシーンでは、道路区画以外の地図対象物を意図的に非表示にしています。

メイン キャラクターを処理するコードは RoadLatticeCharacterController コンポーネントにあります。AI エージェントの検索動作を処理するコードは RoadLatticeAIController にあります。

高度なトピック

次のサンプルは、Unity シーンを作成する高度な機能を示しています。

編集時プレビュー

Maps Styling 101 セクションではスタイルを実行時に設定しましたが、/Assets/GoogleMaps/Examples/04_Advanced/EditTimePreview にある「編集時プレビュー」サンプルシーンでは、地図 GemeObject に実装したスタイル設定をエディタですぐに確認できます。

ミックスズーム

/Assets/GoogleMaps/Examples/04_Advanced/MixedZoom にある「ミックスズーム」サンプルシーンでは、地図を読み込む際、メインカメラの位置と地図までの距離に基づいて異なるズームレベルを使用しています。この機能により、さまざまな詳細レベルを処理できます。

昼夜

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous にある「昼夜」サンプルシーンでは、Unity の skybox システム、指向性ライティング、発光マテリアルを使用して昼夜サイクルを作成しています。

このサンプルは「9 スライス」サンプルとほぼ同じですが、ここでは、SunAndMoonControllerEmissionController を追加してマテリアルの照明と発光色を制御し、昼夜サイクルをシミュレーションしています。建物にマテリアルを適用する基本的なロジックは、「9 スライス」サンプルと同じです。

このサンプルでは、DynamicMapsService コンポーネント、BuildingTexturer コンポーネント、ErrorHandling コンポーネントも使用しています。

ミニマップ

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous にある「ミニマップ」サンプルシーンでは、ゲーム世界のミニマップ ビューが UI 要素に表示されるようにカメラのレンダリングを設定しています。このシーンでは、gameObject.layerCamera.cullingMask を使用して、ミニマップに表示される内容を制御します。また、画面上にミニマップとして表示するため、RenderTexture を使用して UI.RawImage UI コンポーネントに接続します。

ロケーション フォロワー

/Assets/GoogleMaps/Examples/04_Advanced/Miscellaneous にある「ロケーション フォロワー」サンプルシーンでは、プレーヤーの現実世界の GPS 座標を使用してゲーム世界の位置を更新しています。

その他のスタイル設定のサンプル

/Assets/GoogleMaps/Examples/04_Advanced/MoreStyling には、次のスタイル設定のサンプルが用意されています。

9 スライス

「9 スライス」サンプルシーンでは、9 つにスライスしたマテリアルを使用して建物をテクスチャ処理しています。これらのマテリアルは、/Assets/GoogleMaps/Examples/04_Advanced/MoreStyling/Materials/NineSlicing にあるカスタム シェーダー BuildingWall(9 スライス)を使用します。

BuildingTexturer コンポーネントを使用して 9 スライスのマテリアルを適用し、DynamicMapsService コンポーネントを使用して世界中を移動します。その際、MapsService コンポーネントにより、常に、読み込まれたエリアのみが表示されるようにします。

また、ErrorHandling コンポーネントを使用して、世界ジオメトリの読み込み時に MapsService コンポーネントで発生したエラーを処理します。

建物の境界線

「建物の境界線」サンプルシーンは、建物基部の周囲に境界線を追加する方法を例示します。

このサンプルは「9 スライス」サンプルとほぼ同じですが、ここでは Extruder クラスを使用して、建物基部にモデル化された境界線を追加しています。

このサンプルでは、DynamicMapsService コンポーネント、BuildingTexturer コンポーネント、ErrorHandling コンポーネントも使用しています。

胸壁

「胸壁」サンプルシーンは、建物の上縁に胸壁を追加する方法を例示します。

このサンプルは「9 スライス」サンプルとほぼ同じですが、ここでは Extruder を使用して、建物の屋根の周りにモデル化された胸壁を追加しています。DynamicMapsService コンポーネント、BuildingTexturer コンポーネント、ErrorHandling コンポーネントも使用します。

このサンプルのデフォルトでは、メルボルン(オーストラリア)の座標が読み込まれます。

建物の押圧

「建物の押圧」サンプルシーンは、プレーヤーの近くの建物を押しつぶす(押し出し成形された建物の高さをゼロにする)方法を例示します。ErrorHandling コンポーネントを使用して、ジオメトリの読み込み時に MapsService で発生したエラーを表示します。

プレハブ置換

「プレハブ置換」サンプルシーンでは、定義されたプレハブを使用して、特定のタイプの建物を置き換えます。Unity でサポートされている最大頂点数(メッシュあたり 65,000 個)を超えるため、SDK によって除外される建物を置換する方法も紹介します。

このシーンを開くと、ウェストミンスター寺院(ロンドン)に焦点が当てられますが、このモデルは詳細レベルが高すぎて処理できないため、プレハブに置き換えられます。

このサンプルでは ErrorHandling コンポーネントを使用し、ジオメトリの読み込み時に MapsService コンポーネントで発生したエラーを表示します。