TOPIC 17|PLATEAU SDKでの活用[2/2]|PLATEAU SDK for Unrealを活用する
PLATEAU SDK for Unrealとは、PLATEAUの豊富なデータを活用して実世界を舞台にしたアプリの開発や都市シミュレーション等を行うためのツールキットです。このトピックでは、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とは

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の機能

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

インポート処理は以下の流れで行われます。
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はより細かい形状です。(TOPIC1 1.3 3D都市モデルの特徴」を参照)
[3]地物分割・結合機能
地物分割・結合機能ではエディタ上で3D都市モデル内の各オブジェクトの結合単位の変更が行えます。
分割・結合したいオブジェクトを選択し、結合単位を以下のオプションから指定して実行ボタンを押すと選択オブジェクトの結合単位が更新されます。
◯ 地域単位
◯ 主要地物単位
◯ 最小地物単位
また、分割・結合処理の前後で以下の情報が保持されるようになっています。
◯ 各オブジェクトの階層構造
◯ ポリゴンメッシュ情報
◯ マテリアル情報
◯ 属性情報
[4]マテリアル分け機能

マテリアル分け機能では3D都市モデル内の各オブジェクトについて、地物型・属性情報によってマテリアルを分割・適用できます。地物型でのマテリアル分けでは、LOD2以上の地物形状における構成部品(建築物での壁面、屋根面等)毎に分割を行うことができます。属性情報でのマテリアル分けでは、例えばLOD2以上の道路モデルにおいて車道部と歩道部を分割し別のマテリアルを付与して見た目を向上したり、歩行者の移動範囲を歩道部のみに制限することができます。
[5]属性情報取得機能

属性情報取得機能では、ブループリント、C++ユーザー向けのAPIを提供しています。APIを利用することでCityGMLに含まれるすべての属性情報にアクセスできます。インポートされた都市モデルに含まれるコンポーネントの名前はCityGMLでのIDに対応しているため、各コンポーネントの名前をAPIに入力することで付随する属性情報を取得できます。属性情報取得機能の詳細についてはユーザーマニュアルの属性情報へのアクセスのページをご覧ください。
[6]地形変換/高さ合わせ機能
地形変換機能では、地形モデルの平滑化・テレインへの変換を行います。地形モデルからHeight Mapを生成し、平滑化処理を行うことで、地形モデルの凹凸を滑らかに表現することができます。また、地形を「Landscape」として出力すれば、UnrealEngineの標準機能により高さの変更やテクスチャの設定ができるようになります。これによって地形モデルの不自然な凹凸を滑らかに表現できます。
高さ合わせ機能では、道路モデルLOD1など、高さが付与されていない地物の高さを地形モデルに合わせたり、道路モデルLOD3のように、正確な高さが付与されているものの地形モデルとの精度差によりめり込んでしまっている場合において、地形モデルの高さを道路モデルLOD3に合わせる形状修正を行います。
[7]道路テクスチャ自動生成機能
道路テクスチャ自動生成機能では、道路モデル LOD1-3 に対し自動で区画線や道路標示などを付与し、道路の見た目を向上させることができます。

[8]都市モデルエクスポート機能
都市モデルエクスポート機能では、インポートされた3D都市モデルを3Dファイル形式でエクスポートできます。
出力設定は以下の通りです。
ファイル形式 | OBJ、FBX、glTFに対応しています。 |
テクスチャ | 出力するメッシュにテクスチャを含めるかどうかを選択します。 |
非表示モデルを含める | 都市モデル調整機能で非表示に設定されたオブジェクトを含めるかどうかを選択します。 |
座標変換 | 出力座標系をローカル座標(Unrealワールド内での座標)と平面直角座標から選択します。 |
座標軸 | 出力されるメッシュの座標軸を設定します。 |
その他のPLATEAU SDKの機能および各機能の詳細説明についてはこちらをご確認ください。
17.5 _ PLATEAU SDK for Unrealを使用する
PLATEAU SDK for Unrealは、Unreal Engine向けのプラグインとして提供されています。本チュートリアルではSDKのサンプルを含んだプロジェクトを使用して解説しますが、個別のプロジェクトにSDKを導入する場合はユーザーマニュアルのインストール手順に従ってください。
17.5.1 _ サンプルプロジェクトを導入する
[1]Unreal Engine のインストール
PLATEAU SDK for Unrealの対応バージョンは今後更新される可能性があります。最新の対応バージョンについては、リリースノートをご確認ください。推奨バージョンがインストールされていない場合は、以下の手順でインストールしてください。
1. Epic Games Launcher をインストールします。Epic Games Launcherは、Unreal Engineの管理・起動ができる公式ツールです。
2. Epic Games Launcher を開き、[Unreal Engine]タブに移動します。
3. ライブラリ セクションから、リリースノート推奨されているUnreal Engineのバージョンを選択し、インストールしてください。

[2]サンプルアプリの導入
1. ゲームサンプルアプリ、GISサンプルアプリのページからUnrealプロジェクトをダウンロードしてzipファイルを展開します。
2. 展開したフォルダ内にあるPLATEAUUnrealSamples.uprojectをダブルクリックすることでプロジェクトを開くことができます。
17.5.2 _ PLATEAU SDK for Unrealを使用する
[1]データのダウンロード(ローカルのデータを利用する場合)
PLATEAUの3D都市モデルデータは、G空間情報センターの3D都市モデル(Project PLATEAU)ポータルサイトで公開されています。ポータルサイトから地域を選び、CityGMLデータをダウンロードして展開します。
https://front.geospatial.jp/plateau_portal_site/
なお、CityGMLには「(v1)」と付くものと「(v2)」と付くものが両方配布されているなど、バージョン違いが配布されていることがあります。その場合、最新のバージョンであるv3またはv4をご利用ください。PLATEAU SDKはv2以上に対応しています。

[2]インポート元の選択(ローカル)
ここからは、ユーザーマニュアルの3Dモデルのインポートのページに沿って、展開したデータをインポートします。
UE5のメニューバーから [PLATEAU]→[PLATEAU SDK]を選択してSDK画面を開きます。上部のタブから[インポート]を選択してインポート画面を開きます。
インポート元として、事前にダウンロードしたデータを利用する「ローカル」、またはサーバーから直接データをダウンロードして利用する「サーバー」のどちらかを選択します。
[3-A]ローカルインポートの場合
フォルダパスには、展開したCityGMLデータの最上位フォルダ(「udx」などの1つ上の階層のフォルダ)を設定します。

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

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

[5]インポート範囲の選択
範囲選択ボタンを押すと範囲選択画面が開きます。

● 範囲選択画面の操作方法:
◯ マウスホイールを上下に回してズームアウト、ズームインします。
◯ 左クリックしながらマウスを移動してカメラ移動します。
◯ 範囲の選択方法については、画面右下にある下記説明のとおりです。
・クリックで選択/選択解除
・ドラッグで矩形での選択追加
・Shift+ドラッグで矩形での選択除外をします。
◯ 範囲がオレンジ色で表示されない場合は、見えるまでズームします。
◯ ビューポート左上の[決定]ボタンを押して範囲を確定します。
● 画面の見方:
◯ 青色の線は利用可能な地域を示します。
◯ 地域ごとに利用可能なGML種別と対応LODがアイコン形式で表示されます。
・対応LODは色で表現されます。画面左下の凡例の色と対応します。
◯ アイコンが多すぎると感じる場合は、画面左下の凡例のチェックを切り替えることでアイコンの表示/非表示をLODごとに切り替えることができます。
◯ 地図は国土地理院のサーバーから自動でダウンロードされて表示されます。インターネットへの接続が必要です。
● メッシュコード検索機能:
◯ シーンビュー左上のメッシュコード検索ボタンを押すと、メッシュコードの番号(地図上で青色で表示される数字)で検索できます。
なお、メッシュとは、経緯度に基づいて地域を同じ大きさの網の目に分けたものを指します。
メッシュコードとは、各メッシュを識別するために割り振られた番号を指します。
◯ 番号を入力してOKボタンを押すと、その範囲に視界が移動します。
どの地域がどのメッシュコードに該当するかをWebで調べたい場合は、jSTAT MAPを利用します。jSTAT MAPで「ログインしないで始める」をクリックすると地図が開きます。右上のメニューから3次メッシュを選択し、「ラベル」にチェックを入れると地図上に3次メッシュコードが表示されます(図17-67)。

[6]地物別設定
地物の種類ごとにインポートに関する設定を行います。
設定項目について:
● インポートする
◯ チェックが付いている地物タイプのみインポートします。
● テクスチャを含める
◯ テクスチャが存在する地物タイプで表示される設定項目です。
◯ チェックが付いていて、かつテクスチャがある場合はそれを含めてインポートします。
◯ 都市によってはテクスチャがない場合があり、その場合はチェックを外した時と同様にデフォルトマテリアルが適用されます。
● テクスチャを結合する
◯ テクスチャを含める場合、テクスチャ結合機能を利用できます。
◯ PLATEAUのデータはテクスチャの枚数が多い傾向にあり、結合しないと描画負荷が高くなる傾向にあります。
◯ 結合機能を有効にすると、複数のテクスチャを1枚の画像にまとめ、3DモデルのUVも合わせて調整されます。それによって描画負荷を改善できます。
●テクスチャ解像度
◯ テクスチャを結合する場合の、結合後のテクスチャの大きさを指定します。
● LOD描画設定
◯ 複数のLODを利用可能な地物タイプで表示される設定項目です。
◯ 最小LOD、最大LODを指定して、インポートするLODの範囲を指定できます。
● モデル結合
◯ 主要地物単位(建築物,道路等)
モデルのメッシュは建物ごとに結合されて出力されます。建物ごとに地物データを取得できるようにしたい場合はこちらを選択します。
◯ 最小地物単位(壁面,屋根面等)
屋根、壁単位など非常に細かくオブジェクトを分けたい場合はこちらを選択します。
◯ 地域単位
モデルのメッシュは結合されて出力されます。オブジェクト数を削減して軽量化できますが、建物ごとの地物データは取得不可になります。メッシュの結合はある程度の大きさの範囲ごとに行われます。
● 属性情報を含める
◯ 有効化すると、地物の属性情報がレベル中にコンポーネント内に保存されます。
◯ 下図のように、コンポーネントから属性情報を確認できます。

これは属性情報に関する機能を扱うためには必須となります。一方で、PLATEAUの3D都市モデルの規模に応じてレベル中のデータ量が増大することから、属性情報を利用しない、かつ軽量化が重要である場合には属性情報をオフとしてインポートするのが有利となります。
● デフォルトマテリアル
◯ PLATEAUの3D都市モデルのうち、テクスチャやマテリアル指定がない箇所のマテリアルを指定します。
◯ デフォルトでは、地物タイプに応じたマテリアルが指定されています。
[7]土地に衛星写真や地図を貼り付ける
土地に衛星写真や地図を貼り付けることができます。

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

● 土地起伏では、上述の地物別設定に加えて土地起伏専用の設定項目があります。
● 衛星写真または地図を付与する
◯ チェックがONになっていると機能が有効化されます。
● 地図タイルURL
◯ 航空写真または地図の画像をダウンロードするためのURLです。
◯ デフォルトでは地理院地図の航空写真のURLが入力されています。
◯ このURLを変更すれば、航空写真だけでなく、国土地理院が提供している多種多様な
地図や写真を土地に貼り付けることができます。
利用できる地図については国土地理院のページを参照してください。
そのページに記載されているURLを貼り付けることで地図を利用できます。
◯ 下図は地図を貼り付けた例です。

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

◯ URLには文字列 {z}, {x}, {y}を含めるようにしてください。これは地図タイルのxyz座標に変換されます。
・地図タイルのxyz座標については国土地理院のページを参照してください。
・SDKの機能により、土地の座標をもとに文字列{z}, {x}, {y}を適切な数値に置き換えて画像をダウンロードします。
◯ ズームレベル
地図タイルのズームレベルです。
・数値が大きいほど高精細な画像になります。
・数値が1つ下がると、画素数が4分の1になります。
・ズームレベルは、地図タイルxyz座標のzの値に相当します。
◯ 利用可能なズームレベルの検索
・ボタンを押すと、現在入力されているURLでどのズームレベルが利用可能なのかを検索します。
・検索が完了すると、ズームレベルのドロップダウンの選択肢が変化し、利用可能なズームレベルから選択できるようになります。

この機能でダウンロードされた地図タイルは、自動で1枚の画像に結合され、土地のUVとマテリアルが設定されてインポートされます。
[8]インポートの実行
[モデルをインポート]ボタンをクリックするとインポートが開始されます。
ウィンドウを下にスクロールすると、インポート処理の進捗が表示されます(図17-74)。
処理が進むと、都市のオブジェクトが順次ワールドに配置されていきます。進捗表示がすべて「完了」になったらインポート終了です。


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

【メモ】
インポート元となるファイルはContent/PLATEAU/Datasetsフォルダにコピーされます。インポート処理で生成されたテクスチャアセットはContent/PLATEAU/Texturesフォルダに保存され、2回目以降のインポートで同じテクスチャを利用する場合はすでに保存されたアセットが再利用されます。
[9]各機能へのアクセス
SDKの各機能にはSDK画面の上部タブ(図17-77)からアクセスできます。SDKの機能を利用することで、インポートした3D都市モデルについて表示地物の調整・3Dファイル形式へのエクスポート・属性情報へのアクセスができます。各機能の利用方法はユーザーマニュアルを参照してください。

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を開き、プレイすることで実行できます。

[1]カメラ操作
カメラの移動や回転には、マウスを使います。
水平移動 | マウス左ボタン+ドラッグ |
回転 | マウス右ボタン+ドラッグ |
前後移動 | マウスホイール回転 |
上下左右移動 | マウス中央ボタン+ドラッグ または マウス左ボタン+右ボタン+ドラッグ |
[2]視点操作
歩行者視点機能
歩行者マークをクリック後、マップをクリックするとクリックした位置にカメラが移動します。俯瞰視点に戻るためには再度、歩行者マークをクリックします。

[3]属性の確認
地物をクリックすると、その地物がハイライトされ、属性情報が表示されます。(図17-78)
3D都市モデルに含まれる各地物(建築物、道路など)の属性情報の可視化は以下①~③の流れで行われています。
①クリックされたゲームオブジェクトの取得
ゲームオブジェクトの取得にはGet Hit Result UnderCursor for Objects関数を使用しています(図17-80)。画面上をクリックした際、カメラの原点からクリックされた地点に向けて仮想のビームが射出されて、ビームの衝突情報(Hit Result)から衝突したコンポーネント(Hit Component)を取得しています。

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

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

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

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



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



[5]フィルタリング
高さやLODの範囲を指定し、指定された範囲内の地物だけを抽出することができます。
GISSampleでは各地物の表示・非表示切替のために、SetVisibility関数で描画を、Set CollisionEnable関数でコリジョンを切り替えています。



[6]建物テクスチャの表示切り替え
建物にテクスチャが貼り付けられた状態にするか、テクスチャを外して単色で表示するかを切り替えます。

17.6.2 _ GISサンプルの3D都市モデルの変更
3D都市モデルを、任意の地域に変更することができます。
[1]3D都市モデルの削除
GISSampleレベルに配置されている3D都市モデルのアクタ(初期状態では「13100_tokyo23-ku_2020_citygml_3_2_op」)を削除します。

[2]3D都市モデルのインポート
利用したい3D都市モデルをインポートします。インポート方法についてはマニュアルの「インポート方法」を参照してください。
【メモ】
インポートする地物タイプについて、起伏については、インポートしてもしなくても機能的には影響ありません。
また道路なども、必要なければインポートしなくても問題ありません。
インポートが完了すると、レベルに3D都市モデルのアクタが配置されます。
[3]City Model Instanceの設定
BP_GISCityObjectManagerアクタのCity Model Instanceプロパティに、3D都市モデルのアクタを設定します。

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

[5]プレイ
プレイすると、インポートした3D都市モデルの属性の確認や色分け表示ができます。
17.6.3 _ ゲームサンプルアプリ
都市空間上でのインタラクションの作成方法について知るためのチュートリアルとして、ゲームサンプルアプリを提供しています。
ゲームサンプルアプリでは、制限時間内にロボットに襲われている要救助者を救出するゲームとなっています(図17-97)。
敵を避けながら要救助者と接触し、なるべく多くの人数をゴールに連れて行き救助することを目指します。ゴールの場所は紙飛行機を取得すると明らかになります。敵は街を歩き回りますが、プレイヤーを見つけると襲ってきます。要救助者も街を歩き回りますが、プレイヤーと接触すると同行者として付いてくるようになります。同行者がいる状態でゴールとなる建物に接触すると救助となります。
メインとなるゲームレベルの場所はPlateauGameSample/MainMap.umapにあり、タイトル画面はTitle/Title.umapにあります。マップを開いてプレイすることで実行できます。

[1]遊び方
操作方法は下表のとおりです。
W,A,S,Dキー | 前後左右移動 |
左クリック | 攻撃 |
スペース | ジャンプ |
マウス移動 | 視点移動 |
以下ではこのサンプルアプリのコードを解説します。
[2]ゴールの設置と属性情報の取得
紙飛行機を取得すると、ゴールがミニマップに表示されてゴールとなる建物が発光します。ゴールが生成されるとき、1つのゴール建物で救出可能な人数について、建物の高さが高いほど多くの人数を救出できるようにしています。このサンプルでは建物の属性情報から高さを取得しています。
属性情報は各地物に付与されたPLATEAUCityObjectGroupコンポーネントに格納されています(図17-98)。

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

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

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

[3]キャラクターの挙動
● プレイヤーキャラクターの挙動
プレイヤーキャラクターの挙動は、Unrealのデフォルトのサードパーソン機能であるBP_ThirdPersonCharacterを利用していますが、敵への攻撃のために改変してBP_ThirdPersonPlayerとしています。
主な改変点は次のとおりです。
◯ 敵への攻撃処理をEnhancedInputAction IA_Attackイベントにて実装
◯ ゴール接触時の処理をEvent Hitを起点に実装
● 要救助者キャラクターおよび敵キャラクターの移動処理
要救助者キャラクターおよび敵キャラクターの移動処理はUnrealのNavMesh機能を用いています(図17-102、図17-103)。
NavMeshの貼り方は、駅から歩行可能な範囲を選択し、Unreal Engineの機能により自動的に生成されたものを利用しました。


また、アニメーション等については、UnrealのデフォルトであるBP_TrhidPersonCharacterを利用しています。
● 要救助者キャラクターおよび敵キャラクターの巡回行動
キャラクターが3D都市モデル内をランダムに巡回します。
キャラクターの巡回ルートは、BP_RoadPointsの変数RoadPointsで管理されています。RoadPointsは3D都市モデルの道路用オブジェクトの交差点の位置に配置されたVector群です。

巡回行動の処理は以下になります。
1. 目的地の設定: 独自に作成したGetRandomLocation関数より、RoadPointsのランダムな要素(Vector)を取得し、キャラクターの新しい目的地に設定します。
2. 目的地への移動: Unrealの標準の関数であるMoveToLocationorActor関数より、キャラクターは現在のRoadPointsから新しい目的地のRoadPointsへ移動します。移動後は一定時間経過後、1に戻ります。

要救助者の挙動は、プレイヤーが接触したらUnrealのNavMesh機能によってプレイヤーの追尾を開始します。追尾時にプレイヤーと距離が空いたらプレイヤーの後方にワープします。
● 敵キャラクターの視界
敵キャラクターの視界はライントレースを使用しています。プレイヤーへの視界が通るかをチェックし、視界が通る間、追跡行動を行います。
● 要救助者キャラクターおよび敵キャラクターの追跡行動
プレイヤーを追跡する処理です。Unrealの標準の関数であるGetPlayerController関数よりプレイヤーの位置情報を取得し、MovetoActor関数より、プレイヤーを追跡します。

[4]要救助者キャラクターとのインタラクション
ゲームにおけるプレイヤーと要救助者キャラクターのインタラクションについて説明します。
● 同行者数の追加
要救助者キャラクターがプレイヤーに衝突すると、Unrealの標準関数であるEvent Hit関数が実行されます。Event Hit関数内の処理では、プレイヤーの現在の同行者数が追加され、画面に表示されます。


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


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