tpc17-2

TOPIC 17|PLATEAU SDKでの活用[2/2]|PLATEAU SDK for Unrealを活用する

PLATEAU SDK for Unrealとは、PLATEAUの豊富なデータを活用して実世界を舞台にしたアプリの開発や都市シミュレーション等を行うためのツールキットです。このトピックでは、PLATEAU SDK for Unrealの利用方法を説明します。

Share

【目次】

17.4  PLATEAU SDK for Unrealとは

 17.4.1  PLATEAU SDK for Unrealの機能

17.5  PLATEAU SDK for Unrealを使用する

 17.5.1  サンプルプロジェクトを導入する

 17.5.2  PLATEAU SDK for Unrealを使用する

17.6  PLATEAU SDK for Unrealでできること

 17.6.1  GISサンプルアプリ

 17.6.2  GISサンプルの3D都市モデルの変更

 17.6.3  ゲームサンプルアプリ

17.4 _ PLATEAU SDK for Unrealとは

図17-49 PLATEAU SDK for Unreal

PLATEAU SDK for UnrealはPLATEAUをUnreal Engine5で活用するためのオープンソースのツールキットです。PLATEAU SDK for Unrealを利用することで、3D都市モデルのFBX、OBJ、GlTFデータへの変換・エクスポートや実世界を舞台にしたゲームの開発やPLATEAUの豊富なデータを活用した都市シミュレーションを簡単に行うことができます。

PLATEAU SDK for Unrealのユーザーマニュアルは、次のURLで開けます。

https://Project-PLATEAU.github.io/PLATEAU-SDK-for-Unreal

ここでは、PLATEAU SDK for Unrealを初めて利用するユーザー向けのチュートリアルとして、SDKの解説と、SDKで何ができるのかを知っていただくための2種類のサンプルアプリの利用方法について解説します。

17.4.1 _ PLATEAU SDK for Unrealの機能

図17-50 PLATEAU SDKの概要

PLATEAU SDK for Unrealでは以下の機能を提供しています。

[1]都市モデルインポート機能

都市モデルインポート機能では、PLATEAUの3D都市モデル標準製品仕様書(第3版シリーズ)に準拠しているすべての3D都市モデルデータを入力としてUnrealのレベルにインポートできます。

図17-51 PLATEAU SDKでのデータの流れ

インポート処理は以下の流れで行われます。

1. ファイルの取得

3D都市モデルのデータ(G空間情報センターから提供されているCityGML形式のデータセット)から必要なCityGML、コードリスト、テクスチャファイルを検索し取得します。なお、PLATEAUにおけるコードリストとは、GMLファイル内で使用される特定の値の集合を定義したリストのことを指します。GMLファイルを読み込むために技術上必要なファイルです。インポート元のファイルはローカルに保存されているものだけでなく、PLATEAUのサーバーからインポートすることも可能です。

2. 3D都市モデルの抽出

インポート時に設定された座標範囲内の3D都市モデルを抽出します。範囲指定は、5次メッシュ(250m×250mのタイルに相当)から任意の個数を選んで選択できます。選択範囲をまたぐ建物は、分割せずにいずれかの5次メッシュに属している扱いとします。

3. 平面直角座標への座標投影

CityGMLの各座標は経緯度で保持されています。Unreal内ではメートル単位で座標値を扱う必要があるため、各座標は平面直角座標に変換されます。また、この際に各地物がレベル内で原点近くに表示されるよう座標値にオフセットをかけています。オフセット値は選択範囲の中心で初期設定されますが、インポート設定で自由なオフセット値に変更することも可能です。

4. CityGMLの形状データのポリゴンメッシュへの変換

CityGMLの形状データはそのままの形式ではゲームエンジンで可視化できないため、インポート時にポリゴンメッシュへ変換しています。変換されたポリゴンメッシュはUnrealワールド内でStaticMeshコンポーネントとして可視化されます。ポリゴンメッシュに変換する際の結合単位は主要地物単位(建物、道路等)、最小地物単位(壁面、屋根面等)、地域単位(100m×100mの範囲の地物をすべて結合)から選択することができます。

5. テクスチャの結合

インポート設定でテクスチャを結合するよう指定されている場合、CityGML内のテクスチャはより少ない枚数のテクスチャにまとめられます。この処理はテクスチャアトラス化と呼ばれ、マテリアル数の削減によってゲームエンジンでのFPSが改善されます。

6. 地形への航空写真の貼り付け

インポート時に地図タイルをダウンロードしテクスチャとして貼り付けます。SDKは、地物の位置をもとに地図タイル座標を算出し、経緯度に対応する地図タイルをダウンロードします。デフォルトでは地理院地図の衛星写真のURLになっていますが、他の地図(標準地図、標高図など)も利用可能です。

7. マテリアルの適用

ゲームエンジン上で3D都市モデルを可視化する際、CityGMLのAppearance情報がゲームエンジンでのマテリアル情報に変換されます。ここで変換される情報にはテクスチャだけでなく、diffuseColor(拡散反射)、specularColor(鏡面反射)等の情報も含まれます。

[2]都市モデル調整機能

インポート機能でシーンにインポートされた3D都市モデルの見た目の調整が行えます。具体的には、以下の設定によって各地物の表示/非表示の切り替えができます。

● LOD

● 地物タイプ

 ◯ 建築物、道路、起伏等

 ◯ 最小地物単位でインポートされている場合、壁面、屋根面等面単位での表示/非表示ができます。

【メモ】LODとは

CityGMLには、各地物について複数の形状データが格納されている場合があります。LOD0がもっとも大まかな形状で、LOD1、LOD2 と数字が上がるほど細かい形状になります。建築物の場合、LOD0 は平面、LOD1は平面に一定の高さをつけたもの、LOD2はより細かい形状です。(「1.3 3D都市モデルの特徴」を参照)

[3]地物分割・結合機能

地物分割・結合機能ではエディタ上で3D都市モデル内の各オブジェクトの結合単位の変更が行えます。

分割・結合したいオブジェクトを選択し、結合単位を以下のオプションから指定して実行ボタンを押すと選択オブジェクトの結合単位が更新されます。

 ◯ 地域単位
 ◯ 主要地物単位
 ◯ 最小地物単位

また、分割・結合処理の前後で以下の情報が保持されるようになっています。

 ◯ 各オブジェクトの階層構造
 ◯ ポリゴンメッシュ情報
 ◯ マテリアル情報
 ◯ 属性情報

[4]マテリアル分け機能

図17-52 マテリアル分け機能の適用例

マテリアル分け機能では3D都市モデル内の各オブジェクトについて、地物型によってマテリアルを分割・適用できます。この機能は主にLOD2以上の地物形状における構成部品(建築物での壁面、屋根面等)毎に分割を行う際に使用されることが想定されています。

[5]属性情報取得機能

図17-53 CityGMLとゲームエンジンでのオブジェクトの対応

属性情報取得機能では、ブループリント、C++ユーザー向けのAPIを提供しています。APIを利用することでCityGMLに含まれるすべての属性情報にアクセスできます。インポートされた都市モデルに含まれるコンポーネントの名前はCityGMLでのIDに対応しているため、各コンポーネントの名前をAPIに入力することで付随する属性情報を取得できます。属性情報取得機能の詳細についてはユーザーマニュアルの属性情報へのアクセスのページをご覧ください。

[6]都市モデルエクスポート機能

都市モデルエクスポート機能では、インポートされた3D都市モデルを3Dファイル形式でエクスポートできます。

出力設定は以下の通りです。

ファイル形式OBJ、FBX、glTFに対応しています。
テクスチャ出力するメッシュにテクスチャを含めるかどうかを選択します。
非表示モデルを含める都市モデル調整機能で非表示に設定されたオブジェクトを含めるかどうかを選択します。
座標変換出力座標系をローカル座標(Unrealワールド内での座標)と平面直角座標から選択します。
座標軸出力されるメッシュの座標軸を設定します。

17.5 _ PLATEAU SDK for Unrealを使用する

PLATEAU SDK for Unrealは、Unreal Engine向けのプラグインとして提供されています。本チュートリアルではSDKのサンプルを含んだプロジェクトを使用して解説しますが、個別のプロジェクトにSDKを導入する場合はユーザーマニュアルのインストール手順に従ってください。

17.5.1 _ サンプルプロジェクトを導入する

[1]Unreal Engine 5のインストール

PLATEAU SDK for Unreal は、Unreal Engine 5.3.2を想定しています。

そのバージョンがインストールされていない場合は、次の手順でインストールしてください。

1. Epic Games Launcher をこちらからインストールします。

2. Epic Games Launcherを開き、[Unreal Engine]→[ライブラリ]→[+]の順に選択します。

図17-54 Epic Games Launcherの画面

3. 5.3.2のバージョンを選択してから[インストール]ボタンをクリックします。

[2]サンプルアプリの導入

1. ゲームサンプルアプリGISサンプルアプリのページからUnrealプロジェクトをダウンロードしてzipファイルを展開します。

2. 展開したフォルダ内にあるPLATEAUUnrealSamples.uprojectをダブルクリックすることでプロジェクトを開くことができます。

17.5.2 _ PLATEAU SDK for Unrealを使用する

[1]データのダウンロード(ローカルのデータを利用する場合)

PLATEAUの3D都市モデルデータは、G空間情報センターの3D都市モデル(Project PLATEAU)ポータルサイトで公開されています。ポータルサイトから地域を選び、CityGMLデータをダウンロードして展開します。

https://www.geospatial.jp/ckan/dataset/plateau

なお、CityGMLには「(v1)」と付くものと「(v2)」と付くものが両方配布されているなど、バージョン違いが配布されていることがあります。その場合、最新のバージョンであるv2またはv3をご利用ください。PLATEAU SDKはv2以上に対応しています。

図17-55 CityGMLのダウンロード

[2]インポート元の選択(ローカル)

ここからは、ユーザーマニュアルの3Dモデルのインポートのページに沿って、展開したデータをインポートします。

UE5のメニューバーから [PLATEAU]→[PLATEAU SDK]を選択してSDK画面を開きます。上部のタブから[インポート]を選択してインポート画面を開きます。

インポート元として、事前にダウンロードしたデータを利用する「ローカル」、またはサーバーから直接データをダウンロードして利用する「サーバー」のどちらかを選択します。

[3-A]ローカルインポートの場合

フォルダパスには、展開したCityGMLデータの最上位フォルダ(「udx」などの1つ上の階層のフォルダ)を設定します。

図17-56 フォルダパスの設定

[3-B]サーバーインポートの場合

ローカルのデータではなくサーバーから直接シーンに3D都市モデルをインポートしたい場合、インポート元として[サーバー]を選択します。サーバー上に存在するデータセットの一覧が表示されるので、取得したいデータセットを選択します。

図17-57 サーバーのデータセットの選択

[4]基準座標系の選択

リストのうち、データが存在する場所と合致する基準座標系を選択します。基準座標系に関する詳細情報は、国土地理院のWebサイトに記載のある平成十四年国土交通省告示第九号をご覧ください。誤った基準座標系を選択した場合、本来の基準座標系から離れるほど、インポートした3D都市モデルに歪みが生じてしまうのでご注意ください。

図17-58 基準座標系の選択

[5]インポート範囲の選択

範囲選択ボタンを押すと範囲選択画面が開きます。 

図17-59 範囲選択画面

● 範囲選択画面の操作方法:

 ◯ マウスホイールを上下に回してズームアウト、ズームインします。

 ◯ 左クリックしながらマウスを移動してカメラ移動します。

 ◯ 範囲の選択方法については、画面右下にある下記説明のとおりです。
  ・クリックで選択/選択解除
  ・ドラッグで矩形での選択追加
  ・Shift+ドラッグで矩形での選択除外をします。

 ◯ 範囲がオレンジ色で表示されない場合は、見えるまでズームします。

 ◯ ビューポート左上の[決定]ボタンを押して範囲を確定します。

● 画面の見方:

 ◯ 青色の線は利用可能な地域を示します。

 ◯ 地域ごとに利用可能なGML種別と対応LODがアイコン形式で表示されます。
  ・対応LODは色で表現されます。画面左下の凡例の色と対応します。

 ◯ アイコンが多すぎると感じる場合は、画面左下の凡例のチェックを切り替えることでアイコンの表示/非表示をLODごとに切り替えることができます。

 ◯ 地図は国土地理院のサーバーから自動でダウンロードされて表示されます。インターネットへの接続が必要です。

● メッシュコード検索機能

 ◯ シーンビュー左上のメッシュコード検索ボタンを押すと、メッシュコードの番号(地図上で青色で表示される数字)で検索できます。
なお、メッシュとは、経緯度に基づいて地域を同じ大きさの網の目に分けたものを指します。
メッシュコードとは、各メッシュを識別するために割り振られた番号を指します。

 ◯ 番号を入力してOKボタンを押すと、その範囲に視界が移動します。

どの地域がどのメッシュコードに該当するかをWebで調べたい場合は、jSTAT MAPを利用します。jSTAT MAPで「ログインしないで始める」をクリックすると地図が開きます。右上のメニューから3次メッシュを選択し、「ラベル」にチェックを入れると地図上に3次メッシュコードが表示されます(図17-60)。

図17-60 3次メッシュコードの表示画面

[6]地物別設定

地物の種類ごとにインポートに関する設定を行います。

設定項目について:

● インポートする

 ◯ チェックが付いている地物タイプのみインポートします。

● テクスチャを含める

 ◯ テクスチャが存在する地物タイプで表示される設定項目です。

 ◯ チェックが付いていて、かつテクスチャがある場合はそれを含めてインポートします。

 ◯ 都市によってはテクスチャがない場合があり、その場合はチェックを外した時と同様にデフォルトマテリアルが適用されます。

● テクスチャを結合する

 ◯ テクスチャを含める場合、テクスチャ結合機能を利用できます。

 ◯ PLATEAUのデータはテクスチャの枚数が多い傾向にあり、結合しないと描画負荷が高くなる傾向にあります。

 ◯ 結合機能を有効にすると、複数のテクスチャを1枚の画像にまとめ、3DモデルのUVも合わせて調整されます。それによって描画負荷を改善できます。

●テクスチャ解像度

 ◯ テクスチャを結合する場合の、結合後のテクスチャの大きさを指定します。

● LOD描画設定

 ◯ 複数のLODを利用可能な地物タイプで表示される設定項目です。

 ◯ 最小LOD、最大LODを指定して、インポートするLODの範囲を指定できます。

● モデル結合

 ◯ 主要地物単位(建築物,道路等)

  モデルのメッシュは建物ごとに結合されて出力されます。建物ごとに地物データを取得できるようにしたい場合はこちらを選択します。

 ◯ 最小地物単位(壁面,屋根面等)

  屋根、壁単位など非常に細かくオブジェクトを分けたい場合はこちらを選択します。

 ◯ 地域単位

  モデルのメッシュは結合されて出力されます。オブジェクト数を削減して軽量化できますが、建物ごとの地物データは取得不可になります。メッシュの結合はある程度の大きさの範囲ごとに行われます。

● 属性情報を含める

 ◯ 有効化すると、地物の属性情報がレベル中にコンポーネント内に保存されます。

 ◯ 下図のように、コンポーネントから属性情報を確認できます。

図17-61 コンポーネント内で保存される属性情報

これは属性情報に関する機能を扱うためには必須となります。一方で、PLATEAUの3D都市モデルの規模に応じてレベル中のデータ量が増大することから、属性情報を利用しない、かつ軽量化が重要である場合には属性情報をオフとしてインポートするのが有利となります。

● デフォルトマテリアル

 ◯ PLATEAUの3D都市モデルのうち、テクスチャやマテリアル指定がない箇所のマテリアルを指定します。

 ◯ デフォルトでは、地物タイプに応じたマテリアルが指定されています。

[7]土地に衛星写真や地図を貼り付ける

土地に衛星写真や地図を貼り付けることができます。

図17-62 衛星写真を貼り付けた都市モデルの例

設定方法

● 範囲選択画面で土地起伏の3Dモデルが存在する地域を選択すると、インポート設定に「起伏」が表示されます。

図17-63 「起伏」のインポート設定

● 土地起伏では、上述の地物別設定に加えて土地起伏専用の設定項目があります。

● 衛星写真または地図を付与する

 ◯ チェックがONになっていると機能が有効化されます。

地図タイルURL

 ◯ 航空写真または地図の画像をダウンロードするためのURLです。

 ◯ デフォルトでは地理院地図の航空写真のURLが入力されています。

 ◯ このURLを変更すれば、航空写真だけでなく、国土地理院が提供している多種多様な
  地図や写真を土地に貼り付けることができます。
  利用できる地図については国土地理院のページを参照してください。
  そのページに記載されているURLを貼り付けることで地図を利用できます。

 ◯ 下図は地図を貼り付けた例です。

図17-64 地図を貼り付けた都市モデルの例

 ◯ 下図は陰影起伏図を貼り付けた例です。

図17-65 陰影起伏図を貼り付けた都市モデルの例

 ◯ URLには文字列 {z}, {x}, {y}を含めるようにしてください。これは地図タイルのxyz座標に変換されます。

  ・地図タイルのxyz座標については国土地理院のページを参照してください。

  ・SDKの機能により、土地の座標をもとに文字列{z}, {x}, {y}を適切な数値に置き換えて画像をダウンロードします。

 ◯ ズームレベル

  地図タイルのズームレベルです。

  ・数値が大きいほど高精細な画像になります。

  ・数値が1つ下がると、画素数が4分の1になります。

  ・ズームレベルは、地図タイルxyz座標のzの値に相当します。

 ◯ 利用可能なズームレベルの検索

  ・ボタンを押すと、現在入力されているURLでどのズームレベルが利用可能なのかを検索します。

  ・検索が完了すると、ズームレベルのドロップダウンの選択肢が変化し、利用可能なズームレベルから選択できるようになります。

図17-66 ズームレベルの選択画面

この機能でダウンロードされた地図タイルは、自動で1枚の画像に結合され、土地のUVとマテリアルが設定されてインポートされます。

[8]インポートの実行

[モデルをインポート]ボタンをクリックするとインポートが開始されます。

ウィンドウを下にスクロールすると、インポート処理の進捗が表示されます(図17-67)。

処理が進むと、都市のオブジェクトが順次ワールドに配置されていきます。進捗表示がすべて「完了」になったらインポート終了です。

図17-67 インポートの進捗表示
図17-68 インポートされた3D都市モデル

配置されたアクタの詳細パネル(図17-69)から経緯度などの情報を確認できます。これは属性情報を含めない設定にした場合でもアタッチされます。

 図17-69 都市モデルの経緯度情報

【メモ】

インポート元となるファイルはContent/PLATEAU/Datasetsフォルダにコピーされます。インポート処理で生成されたテクスチャアセットはContent/PLATEAU/Texturesフォルダに保存され、2回目以降のインポートで同じテクスチャを利用する場合はすでに保存されたアセットが再利用されます。

[9]各機能へのアクセス

SDKの各機能にはSDK画面の上部タブ(図17-70)からアクセスできます。SDKの機能を利用することで、インポートした3D都市モデルについて表示地物の調整・3Dファイル形式へのエクスポート・属性情報へのアクセスができます。各機能の利用方法はユーザーマニュアルを参照してください。

図17-70 SDKの機能タブ

17.6 _ PLATEAU SDK for Unrealでできること

PLATEAU SDK for Unrealを利用することで、PLATEAUの3D都市モデルを活用したGIS、AR/VR、ゲーム等、さまざまなアプリケーションを開発できます。このトピックではサンプルを使用してSDKを利用して実際にどのようなアプリケーションが作れるかについて解説します。

17.6.1 _ GISサンプルアプリ

PLATEAU SDKでは、どのような属性情報にアクセスできるかを知るためのチュートリアルとして、GISサンプルアプリを提供しています。GISサンプルアプリでは、PLATEAUの3D都市モデルのさまざまな属性情報の表示や、属性情報に応じたフィルタリング・色分けができます。GISサンプルアプリは、サンプルプロジェクトに含まれるContent/GISSample/GISSample_Map.umapを開き、プレイすることで実行できます。

図17-71 GISSample_Mapをプレイした図

[1]カメラ操作

カメラの移動や回転には、マウスを使います。

水平移動マウス左ボタン+ドラッグ
回転マウス右ボタン+ドラッグ
前後移動マウスホイール回転
上下左右移動中央ボタン+ドラッグ または
左ボタン+右ボタン+ドラッグ

[2]属性の確認

地物をクリックすると、その地物がハイライトされ、属性情報が表示されます。(図17-71)

3D都市モデルに含まれる各地物(建築物、道路など)の属性情報の可視化は以下①~③の流れで行われています。

①クリックされたゲームオブジェクトの取得

ゲームオブジェクトの取得にはGet Hit Result UnderCursor for Objects関数を使用しています(図17-68)。画面上をクリックした際、カメラの原点からクリックされた地点に向けて仮想のビームが射出されて、ビームの衝突情報(Hit Result)から衝突したコンポーネント(Hit Component)を取得しています。

図17-72 クリックされたコンポーネントの取得(BP_GISCameraActor)

②ゲームオブジェクトに対応する地物の属性情報の取得

先ほど取得された地物のコンポーネント(Hit Component)から属性情報を取得するには、まずGetCityObjectInfo関数を利用して都市情報を取得します。GetCityObjectInfo関数に地物のコンポーネントとインポートされた都市モデルのアクタ(City Model Instance)を入力し、その出力としてPLATEAU CityObjectInfoを得ます。そこからクリックされた地物のGML IDを取得します。GISSampleでは初期化時にすべてのCity Objectを読み込んでCityObjectMapに格納しています。City Objectの読み込みについては後述します。CityObjectMapからID検索で地物情報を得ます。

図17-73 City Modelの取得(BP_GISCityObjectManagerのSelectComponent関数)

地物の各コンポーネントには、3D都市モデルに含まれる複数の地物の情報が格納されています。地物の情報を取得するには、コンポーネントをPLATEAU City Object Groupにキャストし、Get All Root City Objectsします(図17-74)。それに対してFor Each LoopでPLATEAU City Objectを取得します。

図17-74 City Objectの取得(BP_CityObjectManager)

City Objectに対してGet Attribute Mapし、Break PLATEAU Attribute Mapで属性情報を取得します(図17-75)。属性情報はキーと値の辞書配列になっており、For Each Loopでキーと値のペアを取得できます。

図17-75 属性情報の取得(BP_CityObjectManagerのView Attribute関数)

③属性情報のUIへの表示

GISSampleでは、UIの構築にUnreal Motion Graphics UI デザイナ(UMG)を使用しています。属性情報UIのWidget ブループリントでは、デザイナー画面でスクロールビューに2つのテキストを含んだ要素を上下に並べるように設定してあります(図17-76)。グラフ画面で属性情報の連想配列からすべてのキーと値を取得して、それぞれの組み合わせについてUIを追加していくことで属性情報UIを構成しています(図17-77)。

図17-76 属性情報UIの表示設定(WBP_HUD)
図17-77 属性情報のUIへの表示(WBP_HUD)
図17-78 属性情報の表示

[3]属性による色分け表示

高さや各種浸水ランクで、地物を色分けすることができます。

SDKでインポートされた各地物のマテリアルには、色を変更するためのパラメータとして、テクスチャ付きの場合は[BlendColor]パラメータが、テクスチャ無しの場合は[BaseColor]パラメータが提供されています。GISSampleでは両方のマテリアルに対応するために、両方のパラメータの値を変更しています。

図17-79 StaticMeshComponentへの色の設定(BP_GISCityObjectManager)
図17-80 色分けを選択するラジオボタン
図17-81 高さで色分けしたところ

[4]フィルタリング

高さやLODの範囲を指定し、指定された範囲内の地物だけを抽出することができます。

GISSampleでは各地物の表示・非表示切替のために、SetVisibility関数で描画を、Set CollisionEnable関数でコリジョンを切り替えています。

図17-82 コンポーネントの表示・非表示切替(BP_GISCityObjectManager)
図17-83 フィルタリングの設定を行うスライダー
図17-84 高い建物を抽出したところ

17.6.2 _ GISサンプルの3D都市モデルの変更

3D都市モデルを、任意の地域に変更することができます。

[1]3D都市モデルの削除

GISSampleレベルに配置されている3D都市モデルのアクタ(初期状態では「13100_tokyo23-ku_2020_citygml_3_2_op」)を削除します。

図17-85 削除するアクタ

[2]3D都市モデルのインポート

利用したい3D都市モデルをインポートします。インポート方法については「17.5.2 _ PLATEAU SDK for Unrealを使用する」を参照してください。

【メモ】

インポートする地物タイプについて、起伏については、インポートしてもしなくても機能的には影響ありません。
また道路なども、必要なければインポートしなくても問題ありません。
インポートが完了すると、レベルに3D都市モデルのアクタが配置されます。

[3]City Model Instanceの設定

BP_GISCityObjectManagerアクタのCity Model Instanceプロパティに、3D都市モデルのアクタを設定します。

図17-86 City Model Instanceの設定

[4]位置の調整

BP_CameraActorの位置を調整し、3D都市モデルがビューポートに収まるようにします。

図17-87 BP_CameraActorの位置調整

[5]プレイ

プレイすると、インポートした3D都市モデルの属性の確認や色分け表示ができます。

17.6.3 _ ゲームサンプルアプ

都市空間上でのインタラクションの作成方法について知るためのチュートリアルとして、ゲームサンプルアプリを提供しています。

ゲームサンプルアプリでは、制限時間内にロボットに襲われている要救助者を救出するゲームとなっています(図17-88)。
敵を避けながら要救助者と接触し、なるべく多くの人数をゴールに連れて行き救助することを目指します。ゴールの場所は紙飛行機を取得すると明らかになります。敵は街を歩き回りますが、プレイヤーを見つけると襲ってきます。要救助者も街を歩き回りますが、プレイヤーと接触すると同行者として付いてくるようになります。同行者がいる状態でゴールとなる建物に接触すると救助となります。

メインとなるゲームレベルの場所はPlateauGameSample/MainMap.umapにあり、タイトル画面はTitle/Title.umapにあります。マップを開いてプレイすることで実行できます。

図17-88 MainMapをプレイしたところ

[1]遊び方

操作方法は下表のとおりです。

W,A,S,Dキー前後左右移動
左クリック攻撃
スペースジャンプ
マウス移動視点移動

以下ではこのサンプルアプリのコードを解説します。

[2]ゴールの設置と属性情報の取得

紙飛行機を取得すると、ゴールがミニマップに表示されてゴールとなる建物が発光します。ゴールが生成されるとき、1つのゴール建物で救出可能な人数について、建物の高さが高いほど多くの人数を救出できるようにしています。このサンプルでは建物の属性情報から高さを取得しています。

属性情報は各地物に付与されたPLATEAUCityObjectGroupコンポーネントに格納されています(図17-89)。

図17-89 建物に含まれる、高さに関する属性情報

紙飛行機のブループリントはBP_HintPaperPlaneです。Event ActorBeginOverlapでプレイヤーと接触時に以下のコードを実行します(図17-90)。

図17-90 紙飛行機の実装

● 属性情報の取得

属性情報から建物の高さを取得する処理は、ブループリント関数ライブラリであるPlateauUtilのGetHeightFromBuildingComponent関数で記述しています(図17-91)。

図17-91 属性情報から建物の高さを取得

上図のように、まず建物コンポーネントをPLATEAUCityObjectGroupにキャストします。次にGetAllRootCityObjectsします。サンプルの建物は主要地物単位でインポートされているためGetAllRootCityObjectsは建物1つのPLATEAUCityObjectを返します。このPLATEAUCityObject配列の0番目をGETし、GetAttributesから建物の高さのキーである”bldg:measuredheight”をFINDします。このキーに対応する属性情報の値は数値として取得できるので、GetDoubleで取得して返します。

ゴールの建物の見た目

ゴールの建物は、マテリアルの変更によって発光します。マテリアル変更のブループリントは下図のとおりです。

図17-92 マテリアル変更

[3]キャラクターの挙動

プレイヤーキャラクターの挙動

プレイヤーキャラクターの挙動は、Unrealのデフォルトのサードパーソン機能であるBP_ThirdPersonCharacterを利用していますが、敵への攻撃のために改変してBP_ThirdPersonPlayerとしています。

主な改変点は次のとおりです。

 ◯ 敵への攻撃処理をEnhancedInputAction IA_Attackイベントにて実装

 ◯ ゴール接触時の処理をEvent Hitを起点に実装

● 要救助者キャラクターおよび敵キャラクターの移動処理

要救助者キャラクターおよび敵キャラクターの移動処理はUnrealのNavMesh機能を用いています(図17-93、図17-94)。

NavMeshの貼り方は、駅から歩行可能な範囲を選択し、Unreal Engineの機能により自動的に生成されたものを利用しました。

図17-93 NavMeshの通行可能範囲を緑色で図示したもの
図17-94 NavMeshの範囲

また、アニメーション等については、UnrealのデフォルトであるBP_TrhidPersonCharacterを利用しています。

● 要救助者キャラクターおよび敵キャラクターの巡回行動

キャラクターが3D都市モデル内をランダムに巡回します。

キャラクターの巡回ルートは、BP_RoadPointsの変数RoadPointsで管理されています。RoadPointsは3D都市モデルの道路用オブジェクトの交差点の位置に配置されたVector群です。

図17-95 3D都市モデル上に配置されたRoadPoints

巡回行動の処理は以下になります。

 1. 目的地の設定: 独自に作成したGetRandomLocation関数より、RoadPointsのランダムな要素(Vector)を取得し、キャラクターの新しい目的地に設定します。

 2. 目的地への移動: Unrealの標準の関数であるMoveToLocationorActor関数より、キャラクターは現在のRoadPointsから新しい目的地のRoadPointsへ移動します。移動後は一定時間経過後、1に戻ります。

図17-96 RoadPointsを利用した巡回行動の処理

要救助者の挙動は、プレイヤーが接触したらUnrealのNavMesh機能によってプレイヤーの追尾を開始します。追尾時にプレイヤーと距離が空いたらプレイヤーの後方にワープします。

● 敵キャラクターの視界

敵キャラクターの視界はライントレースを使用しています。プレイヤーへの視界が通るかをチェックし、視界が通る間、追跡行動を行います。

● 要救助者キャラクターおよび敵キャラクターの追跡行動

プレイヤーを追跡する処理です。Unrealの標準の関数であるGetPlayerController関数よりプレイヤーの位置情報を取得し、MovetoActor関数より、プレイヤーを追跡します。

図17-97 MovetoActor関数を利用した追跡行動の処理

[4]要救助者キャラクターとのインタラクション

ゲームにおけるプレイヤーと要救助者キャラクターのインタラクションについて説明します。

同行者数の追加

要救助者キャラクターがプレイヤーに衝突すると、Unrealの標準関数であるEvent Hit関数が実行されます。Event Hit関数内の処理では、プレイヤーの現在の同行者数が追加され、画面に表示されます。

図17-98 要救助者キャラクターがプレイヤーに衝突した時の処理
図17-99 救助中の様子

救助者数の追加

プレイヤーが避難所に衝突すると、Unrealの標準関数であるEvent Hit関数が実行されます。Event Hit関数内の処理では、避難所の収容可能人数だけ救助されます。救助された数だけ同行者数が減り、救助者数が追加され、画面に表示されます。

図17-100 プレイヤーが避難所に衝突した時の処理
図17-101 救助完了の様子 ※現在のプレイヤーの見た目は画像とは異なります

【文】

崎山 和正(株式会社シナスタジア)