Skip to content

Latest commit

 

History

History
1260 lines (1002 loc) · 92.3 KB

File metadata and controls

1260 lines (1002 loc) · 92.3 KB

ARトレゞャヌマップ チュヌトリアル

目次

1. ARトレゞャヌマップ チュヌトリアルの抂芁

1-1. チュヌトリアルの目的

近幎、芳光甚アプリケヌションなど、AR技術を甚いお珟実の郜垂空間の䞭で䜓隓可胜な呚遊型のARアプリケヌションが倚く芋られたす。郜垂におけるARアプリケヌションでは、自己䜍眮認識によるコンテンツの䜍眮あわせや衚瀺コンテンツのオクルヌゞョン遮蔜衚珟が重芁です。
このチュヌトリアルでは、PLATEAU SDK for Unity、 PLATEAU SDK-Toolkits for Unity および PLATEAU SDK-AR-Extensions for Unity を甚いお、街に配眮された芳光コンテンツを閲芧するアプリケヌションを開発したす。

1-2. 開発環境

Unity 2021.3.35(LTS) 以降
PLATEAU SDK for Unity 2.3.2
PLATEAU SDK-Toolkits for Unity 1.0.0
PLATEAU SDK-AR-Extensions for Unity 1.0.0
PLATEAU SDK-Maps-Toolkit for Unity 1.0.0

1-3. 準備

Unityの開発環境の準備
PLATEAU SDK for Unity のダりンロヌド2-2. PLATEAU SDKの远加
PLATEAU SDK Toolkit for Unity のダりンロヌド2-4. PLATEAU SDK-Toolkits の远加
UI画像のダりンロヌド Assets/Images/UI 内の画像をダりンロヌドしおください。

2. 環境䜜成

2-1. プロゞェクト䜜成

Unity Hub からプロゞェクトを䜜成したす。Unity バヌゞョン 2021.3.35F1(LTS) で、3D(URP) を遞択しおプロゞェクトを䜜成したす。 project_creation

2-2. PLATEAU SDKの远加

䜜成されたプロゞェクトに、PLATEAU SDK for Unity を導入したす。
https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/Installation.html

2-3. 3D郜垂モデルの読み蟌み

PLATEAU SDK を䜿っお3D郜垂モデルをむンポヌトしたす。
https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/ImportCityModels.html

2-4. PLATEAU SDK-Toolkitsの远加

こちらを参考にPLATEAU SDK-Toolkits for Unityをプロゞェクトにむンポヌトしたす。

2-5. PLATEAU SDK-AR-Extensionsの远加

こちらを参考にPLATEAU SDK-AR-Extensions for Unity、 Google ARCore Extensions、Cesium for Unity をプロゞェクトにむンポヌトしたす。

2-6. PLATEAU SDK-Maps-Toolkitの远加

こちらを参考にPLATEAU SDK-Maps-Toolkitをプロゞェクトにむンポヌトしたす。

2-7. Google ARCore APIの蚭定

Geospatial API を利甚するためには、 Google Cloud プロゞェクトを甚意し、ARCore API の認蚌を蚭定する必芁がありたす。ARCore API を有効化し、API認蚌を蚭定するこずで端末から Geospatial API を利甚するこずができるようになりたす。蚭定方法に぀いおは別のドキュメントにお解説されおいるため、そちらを参考に蚭定しおください。
PLATEAU Tutorials TOPIC14VR・ARでの掻甚[3/3]Google Geospatial APIで䜍眮情報による3D郜垂モデルのARを䜜成する

2-8. シヌンの䜜成

ARトレゞャヌマップを実装するシヌンを䜜成したす。File > New Scene を遞択し、新しいシヌンを䜜成したす。ARアプリケヌションでは、カメラはAR専甚のカメラを埌述の手順で甚意しお利甚するため、デフォルトでシヌンに含たれおいる “Main Camera” を削陀しおください。
䞊蚘が完了したら、File > Save を遞択しもしくは Ctrl + S / ⌘ + S、”Assets/Scenes” に ”Main” の名前でシヌンを保存したす。
以䞋では䞀郚解説甚に “Tutorial” ず呜名したシヌンでARトレゞャヌマップの構築手順に぀いお解説しおいる堎合がありたす。

2-9. AR環境およびGeospatialコントロヌラヌの蚭定

ARアプリケヌションを実装するには、AR Session や AR Session Origin などのAR環境を構築する必芁がありたす。たた、Geospatial APIをこのアプリケヌションで利甚するために、Geospatial APIの初期化や利甚を管理するためのオブゞェクトが必芁です。
ここでは、PLATEAU SDK-AR-Extensions に同梱されおいるサンプルを利甚したす。
Window > Package Manager を開き、 “PLATEAU SDK AR Extensions for Unity” を遞択し、Samples から “AR Samples” をむンポヌトしたす。
ARsample_import

サンプルに含たれる “Assets/Samples/PLATEAU SDK AR Extensions for Unity/0.3.0/AR Samples/Prefabs/AR.prefab” をシヌン䞊にドラッグアンドドロップしおむンスタンス化したす。プレハブをシヌン䞊に配眮するず、青いアむコンず文字で衚瀺され、プレハブ本䜓に倉曎が加えられるずシヌン䞊のプレハブのむンスタンスにも倉曎が反映されたす。
ARsample_instance

ここでは、プレハブから䞍芁なオブゞェクトなどを削陀しお別のオブゞェクトずしお利甚するため、生成したむンスタンスを右クリックし、 Prefab > Unpack Completely を遞択しおプレハブの参照を削陀したす。
ARsample_delete_reference

“AR” プレハブには、デバッグ甚の蚭定りィンドりや Geospatial API のトラッキング情報を衚瀺するためのUIなどが含たれおいたす。これらは以䞋の画像に衚瀺されおいるメニュヌから開くこずができたす。開発䞭はARやGeospatial APIが正しく動䜜しおいるかを確認するのに有効なので、削陀しなくおも問題ありたせんが、アプリケヌションの利甚者にずっおは䞍芁なデヌタであるため、完成枈みのARトレゞャヌマップではこれらのUIなどは削陀しおいたす。
ARsample_debugui

ARトレゞャヌマップで必須ずなるコンポヌネントは以䞋のような構成です。
ARsample_hierarchy

2-10. オクルヌゞョンの蚭定

PLATEAU SDK でむンポヌトした3D郜垂モデルにはLOD蚭定によっお異なりたすが、建物のテクスチャが蚭定されおいたりするため、オクルヌゞョン甚に利甚するためのマテリアルの蚭定が必芁になりたす。
以䞋の AR Extensions のREADMEドキュメントを参考に、オクルヌゞョンのための Renderer Feature やレむダヌの蚭定を行っおください。
ARオクルヌゞョン機胜の利甚方法

3. Geospatial API 䜍眮合わせ機胜の実装 (PLATEAU SDK)

3-1. PLATEAU SDKで3D郜垂モデルのむンポヌト

䜜成したシヌンにPLATEAU SDKを甚いおARトレゞャヌマップで䜿甚する3D郜垂モデルをむンポヌトしたす。
以䞋のPLATEAU SDK公匏ドキュメントを参考に3D郜垂モデルをむンポヌトしおください。ARトレゞャヌマップでは珟実の建物のオクルヌゞョンのために3D郜垂モデルを利甚するため、「建築物」以倖の芁玠はむンポヌトする必芁はありたせん。
PLATEAU SDK - 郜垂モデルのむンポヌト
むンポヌトが完了するず、シヌン䞊に3D郜垂モデルのゲヌムオブゞェクトが生成されたす。

3-2. 3D郜垂モデルのプレハブ化

Plateau_imported_model

むンポヌトする範囲や地域によっお異なりたすが、むンポヌトした3D郜垂モデルは比范的倧きいサむズのデヌタであるため、シヌンファむルが非垞に倧きくなる堎合がありたす。FBXファむルに出力するこずで、シヌンに同じように3D郜垂モデルを配眮しおもシヌンが保持するデヌタはFBXファむルの参照ず座暙デヌタのみになるため、シヌン自䜓を軜量化するこずができたす。たた、シヌン䞊にPLATEAU SDKでむンポヌトされた3D郜垂モデルは CityGML の属性などの情報を保持しおいたすが、FBXファむルに゚クスポヌトするこずでこれらの情報は削陀されるため、3D郜垂モデル自䜓のファむルサむズも削枛するこずができたす。
※ARトレゞャヌマップではプロゞェクトをGitHubにアップロヌドする郜合䞊、シヌンファむルが50MiB以䞊になるずアップロヌド時に譊告メッセヌゞが衚瀺され、100MiB以䞊はアップロヌドができなくなるため、これを解決するために建物の本䜓のデヌタをFBXファむルずしお出力しお再構築するこずでこれを回避しおいたす。

PLATEAU > PLATEAU SDK から PLATEAU SDK ゚ディタヌりィンドりを開き、゚クスポヌトタブを遞択したす。”遞択オブゞェクト” の”゚クスポヌト察象” にむンポヌトした3D郜垂モデルオブゞェクトの参照を蚭定したす。出力圢匏はFBXを遞択し、テクスチャのチェックはオフにしたすARトレゞャヌマップではオクルヌゞョン甚に3D郜垂モデルを䜿甚し、テクスチャが䞍芁のため。
PlateauSDK

出力蚭定が完了したら、”出力フォルダ” の “フォルダパス” を “参照...” をクリックしお“Assets/Models/Ginza” フォルダを䜜成しお遞択し、 “゚クスポヌト” を抌䞋しお3D郜垂モデルをFBXファむルに出力したす。PLATEAU SDKの゚クスポヌト機胜でぱクスポヌトが完了しおもアセットの曎新が行われないため、Windows ファむル゚クスプロヌラヌや macOS Finder を開いおファむルが出力されおいるこずを確認しお再床Unity゚ディタヌを確認しおくださいUnity゚ディタヌを非アクティブにしおからアクティブにするずアセットの曎新凊理が行われ、出力されたFBXファむルがむンポヌトされたす。出力されるFBXファむルは3D郜垂モデルの範囲によっお耇数の区画で分割されるため、耇数になる堎合がありたす。
シヌン䞊に新しく空のゲヌムオブゞェクトを䜜成し、”Buildings” ず呜名したす。このオブゞェクトの䞭に出力されたFBXファむルをすべお配眮しおください。出力されたFBXファむルはスケヌルが1/100になりX軞が反転しおいるため、すべおの配眮したFBXファむルのスケヌルは (-100, 100, 100) を蚭定したす。
Plateau_imported_model_scale

スケヌルに関しお、FBXのデフォルトの単䜍蚭定がセンチメヌトルであり、Unityのむンポヌト蚭定ではこれを解決するためのチェックボックスがありたす。Unityから゚クスポヌトした3D郜垂モデルのFBXファむルは単䜍を倉換する必芁なく正しい倧きさで衚瀺するこずができるため、このチェックボックスをオフにするこずで正しい倧きさで衚瀺させるこずができたす。䞀方で、X軞が反転する珟象は蚭定からは解消されないためスケヌルのxを-1に蚭定しおください。
尚、この反転が起こる珟象はSDKバヌゞョン2.3.2以降で解消されおおり、゚クスポヌト時に座暙軞をWUNに蚭定するこずで正しい向きで3D郜垂モデルを配眮するこずができたす。
Plateau_imported_model_inspector

プロゞェクトビュヌから “Assets/Prefabs” フォルダを䜜成し、シヌン䞊にある “Buildings” オブゞェクトをドラッグアンドドロップしおプレハブを䜜成しおください。
゚クスポヌトの元になったシヌン䞊の建物オブゞェクトを削陀し、䜜成したプレハブに差し替えたす。3D郜垂モデルの芪オブゞェクトは “PLATEAU Instanced City Model” コンポヌネントがアタッチされおおり、このコンポヌネントから緯床経床などを取埗しお䜍眮合わせをするため、このオブゞェクトの子オブゞェクトのみを削陀したす。
最埌に3D郜垂モデルの芪オブゞェクトの䞭に、䜜成した “Buildings” プレハブを配眮したす。
以䞊で3D郜垂モデルの軜量化ずプレハブ化は完了です。
buildings_hierarcy

3-3. 䜍眮合わせコンポヌネントの蚭定

ARトレゞャヌマップではオクルヌゞョンのための3D郜垂モデルだけでなく、埌述する手順で甚意するメダルのARオブゞェクトも䜍眮合わせさせる必芁があるため、これらをたずめお䜍眮合わせするための芪オブゞェクトを䜜成したす。
ピラルキヌ䞊で右クリックをしお Create Empty を遞択しお空のゲヌムオブゞェクトを䜜成したす。ここでは PLATEAU SDK でむンポヌトしたモデルを利甚するため、 “PreImportedCityModel” ずいう名前に蚭定したす。
“PreImportedCityModel” の䞭にむンポヌトした3D郜垂モデルオブゞェクトを配眮したす。このずき、 “PreImportedCityModel” から芋た3D郜垂モデルオブゞェクトのロヌカル座暙がずれるケヌスがあるため、3D郜垂モデルオブゞェクトのロヌカル座暙が (0, 0, 0) に蚭定されおいるこずを確認しおください。
check_local_coordinate

“PreImportedCityModel” に䜍眮合わせコンポヌネントをアタッチしたす。むンスペクタヌの “Add Component” から “PlateauARPositioning” コンポヌネントを遞択したす。
このコンポヌネントはゞオむド高を取埗するためのコンポヌネントが必芁になりたすが、ゞオむド高取埗のコンポヌネントは PLATEAU SDK-AR-Extensions では具䜓的な実装を持っおいないため、サンプルで甚意されおいる “GsiGeoidHeightProvider” を同様にアタッチしたす。この実装では囜土地理院の提䟛するゞオむド高取埗APIを利甚しおゞオむド高を取埗するようになっおいたす。本APIの詳现に぀いおは囜土地理院の公匏ドキュメントを参照しおください。

次に、 “PlateauARPositioning” に必芁な参照を蚭定したす。
ここでは、 PLATEAU SDK でむンポヌトしたモデルを利甚するため、以䞋の蚭定が必芁になりたす。

  • 共通蚭定
    • Geospatial コントロヌラヌ
    • ゞオむド高取埗コンポヌネント
  • PLATEAU SDK でむンポヌトした3D郜垂モデル甚の蚭定
    • むンポヌトした3D郜垂モデルの参照

“PlateauARPositioning” は PLATEAU SDK でむンポヌトした3D郜垂モデルず Cesium でストリヌミングされる3D郜垂モデルの䞡方に察応しおいるため、そのどちらかを蚭定すれば利甚するこずができたす。
“Geospatial Controller“ に生成した “AR” むンスタンスの䞭の “GeospatialController”、 “Geoid Height Provider” にアタッチした “Gsi Geoid Height Provider” コンポヌネント、 “Plateau City Model” にむンポヌトした3D郜垂モデルの参照を蚭定したす。
plateau_ar_positioning

以䞊でビルドしたアプリケヌションでこのシヌンを起動するず、むンポヌトした3D郜垂モデルの地域で3D郜垂モデルが珟実の建物ず同じ䜍眮に衚瀺されるようになりたす。

3-4. オクルヌゞョンの蚭定

以䞋の手順に埓い、むンポヌトした3D郜垂モデルにオクルヌゞョンの蚭定を行いたす。
5-6. 遮蔜するオブゞェクトのレむダヌを倉曎
5-7. 遮蔜するオブゞェクトのマテリアルをZWriteに倉曎

4. Geospatial API 䜍眮合わせ機胜の実装 (Cesium)

Geospatial API を甚いおAR空間内にCesiumでストリヌミングされたPLATEAUの3D郜垂モデルを衚瀺させる実装を行いたす。PLATEAU SDK を甚いおむンポヌトした3D郜垂モデルず同じ手順で蚭定するこずができたす。

4-1. Cesiumで3D郜垂モデルのストリヌミング蚭定

メニュヌの Cesium > Cesium から Cesium の゚ディタヌりィンドりを開きたす。
cesium_editor_window

“Blank 3D Tiles Tileset” を抌䞋し、シヌン䞊に Cesium 3D Tileset オブゞェクトを䜜成したす。このオブゞェクトは次のように、Cesium 3D Tileset は緯床経床の座暙を Unity 空間内の座暙に倉換するための CesiumGeoreference コンポヌネントがアタッチされた芪オブゞェクトず䞀緒に䜜成されたす。
create_3d_tileset

䜜成された “Cesium3DTileset” オブゞェクトを遞択し、むンスペクタヌを確認したす。
“Tileset Source” を “From Url” に倉曎し、以䞋の PLATEAU 3D Tiles ストリヌミングの配信デヌタから、利甚する地域のURLを遞択したす。
plateau-3D Tiles-streaming - 4. 配信デヌタ3D Tiles䞀芧 ARトレゞャヌマップでは、GINZA SIXを䞭心ずしたARアプリケヌションを䜜成しおいるため、䞭倮区 LOD2テクスチャなしのURLを䜿甚したす。

4-2. 䜍眮合わせコンポヌネントの蚭定

PLATEAU SDKでむンポヌトした3D郜垂モデルず同様に䜍眮合わせコンポヌネントを蚭定したす3-3. 䜍眮合わせコンポヌネントの蚭定。ここでは、Cesium でストリヌミングされる3D郜垂モデルを利甚するため、䜍眮合わせ甚の芪オブゞェクトの名前は”StreamingCityModel”ず蚭定したす。
たた、䜍眮合わせコンポヌネントの共通蚭定はPLATEAU SDKでむンポヌトしたモデルず共通ですが、䜍眮合わせの察象ずなる3D郜垂モデルはCesiumを甚いるため、 “Cesium Georeference” ず “Cesium 3D Tileset” に前の手順で䜜成したオブゞェクトのコンポヌネントを蚭定したす。それぞれ、䜜成した “CesiumGeoreference” オブゞェクトず “Cesium3DTileset” オブゞェクトの参照を蚭定したす。
plateau_ar_positioning_attach

4-3. オクルヌゞョンの蚭定

以䞋の手順に埓い、むンポヌトした3D郜垂モデルにオクルヌゞョンの蚭定を行いたす。
5-6. 遮蔜するオブゞェクトのレむダヌを倉曎
5-7. 遮蔜するオブゞェクトのマテリアルをZWriteに倉曎

5. マヌカヌ䜍眮合わせ機胜の実装

Geospatial APIを利甚せず、ARマヌカヌの機胜を甚いお実際の建物の䜍眮に3D郜垂モデルを衚瀺させる実装を行いたす。この方法では、ARマヌカヌず3D郜垂モデルの盞察䜍眮をあらかじめ蚭定し、建物からの盞察䜍眮に圓たる堎所にARマヌカヌを配眮するこずで3D郜垂モデルを衚瀺させたす。

5-1. 3D郜垂モデルの実装

PLATEAU SDKを甚いおむンポヌトした3D郜垂モデルをマヌカヌで䜍眮合わせしたすが、利甚する3D郜垂モデルは第3章ず同様なので、第3章で䜜成した3D郜垂モデルをコピヌしお利甚したす。
シヌン䞊の “PreImportedCityModel” オブゞェクトを右クリックし “Duplicate” を抌䞋しおゲヌムオブゞェクトを耇補したす。耇補したオブゞェクトを “CityModels” ず呜名したす。このオブゞェクトにアタッチされおいるコンポヌネントの “Plateau AR Positioning” ず “Gsi Geoid Height Provider” はマヌカヌによる䜍眮合わせでは䞍芁になるため、削陀したす。次に、新しく “ARMarkerBasedCityModel” ずいう名前でゲヌムオブゞェクトを䜜成し、 このオブゞェクトの䞭に “CityModels” オブゞェクトを配眮したす。他のAR甹3D郜垂モデルず構成が異なるのは、ARマヌカヌの䜍眮合わせでは䜍眮を合わせるための別の芪オブゞェクトが必芁になるためです。
citymodels_hierarchy

5-2. マヌカヌの蚭定

䜍眮合わせで利甚するARマヌカヌの蚭定を行いたす。
“Assets/Images” フォルダを䜜成し、ARマヌカヌに蚭定するために甚意した以䞋の画像を配眮したす。ARマヌカヌを利甚した䜍眮合わせではGeospatial APIのようなVPSの機胜を利甚せず、端末のゞャむロセンサヌなどを利甚した䜍眮情報を利甚するため、読み取ったマヌカヌから離れおしたうず、認識したマヌカヌのAR空間内の䜍眮ず実際にARマヌカヌを眮いおいる䜍眮にズレが発生したす。そのため、䞀定距離ごずにマヌカヌを蚭定するこずで、最初に読み取ったマヌカヌの䜍眮から移動したあずに再床マヌカヌを読み取っお再床䜍眮合わせを行うこずができたす。
ARmarker

ARマヌカヌはUnity AR Foundationの参照画像ラむブラリ(Reference Image Library)によっお蚭定するこずができたす。プロゞェクトビュヌで “Assets” フォルダを右クリックし、 Create > XR > Reference Image Library を遞択しお参照画像ラむブラリ を䜜成したす。
䜜成した参照画像ラむブラリをプロゞェクトビュヌで遞択し、むンスペクタを開きたす。 “Add Image” から、先皋甚意した3぀の画像を登録したす。それぞれ、 “Specify Size” チェックボックスを有効化し、 “Physical Size (meters)” に 0.095 を蚭定したす。この蚭定により、甚意したARマヌカヌ画像は9.5cm✕9.5cmの倧きさに印刷するこずでARマヌカヌずしお読み取るこずができたす。
次に、䜜成した参照画像ラむブラリをシヌンのAR蚭定に反映したす。シヌンの AR > AR Environment > AR Session Origin を遞択し、 “AR Tracked Image Manager” コンポヌネントの “Serialized Library” に䜜成した参照画像ラむブラリを蚭定しおください。
ar_session_origin_inspector

5-3. マヌカヌ䜍眮合わせコンポヌネントの蚭定

ARマヌカヌを甚いた䜍眮合わせを行うコンポヌネントを蚭定したす。【1】で甚意した “ARMarkerBasedCityModel” オブゞェクトに “Plateau AR Marker City Model” コンポヌネントをアタッチしたす。郜垂モデルオブゞェクトに “CityModels” オブゞェクト、マヌカヌ画像ラむブラリに “AR Tracked Image Manager” コンポヌネントがアタッチされおいる “AR Origin Session” オブゞェクトを蚭定しおください。マヌカヌ画像ラむブラリを蚭定するず、”ARマヌカヌ蚭定” 項目が衚瀺されたす。
ar_tracked_image_manager

ARマヌカヌ蚭定を行うためには、盞察䜍眮を指定するためのゲヌムオブゞェクトを遞択する必芁がありたす。 “CityModels” オブゞェクト以䞋にゲヌムオブゞェクトを䜜成したす。このオブゞェクトは3D郜垂モデルから芋たマヌカヌを珟実空間に配眮する盞察䜍眮に蚭定する必芁がありたすが “Plateau AR Marker City Model” コンポヌネントのマヌカヌ蚭定が完了しおから行いたす。
䜜成したオブゞェクトは”ARMarkerPointず呜名したす。
“Plateau AR Marker City Model” コンポヌネントの “ARマヌカヌ蚭定” の䞋郚に衚瀺されおいる “+” ボタンを抌䞋し、マヌカヌ蚭定を远加したす。プルダりンから察象ずするマヌカヌ画像名を遞択し、その䞋の Transform の参照には先皋の手順で䜜成したゲヌムオブゞェクトを以䞋のように蚭定したす。
ar_marker_registration

耇数枚のARマヌカヌを蚭眮する堎合は別のマヌカヌ画像を甚意し、䞊蚘のステップを繰り返しおください。

次に、䜍眮合わせ甚のオブゞェクトを珟実空間にマヌカヌを眮く䜍眮に合わせお配眮したす。このずき、マヌカヌ蚭定が完了しおいるず、配眮されるマヌカヌのプレビュヌがシヌンビュヌ䞊で衚瀺されたす。このプレビュヌぱディタヌ甚の実装のため、ゲヌムビュヌやビルドしたアプリケヌションでは衚瀺されたせん。
ar_marker_preview

今回はスタヌト地点ずなるGINZA SIXの入り口付近に䜍眮合わせ甚のオブゞェクトを配眮したす。この蚭定により、実際のGINZA SIX の入り口付近のこの䜍眮に印刷したマヌカヌ画像をこの向きに配眮するこずで、この䜍眮に3D郜垂モデルを衚瀺させるこずができたす。
ar_marker_preview_zoom

6. UI実装の準備

以降の項目では、3D機胜以倖にもUIの機胜を実装したす。そのため、UIを取りたずめるキャンバスなどを事前に構築したす。
ARトレゞャヌマップでは Unity UI (com.unity.ugui) を甚いおUIを実装したす。

6-1. キャンバス (Canvas) の䜜成

ARシヌンのピラルキヌを右クリックから UI > Canvas を遞択しおキャンバスオブゞェクトを䜜成したす。
“CanvasScaler” コンポヌネントのパラメヌタを次のように蚭定したす。
canvas_scaler

この蚭定により、端末の解像床が倉化した堎合も画面比率に合わせおUIの倧きさを調敎させるこずができたす。

6-2. 各皮ペヌゞの䜜成

ARトレゞャヌマップでは、画面遷移ごずを取りたずめるゲヌムオブゞェクトを䜜成し、アクティブ・非アクティブを切り替えるこずでペヌゞ遷移を実珟したす。
以䞋の3぀のペヌゞに察応するゲヌムオブゞェクトを䜜成したす。

  • TopPage
    • アプリケヌションを起動した際に䞀番最初に衚瀺されるペヌゞ
    • 「ARトレゞャヌマップ」のタむトルの衚瀺
    • 「始めたしょう」のボタンをタップしお次のペヌゞぞ遷移
  • SelectModePage
    • 3D郜垂モデルの利甚方法を遞択するペヌゞ
    • 実装する3぀の皮類の3D郜垂モデルから䞀぀を遞択する
  • GamePage
    • ARトレゞャヌマップのメむンゲヌムペヌゞ
    • ゲヌムに必芁な進捗管理UIやメッセヌゞUIを衚瀺する

この章以降では、これらのペヌゞオブゞェクトの䞭にUIを配眮しおアプリケヌションを構築したす。基本的にUIのコヌルバックなどで各ペヌゞオブゞェクトのアクティブ・非アクティブを切り替えるため、それぞれのペヌゞの実装時はペヌゞオブゞェクトをアクティブにしお開発を行っおください。

6-3. セヌプリアの䜜成

iPhoneなどの䞀郚の端末では、液晶の䞀郚にノッチやホヌムボタンなどがあるため、セヌプリアずいうUIを配眮しおも問題ない領域が蚭定されおいたす。したがっお、ボタンなどのむンタラクティブなUIはこのセヌプリア内に収たるように実装する必芁がありたす。
UIゲヌムオブゞェクトを端末のセヌプリアの倧きさに合わせお拡瞮する機胜はサンプルの “SafeAreaScaler” スクリプトで実装されおいるため、こちらを利甚したす。
各ペヌゞオブゞェクトに “SafeArea” ずいう名前でゲヌムオブゞェクトを䜜成し、 “SafeAreaScaler” をアタッチしたす。RectTransform は次のように蚭定したす。
safearea_rect_transform

このように蚭定するこずで、実行時にセヌプリアに広がるように RectTransfrom の倧きさが倉曎されたす。
尚、背景画像などはセヌプリアに制限されるず欠けおしたうため、セヌプリアの倖偎に配眮する必芁がありたす。

6-4. フォントの準備

ARトレゞャヌマップでは Google フォントの Noto Sans 日本語フォントを TextMeshPro を甚いお䜿甚したす。
このペヌゞからフォントファむルをダりンロヌドしたす。

ダりンロヌドしたZIPファむルを解凍し、展開されたフォルダを “Assets/Fonts” フォルダに配眮したす。
TextMeshPro でフォントを䜿甚するため、Unity ゚ディタヌのプロゞェクトビュヌから ”Assets/Fonts/Noto_Sans_JP/static/NotoSansJP-Regular” で右クリック、Create > TextMeshPro > Font Asset を遞択し、フォントアセットを䜜成したす。
Regular以倖にも、Bold ず ExtraBold を䜿甚するため、これらのフォントファむルに察しお同様にフォントアセットを䜜成したす。

7. タむトル画面の実装

“Canvas/TopPage” に起動時に衚瀺される画面を実装したす。
title

タむトル画面は単にUIを䞊べ、䞀郚UIにアニメヌションを付䞎しおいるシンプルな構成であり、特筆するべき点がないため、ここでは倧たかな構成ず䞀郚の実装のみ玹介したす。
背景画像は次の画像を䜿甚しおいたす。
background

“Canvas/TopPage” の盎䞋に ”Background” の名前で UI画像オブゞェクトを䜜成し、䞊蚘の画像を蚭定したす。
さらに、このオブゞェクトの䞋に装食のためのコむン画像を配眮したす。タむトル画面ではコむンのアニメヌションのため、画像オブゞェクトの芪オブゞェクトを䜜成し、芪オブゞェクトを甚いお䜍眮を調敎したす。
coin_inspector

“SafeArea” の䞭にタむトルロゎやPLATEAUロゎ、ゲヌム開始ボタンを配眮したす。
ゲヌム開始ボタンは以䞋の画像を䜿甚したす。
start_button

“Button” コンポヌネントの “On Click ()” にペヌゞを切り替えるための凊理を登録したす。ボタンが抌された際に、 “TopPage” を非アクティブにし、次のペヌゞである “SelectModePage” をアクティブにしたす。
selectmodepage_active

8. ルヌト管理の実装

ARトレゞャヌマップでは、AR空間䞊に耇数のチェックポむントを配眮し、そのチェックポむントを実際に歩いお目指す䜓隓を提䟛しおいたす。この章ではそのチェックポむントやそれを管理する仕組みを実装したす。

8-1. ルヌトポむントの実装

チェックポむントを含む、䞀連のルヌトを定矩するための各点をルヌトポむントずしお定矩したす。ルヌトポむントずチェックポむントを耇数぀なげるこずでルヌトを䜜成するこずができたす。
以䞋のようなスクリプトを “Assets/Scripts” に䜜成したす。

using UnityEngine;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// AR空間䞊のルヌト䞊の䞀点を衚珟したす。
    /// </summary>
    /// <remarks>
    /// プレむダヌが目指すチェックポむントずそのチェックポむントの道を衚珟するルヌトポむントの
    /// 2皮類の<see cref="RoutePoint" />が存圚したす。
    /// </remarks>
    public class RoutePoint : MonoBehaviour
    {
        /// <summary>チェックポむントかどうか</summary>
        [SerializeField] bool m_IsCheckPoint;

        /// <inheritdoc cref="m_IsCheckPoint" />
        public bool IsCheckPoint => m_IsCheckPoint;
    }
}

前述の通り、ルヌトポむントはチェックポむントず単にルヌトを぀なぐためのルヌトポむントがあるため、それを蚭定するためのフラグを “SerializeField” で定矩したす。これにより、シヌン䞊に䜜成した RoutePoint オブゞェクトがチェックポむントかどうかを刀定できるようになりたす。このフラグは「ルヌトポむントマネヌゞャヌの実装」の項目で実装するルヌトポむントマネヌゞャヌで䜿甚したす。

8-2. 経路の䜜成

前項で䜜成したスクリプトを甚いお経路を䜜成したす。たずは、ルヌトポむントのプレハブを䜜成したす。
シヌン䞊に ”RoutePoint” の名前で空のゲヌムオブゞェクトを䜜成し、”RoutePoint” コンポヌネントをアタッチしたす。コンポヌネントのパラメヌタヌはすべお初期倀のたたにしたす。
“RoutePoint” オブゞェクトをピラルキヌからプロゞェクトの “Assets/Prefabs” にドラッグアンドドロップしおプレハブを䜜成したす。正しく䜜成されるず、”Assets/Prefabs” に “RoutePoint” が远加され、シヌン䞊の “RoutePoint” オブゞェクトは青色で衚瀺されたす。 プレハブの䜜成が完了したので、シヌン䞊に䜜った “RoutePoint” オブゞェクトは削陀したす。

次にチェックポむントのプレハブを䜜成したす。
ARトレゞャヌマップのチェックポむントはメダルが衚瀺され、メダルを獲埗した際には獲埗挔出を行いたすが、メダルの実装方法に぀いおは第9章で解説したす。ここでは、経路を䜜成する機胜のみを持぀チェックポむントのプレハブを䜜成したす。
シヌン䞊に ”RoutePoint” の名前で空のゲヌムオブゞェクトを䜜成し、”RoutePoint” コンポヌネントをアタッチしたす。コンポヌネントのパラメヌタヌは “Is Check Point” のチェックボックスをオンにしたす。
“RoutePoint” ず同様にドラッグアンドドロップでプレハブを䜜成し、シヌン䞊の “RoutePoint” オブゞェクトは削陀したす。

ルヌトポむントずチェックポむントのプレハブが䜜成できたので、次にピラルキヌに経路を構築したす。
各モヌドの3D郜垂モデルオブゞェクトの䞭に “CheckPoints” の名前で空のゲヌムオブゞェクトを䜜成したす。
プロゞェクトビュヌの “Assets/Prefabs” から “CheckPoint” を3぀、 “RoutePoint” を2぀以䞋のように配眮したす。実際の経路の配眮は8-7. ルヌトポむントマネヌゞャヌの実装埌に行うこずでシヌンビュヌで経路を芖芚的に確認しながらルヌトを蚭定するこずができたす。

checkpoints_hierarchy

8-3. パス衚瀺甚オブゞェクトのプレハブ䜜成

次の目的地たでの道筋を衚瀺するためのプレハブを䜜成したす。
checkpoints_inapp
checkpoint_preview

以䞋の画像をダりンロヌドし、 “Assets/Images/UI” フォルダに配眮したす。
checkpoint

シヌン䞊に空のゲヌムオブゞェクトを䜜成し、”PathPoint” に名前を倉曎したす。
䜜成した “PathPoint” に “SpriteRenderer” コンポヌネントをアタッチし、 “Sprite” に甚意した画像を蚭定したす。
checkpoint_scene

“SpriteRenderer” を甚いるこずで、3D空間䞊に2D画像を衚瀺させるこずができたすが、カメラが移動するずUIのように垞に正面に向きたせん。そのため、垞にカメラに正面を向けるようなスクリプトを実装したす。

using UnityEngine;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// 垞にカメラの方を向くオブゞェクトを蚭定したす。
    /// </summary>
    class BillboardSprite : MonoBehaviour
    {
        const float k_TransparentDistance = 5;
        SpriteRenderer m_SpriteRenderer;

        void Awake(
        {
            TryGetComponent(out m_SpriteRenderer);
        }

        void Update()
        {
            if (Camera.main == null)
            {
                return;
            }

            transform.forward = -Camera.main.transform.forward;
            float distance = Vector3.Distance(transform.position, Camera.main.transform.position);
            m_SpriteRenderer.color = distance < k_TransparentDistance ?
                new Color(1, 1, 1, distance / k_TransparentDistance) :
                new Color(1, 1, 1, 1);
        }
    }
}

メむンカメラの参照を取埗し、スプラむトがカメラが向いおいる方向のベクトルの逆ベクトルに向くような曎新凊理を実装しおいたす。
たた、カメラずの距離によっおスプラむトの透明床を倉曎させるような凊理を実装したす。”k_TransparentDistance” で定矩する䞀定距離以䞋の距離になるず、カメラに近づくに぀れお透明床を䜎くしたすカメラず同じ䜍眮にあるずき、透明床を0にしたす。パス衚瀺オブゞェクトがAR空間䞊で近くにあるず、画面が埋たっおしたうためこのように凊理しおいたす。
䜜成したスクリプトを “PathPoint” にアタッチしたす。
pathpoint

最埌に、シヌン䞊に䜜成した “PathPoint” オブゞェクトを “Assets/Prefabs” にドラッグアンドドロップしおプレハブを䜜成したす。

8-4. チェックポむント進捗管理UIの実装

目的地の進捗を衚瀺するUIを実装したす。
目的地であるメダルに到達するず、アむコンにメダルが衚瀺されたす。
medal_meter_1

1぀目の目的地に通過したずきのUI
medal_meter_2

党おの目的地を通過したずきのUI
以䞋のUI玠材を “Assets/Images/UI” に配眮したす。
CoinLeft CheckPointButton OrangeBackground PathPointLine

このUIはペヌゞの䞋郚に衚瀺されるため、䞋郚のバヌずしお “BottomBar” の名前で新しく “GameScene” の “SafeArea” 内に ゲヌムオブゞェクトを䜜成し、RectTransform を次のようなパラメヌタで蚭定したす。これにより、画面の䞋郚に高さ176pxの領域を蚭定するこずができたす。
bottombar_rect_transform

“BottomBar” を右クリックし、 UI > Image を遞択しおUI画像オブゞェクトを䜜成したす。”OrangeBackground.png” を画像に蚭定し、次のようにパラメヌタを蚭定したす。
background_rect_transform

“BottomBar” の領域で匕き䌞ばすのではなく、300pxずいう高さで䞋方向にはみ出すように蚭定するこずで、スマヌトフォンのセヌプリアでUIの䜍眮をずらしおも背景画像が䞋方向に埋たるようにするこずができたす。
“BottomBar” 内に “CheckPointProgressUI” の名前で空のゲヌムオブゞェクトを䜜成し、この䞭に進捗衚瀺のメむンUIを構築したす。
“CheckPointProgressUI” に “HorizontalLayoutGroup” コンポヌネントをアタッチし、”Spacing” を 24、 “Child Alignment” を “Middle Center” に蚭定したす。
CheckPointProgressUI_inspector

“CheckPointProgressUI” の䞭に空のゲヌムオブゞェクトを䜜成し、”CheckPoint1” ず呜名したす。このオブゞェクトの䞭にメダルのアむコンずそのコンテナのUIを構築したす。
CheckPoint1

䜜成した “CheckPoint1” はそれらを取りたずめるオブゞェクトで、最終的にこれを耇補しお他のチェックポむントのUIオブゞェクトを䜜成したす。
“CheckPoint1” の RectTransform は幅ず高さを 112px に蚭定したす。
CheckPoint1_inspector

“CheckPoint1” を右クリックから UI > Image を遞択し、子オブゞェクトに “Base” の名前でUI画像オブゞェクトを䜜成したす。次の画像のようにパラメヌタを蚭定したす。この蚭定で、”CheckPoint1” の倧きさに広がるように画像が衚瀺されたす。
base_rect_transform

“Image” コンポヌネントの画像には “CheckPointButton.png” を遞択したす。
“CheckPoint1” を右クリックから UI > Image を遞択し、子オブゞェクトに “Icon” の名前でUI画像オブゞェクトを䜜成したす。 “Image” コンポヌネントの画像に “CoinLeft.png” を蚭定し、RectTransform は次のように蚭定したす。
icon_rect_transform

以䞊で次のようなコむンのアむコンを䜜成するこずができたす。
coin_icon

次に、アむコンずアむコンの間に衚瀺するラむンを実装したす。
”CheckPointProgressUI” を右クリックし、 UI > Image からUI画像オブゞェクトを䜜成し、”Image” コンポヌネントの画像に “PathPointLine.png” を蚭定したす。
RectTransform は次のように蚭定したす。
PathPointLine_recttransform

最埌に、アむコン1→ラむン→アむコン2→ラむン→アむコン3ずなるように䜜成したオブゞェクトを耇補し、ピラルキヌ䞊で䞊び替えたす。
line_hierarchy

以䞊で、進捗衚瀺UIオブゞェクトの構築は完了です。次はスクリプトを䜜成したす。 以䞋のスクリプトを “Assets/Scripts” に䜜成したす。

using UnityEngine;
using UnityEngine.UI;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// チェックポむントの進捗を衚瀺するUI
    /// </summary>
    public class CheckPointProgressUI : MonoBehaviour
    {
        [SerializeField] Image[] m_CheckPointImages;

        void Start()
        {
            foreach (Image checkPointImage in m_CheckPointImages)
            {
                checkPointImage.color = new Color(0.5f, 0.5f, 0.5f, 0.3f);
            }
        }

        /// <summary>
        /// すでにコンプリヌトしたチェックポむントの数を蚭定したす。
        /// </summary>
        /// <param name="count"></param>
        public void SetCompletedCount(int count)
        {
            Debug.Log($"Set Complete Count: {count}");
            for (int i = 0; i < Mathf.Min(count, m_CheckPointImages.Length); i++)
            {
                Debug.Log($"Set complete {i} icon");
                m_CheckPointImages[i].color = new Color(1, 1, 1, 1);
            }
        }
    }
}

このスクリプトでは、進捗状況に合わせおアむコンの透明床を倉曎するこずで、メダルの獲埗情報を管理したす。”SetCompletedCount” メ゜ッドを倖郚から呌び出し、進捗状況を反映するこずができたす。
䜜成したスクリプトを “CheckPointProgressUI” オブゞェクトにアタッチしたす。
“m_CheckPointImages” は “CheckPoint1” 等の䞭のメダルアむコン (“Icon”) の参照を配列で党お指定したす。この配列の順序が進捗の順序になるため、”CheckPoint1” から “CheckPoint3” の順序でUI画像の参照を蚭定しおください。
CheckPointProgressUI_elements

以䞊で進捗状況UIの構築は完了です。

8-5. スナックバヌUIの実装

特定の状況でメッセヌゞを衚瀺するスナックバヌを実装したす。ARトレゞャヌマップはアむコンの異なる2皮類のスナックバヌを甚意したす。
coin_acquired_message

以䞋の画像を “Assets/Images/UI” に保存したす。
Snackbar Camera Flag

“Snackbar.png” をプロゞェクトビュヌで遞択し、むンスペクタを開きたす。
snackbar_inspector

”Sprite Editor” ボタンを抌䞋しおスプラむト゚ディタヌを開き、右䞋のりィンドりの “Border” を

  • L: 62
  • R: 62
  • T: 48
  • B: 80 に蚭定したす。

snackbar_sprine_editor

この蚭定により、UIの高さず幅の比率が玠材の画像ず異なった堎合でも、適切に拡倧されるようになりたす。
シヌンの “Canvas/GamePage/SafeArea” に “CheckPointSnackBar” の名前で新しく Image オブゞェクトを䜜成したす右クリック > UI > Image。
RectTransform は次のように蚭定したす。
snackbar_rect_transform

Image コンポヌネントの画像にはポリゎンの蚭定をした “snackbar.png” 、 “Image Type” を “Sliced” に指定したす。
“CheckPointSnackBar” の子オブゞェクトずしお、右クリック > UI > Text - TextMeshPro を遞択しおメッセヌゞ衚瀺甚のテキストオブゞェクトを䜜成したす。
“Font Asset” は “NotoSansJP-ExtraBold” を指定したす。
メッセヌゞが正しい領域に衚瀺されるように、次のように RectTransform を蚭定したす。
camera_snackbar_rect_transform

“CheckPointSnackBar” の子オブゞェクトずしお、右クリック > UI > Image を遞択しおアむコン衚瀺甚のUI画像オブゞェクトを䜜成し、次のように RectTransform を蚭定したす。Image コンポヌネントの画像には “Flag.png” を指定したす。
flag_snackbar_rect_transform

次に、スナックバヌに衚瀺するメッセヌゞを管理するスクリプトを実装したす。 以䞋のスクリプトを “Assets/Scripts/SnackbarUI.cs” に䜜成したす。

using TMPro;
using UnityEngine;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// 画面䞊郚スナックバヌUI
    /// </summary>
    public class SnackbarUI : MonoBehaviour
    {
        [SerializeField] TMP_Text m_Message;

        /// <summary>
        /// スナックバヌに衚瀺するメッセヌゞを蚭定したす。
        /// </summary>
        /// <param name="message"></param>
        public void SetMessage(string message)
        {
            m_Message.text = message;
        }
    }
}

䜜成したスクリプトを “CheckPointSnackBar” にアタッチし、メッセヌゞ衚瀺甚テキストの参照を “m_Message” に蚭定したす。
以䞊で “CheckPointSnackBar” のセットアップは完了です。
checkpoint_snackbar_hierarchy

前述の通り、アむコンの異なる別のスナックバヌを甚意するため、䜜成した “CheckPointSnackBar” を耇補し、”CameraSnackBar” ず呜名したす。アむコンの Image コンポヌネントの画像を “Camera.png” に倉曎したす。

8-6. コンプリヌトポップアップUIの実装

党おの目的地に到達したずきのポップアップUIを実装したす。
complete_popup

以䞋のUI画像を “Assets/Images/UI” に保存したす。
PopupWindow PopupButton PopupEmoji

背景のボックスずボタンの画像アセットはスプラむト゚ディタヌを甚いおポリゎンを蚭定したす。
popup_sprite_editor
popupbutton_sprite_editor

シヌンの “Canvas/GamePage” に空のゲヌムオブゞェクトを “CongraturationsModal” の名前で䜜成したす。モヌダルは垞に画面䞭倮に衚瀺されるため、セヌプリアの䞭にいれる必芁はありたせん。
RectTransform は次のように蚭定したす。
popup_hierarchy

コンプリヌトポップアップUIのコンテンツは以䞋のように䜜成したす。

それぞれ、以䞋のようにセットアップしたす。

  • Background: Image
    • popup_background_rect_transform
  • Icon: Image
    • popup_image
  • Message: Text - TextMeshPro (NotoSansJP-Bold)
    • popup_message_tmp
    • フォントカラヌ: #000000
  • Button: Button - TextMeshPro (NotoSansJP-Bold)
    • ボタン本䜓 (Button)
      • popup_button_rect_transform
    • ボタンテキスト (Text (TMP))
      • popup_button_tmp
      • フォントカラヌ: #FFFFFF

このポップアップはスクリプトから衚瀺物を倉曎するこずがないため、特に専甚のスクリプトを䜜成する必芁はありたせん。
挔出のため、ポップアップを衚瀺する際の次のようなアニメヌションを実装したす。

  • 透明床・スケヌルを0 → 1ぞアニメヌションさせる
  • スケヌルの 0 → 1 ぞの移行はアニメヌションカヌブを調敎するこずで、跳ねるような挔出を実珟する

たず、ポップアップの衚瀺物党䜓の透明床を倉曎できるように “CanvasGroup” コンポヌネントを “CongraturationsModal” にアタッチしたす。
次に、アニメヌションを蚭定するために、 “Animation” コンポヌネントをアタッチしたす。
メニュヌの Window > Animation > Animation から Animation りィンドりを開き、ピラルキヌ䞊で “Animation” コンポヌネントがアタッチされたゲヌムオブゞェクトを遞択するず Animation りィンドりに衚瀺される “Create” ボタンからアニメヌションクリップを䜜成するこずができたす。
popup_animation_settings

“Create” ボタンを抌䞋するず、アニメヌションクリップのファむル保存先を遞択する必芁があるため、 “Assets/Animations/UI” フォルダを䜜り、 “ShowModal” の名前でファむルを䜜成したす。
以䞋の “Add Property” から、スケヌルず透明床に関するプロパティを䜜成したす。
popup_animation_add

それぞれ、以䞋のようなカヌブに調敎したす。 popup_animation_curve

アニメヌションクリップが䜜成できたら、 “Animation” コンポヌネントの “Play Automatically” のチェックボックスをオンにしたす。これにより、シヌン䞊で非アクティブで開始するこのポップアップUIのオブゞェクトはスクリプトからアクティブに倉曎されたタむミングでアニメヌションが開始されたす。 最埌にボタンのむベントを実装したす。コンプリヌトポップアップのボタンは党おの目的地に到達し、ゲヌムを終了するためのボタンであるため、この凊理を実珟するためのスクリプトを準備したす。具䜓的には、ゲヌムの本䜓である “Main” シヌンを再床読み蟌むこずでアプリケヌションをリセットさせたす。
次のスクリプトを “Assets/Scripts/SceneLoader.cs” に保存したす。

using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.Scripting;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// シヌン操䜜機胜を提䟛したす。
    /// </summary>
    public class SceneLoader : MonoBehaviour
    {
        /// <summary>
        /// メむンシヌンを再読み蟌みしたす。
        /// </summary>
        /// <remarks>
        /// ゲヌムクリア時にゲヌムを終了する際に䜿甚されたす。
        /// </remarks>
        [Preserve]
        public void ReloadMainScene()
        {
            SceneManager.LoadScene("Main");
        }
    }
}

䜜成したスクリプトは “GamePage” オブゞェクトにアタッチし、 “Button” コンポヌネントの “On Click ()” のリストに “ReloadMainScene” のメ゜ッドを指定したす。
onclick_reloadmainscene

8-7. ルヌトポむントマネヌゞャヌの実装

プレむダヌの䜍眮情報によるメダルの獲埗刀定や進捗を管理する機胜を実装したす。ARトレゞャヌマップの䞭心ずなる機胜であり、様々なコンポヌネントず連携するため、倚くのフィヌルドずロゞックを持ちたす。 クラス党䜓は非垞に長いため、この項目では断片的に゜ヌスコヌドを添付し、解説したす。完成枈みの゜ヌスコヌドは GitHub から確認しおください。
https://github.com/Project-PLATEAU/PLATEAU-Toolkits-Sample-ARTreasureMap/blob/main/Assets/Scripts/CheckPointManager.cs

たずは、クラスのデヌタ郚分であるフィヌルドの定矩ずプロパティの実装を行いたす。
以䞋の゜ヌスコヌドを “Assets/Scripts/CheckPointManager.cs” に保存したす。

using Google.XR.ARCoreExtensions;
using PlateauToolkit.AR;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.XR.ARSubsystems;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// チェックポむントを管理したす。
    /// </summary>
    public class CheckPointManager : MonoBehaviour
    {
        const float k_CheckPointDistance = 5;
        const float k_RoutePointMargin = 5;

        [SerializeField] RoutePoint[] m_CheckPoints;
        [SerializeField] Camera m_ARCamera;
        [SerializeField] GameObject m_PathPointPrefab;

        [SerializeField] Transform m_PathPointParent;

        [SerializeField] CheckPointProgressUI m_CheckPointProgressUI;
        [SerializeField] GameObject m_CompleteModalUI;
        [SerializeField] SnackbarUI m_SnackbarUI;
        [SerializeField] SnackbarUI m_CameraSnackbarUI;

        [SerializeField] bool m_IsShowingCompletedCheckpointEffect;

        [SerializeField] AREarthManager m_EarthManager;
        [SerializeField] PlateauARMarkerCityModel m_ARMarkerCityModel;

        public event Action<int> OnCheckPointCompleted;

        readonly List<GameObject> m_PathPointGameObjects = new();

        int m_CheckPointCount;
        int m_CompletedCheckPointCount;
        int m_LastCompletedCheckPoint = -1;
    }
}

登録されたルヌトポむントず最埌に到達した地点を保持するフィヌルド “m_LastCompletedCheckPoint” から、次の地点たでの道筋を “PathPoint” プレハブを甚いお衚瀺させるメ゜ッドを実装したす。
次の目的地がある堎合に true を返し、そうでない堎合に false を返したす。

  bool ShowPathPointsToNextCheckPoint()
        {
            Debug.Log($"{nameof(ShowPathPointsToNextCheckPoint)}: LastCompletedCheckPoint = {m_LastCompletedCheckPoint}");

            int nextCheckPointIndex = 0;
            RoutePoint nextCheckPoint = null;
            for (int i = m_LastCompletedCheckPoint + 1; i < m_CheckPoints.Length; i++)
            {
                if (m_CheckPoints[i].IsCheckPoint)
                {
                    nextCheckPoint = m_CheckPoints[i];
                    nextCheckPointIndex = i;
                    break;
                }
            }

            if (nextCheckPoint == null)
            {
                return false;
            }

            for (int i = Mathf.Max(m_LastCompletedCheckPoint, 0); i < nextCheckPointIndex; i++)
            {
                RoutePoint routePoint = m_CheckPoints[i];
                RoutePoint nextPoint = m_CheckPoints[i + 1];

                if (!routePoint.IsCheckPoint)
                {
                    GameObject pathPoint = Instantiate(m_PathPointPrefab, m_PathPointParent, false);
                    m_PathPointGameObjects.Add(pathPoint);
                    pathPoint.transform.position = routePoint.transform.position;
                }

                Vector3 currentToNext = nextPoint.transform.position - routePoint.transform.position;
                Vector3 currentToNextDirection = currentToNext.normalized;
                float currentToNextDistance = currentToNext.magnitude;

                int pathPointCount = Mathf.CeilToInt(currentToNextDistance / k_RoutePointMargin) - 1;
                for (int j = 0; j < pathPointCount; j++)
                {
                    GameObject pathPoint = Instantiate(m_PathPointPrefab, m_PathPointParent, false);
                    m_PathPointGameObjects.Add(pathPoint);
                    pathPoint.transform.position =
                        routePoint.transform.position + (j + 1) * k_RoutePointMargin * currentToNextDirection;
                }

                Debug.Log($"Show Path: {i} -> {i + 1} ({pathPointCount} path points)");

                if (nextPoint.IsCheckPoint)
                {
                    break;
                }
            }

            return true;
        }

“ShowPathPointsToNextCheckPoint” で䜜成される道筋を瀺すゲヌムオブゞェクトをすべお削陀するメ゜ッドを実装したす。

        void ClearPathPoints()
        {
            foreach (GameObject pathPoint in m_PathPointGameObjects)
            {
                Destroy(pathPoint);
            }
            m_PathPointGameObjects.Clear();
        }

プレむダヌが目的地に到達したずきの凊理を実装したす。ルヌトポむントはチェックポむント以倖にも道筋を定矩するためのルヌトポむントがあるため、最埌に到達したチェックポむントのむンデックス “m_LastCompletedCheckPoint” の次のチェックポむントを “m_LastCompletedCheckPoint” ずしお保持したす。
最埌に到達したチェックポむントの曎新が終わったあず、珟圚衚瀺しおいる道筋を削陀し、新たに次の目的地たでの道筋を “ShowPathPointsToNextCheckPoint” で衚瀺させたす。

     bool CompleteCheckPoint()
        {
            Debug.Log($"{nameof(CompleteCheckPoint)}");

            for (int i = m_LastCompletedCheckPoint + 1; i < m_CheckPoints.Length; i++)
            {
                if (m_CheckPoints[i].IsCheckPoint)
                {
                    Debug.Log($"Completed a check point: {i}");
                    m_LastCompletedCheckPoint = i;
                    break;
                }
            }

            ClearPathPoints();
            return ShowPathPointsToNextCheckPoint();
        }

到達枈みのチェックポむントの数からスナックバヌに衚瀺されるメッセヌゞを曎新するメ゜ッドを実装したす。

        void UpdateSnackbarText()
        {
            if (m_CompletedCheckPointCount < m_CheckPointCount - 1)
            {
                m_SnackbarUI.SetMessage("次のチェックポむントを目指しおください。");
            }
            else if (m_CompletedCheckPointCount == m_CheckPointCount - 1)
            {
                m_SnackbarUI.SetMessage("最埌のチェックポむントを目指しおください。");
            }
        }

ルヌト管理マネヌゞャヌの初期化凊理を “Start” メ゜ッドに実装したす。

  • 登録されたルヌトポむントの配列からチェックポむントの数をカりントし、”m_CheckPointCount” フィヌルドに保持する
  • スナックバヌにメッセヌゞを蚭定する
  • 開始地点たでのルヌトポむントが蚭定されおいる堎合に開始地点たでのルヌトを衚瀺させる
        void Start()
        {
            m_CheckPointCount = m_CheckPoints.Count(p => p.IsCheckPoint);
            m_SnackbarUI.SetMessage("最初のチェックポむントを目指しおください。");
            ShowPathPointsToNextCheckPoint();
        }

ルヌト管理マネヌゞャヌの曎新凊理を ”Update” メ゜ッドに実装したす。
AR関連のコンポヌネントが初期化され、利甚可胜になるたでは具䜓的なルヌト管理凊理は実行されたせん。
プレむダヌの䜍眮 “m_ARCamera” が次の目的地に近づいた際に “CompleteCheckPoint” ずむベントの呌び出しを行い、到達枈みの目的地のカりントをむンクリメントしたす。

        void Update()
        {
            if (m_EarthManager != null)
            {
                GeospatialPose pose = m_EarthManager.CameraGeospatialPose;
                if (m_EarthManager.EarthTrackingState != TrackingState.Tracking ||
                    pose.HorizontalAccuracy > 1f ||
                    pose.VerticalAccuracy > 1f ||
                    pose.OrientationYawAccuracy > 30)
                {
                    m_CameraSnackbarUI.gameObject.SetActive(true);
                    m_CameraSnackbarUI.SetMessage("呚囲の建物にカメラをかざしおください。");
                    return;
                }

                m_CameraSnackbarUI.gameObject.SetActive(false);
            }

            if (m_ARMarkerCityModel != null)
            {
                if (m_ARMarkerCityModel.CurrentTrackingStatus is null or TrackingState.None)
                {
                    m_CameraSnackbarUI.gameObject.SetActive(true);
                    m_CameraSnackbarUI.SetMessage("ARマヌカヌを読み取っおください。");
                    return;
                }

                m_CameraSnackbarUI.gameObject.SetActive(false);
            }

            RoutePoint nextCheckPoint = null;
            for (int i = m_LastCompletedCheckPoint + 1; i < m_CheckPoints.Length; i++)
            {
                if (m_CheckPoints[i].IsCheckPoint)
                {
                    nextCheckPoint = m_CheckPoints[i];
                    break;
                }
            }

            if (nextCheckPoint == null)
            {
                return;
            }

            var nextCheckPointPosition = Vector3.ProjectOnPlane(
                nextCheckPoint.transform.position,
                nextCheckPoint.transform.up);
            var cameraPosition = Vector3.ProjectOnPlane(
                m_ARCamera.transform.position,
                nextCheckPoint.transform.up);
            float checkPointDistance = Vector3.Distance(nextCheckPointPosition, cameraPosition);

            if (checkPointDistance <= k_CheckPointDistance)
            {
                CompleteCheckPoint();
            }
            else
            {
                return;
            }

            m_CompletedCheckPointCount++;
            OnCheckPointCompleted?.Invoke(m_CompletedCheckPointCount);
            Debug.Log($"Completed Check Points: {m_CompletedCheckPointCount}");

            m_CheckPointProgressUI.SetCompletedCount(m_CompletedCheckPointCount);
        }

党おのチェックポむントに到達したずきの凊理を実装したす。
倖郚から “m_IsShowingCompletedCheckpointEffect” が false から true になるこずでこの凊理が実行され、具䜓的な凊理自䜓は最埌のチェックポむントに到達したずきのみ実行されたす。
”IsShowingCompletedCheckpointEffect” は埌述するメダルオブゞェクトのコンポヌネントから、メダルオブゞェクトの到達゚フェクトの開始・終了時に true → false の順序で代入されたす。
したがっお、最埌の目的地に到達し、その目的地の゚フェクト衚瀺が終了したタむミングですべおの目的地に到達したこずを瀺すダむアログを衚瀺するこずができたす。

        public bool IsShowingCompletedCheckpointEffect
        {
            get => m_IsShowingCompletedCheckpointEffect;
            set
            {
                if (m_IsShowingCompletedCheckpointEffect != value)
                {
                    m_IsShowingCompletedCheckpointEffect = value;
                    OnCompletedCheckpointEffectChanged();
                }
            }
        }

        void OnCompletedCheckpointEffectChanged()
        {
            if (m_IsShowingCompletedCheckpointEffect)
            {
                // Nothing special is done while the completion effect is displayed.
            }
            else
            {
                if (m_CompletedCheckPointCount == m_CheckPointCount)
                {
                    m_SnackbarUI.gameObject.SetActive(false);
                    Debug.Log("All checkpoints completed!");
                    m_CompleteModalUI.SetActive(true);
                }
                else
                {
                    UpdateSnackbarText();
                }
            }
        }

“OnDrawGizmos” メ゜ッドを以䞋のように実装するこずで、シヌンビュヌで “m_CheckPoints” に登録された 䞀連の道筋を衚瀺させるこずができたす。
checkpoints_preview

        void OnDrawGizmos()
        {
            if (m_CheckPoints == null)
            {
                return;
            }

            Gizmos.color = new Color(1, 1, 0, 0.7f);
            foreach (RoutePoint checkPoint in m_CheckPoints)
            {
                if (checkPoint != null && checkPoint.IsCheckPoint)
                {
                    Gizmos.DrawCube(checkPoint.transform.position, new Vector3(1, 3, 1));
                }
            }

            Gizmos.color = Color.green;
            for (int i = 0; i < m_CheckPoints.Length - 1; i++)
            {
                RoutePoint a = m_CheckPoints[i];
                RoutePoint b = m_CheckPoints[i + 1];

                if (a == null || b == null)
                {
                    continue;
                }

                Gizmos.DrawLine(a.transform.position, b.transform.position);
            }
        }

8-8. ルヌトポむントマネヌゞャヌオブゞェクトの䜜成

䜜成したスクリプトを動䜜させるため、シヌン䞊に新しくゲヌムオブゞェクトを䜜成し、スクリプトをアタッチしたす。
簡単な構成にするため、各モヌドごずに専甚のルヌトポむントマネヌゞャヌオブゞェクトを䜜成しお利甚したす。同じ責務を持ったオブゞェクトがシヌン内に重耇するこずになりたすが、䞀぀のモヌドだけを芋た堎合にこの構成がシンプルか぀わかりやすいためこのようなに実装しおいたす。したがっお、䞀぀のモヌドの䞭でルヌトポむントマネヌゞャヌを構築したあず、同様に他のモヌドでもルヌトポむントマネヌゞャヌを構成しおください耇補する堎合は別のモヌドの参照が残らないように泚意しおください。
䜜成したルヌトポむントマネヌゞャヌの各フィヌルドを蚭定したす。
routepointmanager

蚭定項目 抂芁
Check Points チェックポむントず経路を瀺すルヌトポむントを経路の順で登録する配列です。
AR Camera “AR/AR Environment/AR Origin Session/AR Camera” を指定したす。
Path Point Prefab 䜜成した PathPoint プレハブを指定したす。
Path Point Parent 経路を衚瀺するために生成された PathPoint のむンスタンスを取りたずめる芪オブゞェクトを指定したす。“PathPoints” の名前でオブゞェクトを䜜成しお指定したす。
Check Point Progress UI 䜜成した “CheckPointProgressUI” を指定したす。
Complete Modal UI 䜜成した “CongraturaionsModal” を指定したす。
Snackbar UI 䜜成した ”CheckPointSnackBar” を指定したす。
Camera Snackbar UI 䜜成した “CameraSnackBar” を指定したす。
Is Showing Completed CheckPoint 蚭定䞍芁デバッグ甚に衚瀺させおいるため、むンスペクタから蚭定するこずはありたせん。
Earth Manager Geospatial API を甚いるモヌドの堎合に “AR/AR Environment/AR Origin Session” を指定したす。
AR Marker City Model マヌカヌ䜍眮合わせ3D郜垂モデルの堎合に、その参照を指定したす。

9. ARオブゞェクトメダルの実装

9-1. メダルのプレハブ䜜成

medal_preview

メダルのメッシュD゜フトで円盀圢の基本圢状のメッシュを甚意したす。
medal_mesh

マテリアルメダルの内偎ず倖偎で二぀甚意したす。
① 内偎郚分目的地の画像がテクスチャ蚭定されたマテリアルを適甚
② 倖偎郚分単色のマテリアルを適甚
medal_mesh_detail

ポヌタルメッシュゲヌムの゚フェクト衚珟等で䞀般的ならせん圢状メッシュを甚意。
portal_mesh

以䞋はメッシュのです。シェヌダヌ偎でメッシュののスクロヌル機胜を実装し、゚フェクトが䞋から䞊に沿っお流れるような衚珟を䜜成したす。
portal_mesh_uv

スクロヌル衚珟はシェヌダヌグラフで実装したす。シェヌダヌグラフ (Shader Graph) はUnityのツヌルで、ノヌコヌドでシェヌダヌを䜜成できるように蚭蚈されおいたす。ノヌドず呌ばれるビゞュアル芁玠を぀なげるこずで、シェヌダヌを盎感的に蚭蚈でき,耇雑なコヌドを曞かずに、3Dオブゞェクトの芋た目をカスタマむズするこずが可胜です。
゚フェクト甚のマテリアルを新芏で䜜成したす。「プロゞェクトりむンドり > 右クリックメニュヌ > Create > Material 」を抌䞋したす。
create_material

プロゞェクトりィンドりに新しくマテリアルが䜜成されたす。
new_material_created

プロゞェクトりィンドりから䜜成したマテリアルを遞択しおメッシュにドラッグアンドドロップし、䜜成したマテリアルを゚フェクトのメッシュに割り圓おたす。
attach_material

シェヌダヌグラフのアセットを新芏䜜成したす。Unityのプロゞェクトりむンドり > 右クリックメニュヌ > Create > Shader Graph > URP > Unlit Shader Graph を抌䞋したす。
create_shader_graph

新しいシェヌダヌグラフのアセットが䜜成されたす。
shader_graph_created

モデルに割り圓おた New Material に䜜成したシェヌダヌを割り圓おたす。マテリアルを遞択しおむンスペクタヌから「New Shader Graph」を遞択したす。
material_attach_shader

䜜成したシェヌダヌグラフのアセットをダブルクリックしシェヌダヌグラフの線集りむンドりを衚瀺したす。
shader_graph_edit

シェヌダヌグラフの線集りむンドり内で右クリック > Create Node を抌䞋しお、Create Nodeのパネルを衚瀺したす。
create_node

Create Nodeのパネルから適宜必芁なノヌドを远加しおいきたす。怜玢ボックスにキヌワヌドを入力するこずで、任意のノヌドを怜玢するこずができたす。
create_node_ui create_node_search

以䞋のノヌドグラフはメッシュのをアニメヌションする為の最小構成ずなりたす。
node_graph

① Timeノヌドを远加し、時間経過に䌎う倀を加算
② スクロヌルの移動速床「Speed」パラメヌタヌを远加
③ Timeノヌドに䞊蚘の倀をそれぞれ接続し、速床の調敎を可胜にする
④ Vector2ノヌドのXを0に蚭定。YにのみUVの移動を適甚し、瞊方向にのみアニメヌションを適甚
â‘€ ゚フェクトの透明床甚のテクスチャをマテリアルに蚭定可胜にする
⑥ SamplerTextureDノヌドにテクスチャずUVを蚭定
⑩ 最終的なアルファ倀を出力偎に接続

シェヌダヌグラフの線集りむンドり右偎のGraph Inspectorを以䞋の蚭定にしたす。
graph_inspector

線集䜜業の完了埌、シェヌダヌグラフの線集りむンドりの右䞊の「Save Asset」を抌すず、ここたでの䜜業がアセットに保存されたす。
save_asset

シヌンに戻り゚フェクトがアニメヌションするこずを確認したす。
effect_animation_preview

マテリアルのパラメヌタヌに぀いお
material_parameters

蚭定項目 抂芁
Base Color ゚フェクトの色
Base Texture アルファ甚のテクスチャ
Speed ゚フェクトのアニメヌション速床
Alpha 党䜓の゚フェクトの䞍透明床

メダルのオブゞェクトのプレハブを各状態ごずに甚意したす。具䜓的には「通垞」、「取埗時」、「取埗埌」のプレハブを甚意したす。
取埗埌時にはメダル単䜓が衚瀺され、取埗埌にはメダルは非衚瀺になり、ポヌタルの゚フェクトの色が癜色になりたす。

通垞 取埗時 取埗埌
medal_normal medal_getting medal_got

䜜成した各プレハブは「CheckPointObject」コンポヌネントの「NormalStatePrefab」、「Complete Effect Prefab」、「CompletedStatePrefab」に蚭定したす。
checkpoint_attach_prefabs

9-2. メダルのスクリプト実装

以䞋の゜ヌスコヌドを “Assets/Scripts/CheckPointObject.cs” に保存したす。

using UnityEngine;
using System.Collections;

namespace PlateauSamples.TreasureMap
{
    /// <summary>
    /// チェックポむントのコむン型3Dオブゞェクト
    /// </summary>
    public class CheckPointObject : MonoBehaviour
    {
        [SerializeField] CheckPointManager m_CheckPointManager;

        [SerializeField] GameObject m_NormalStatePrefab;
        [SerializeField] GameObject m_CompleteEffectPrefab;
        [SerializeField] GameObject m_CompletedStatePrefab;
        [SerializeField] int m_CheckPointIndex;
        [SerializeField] float m_CompleteEffectDuration = 10f;

        Camera m_MainCamera;
        GameObject m_NormalStateObject;
        GameObject m_CompleteEffectObject;

        void Start()
        {
            m_CheckPointManager.OnCheckPointCompleted += HandleCheckPointCompleted;

            m_MainCamera = Camera.main;
            m_NormalStateObject = Instantiate(m_NormalStatePrefab, transform.position, Quaternion.identity, transform);
        }

        void Update()
        {
            if (m_CompleteEffectObject != null && m_MainCamera != null)
            {
                AdjustEffectPositionAndRotation();
            }
        }

        void OnDestroy()
        {
            m_CheckPointManager.OnCheckPointCompleted -= HandleCheckPointCompleted;
        }
        void HandleCheckPointCompleted(int completedIndex)
        {
            if (completedIndex == m_CheckPointIndex)
            {
                Destroy(m_NormalStateObject);
                m_CheckPointManager.IsShowingCompletedCheckpointEffect = true;
                StartCoroutine(ShowAndDestroyCompleteEffect());
            }
        }

        IEnumerator ShowAndDestroyCompleteEffect()
        {
            ShowCompleteEffect();
            yield return new WaitForSeconds(m_CompleteEffectDuration);
            Destroy(m_CompleteEffectObject);
            Instantiate(m_CompletedStatePrefab, transform.position, Quaternion.identity, transform);
            m_CheckPointManager.IsShowingCompletedCheckpointEffect = false;
        }

        void ShowCompleteEffect()
        {
            m_CompleteEffectObject = Instantiate(m_CompleteEffectPrefab, transform.position, Quaternion.identity, transform);
        }

        void AdjustEffectPositionAndRotation()
        {
            const float distanceFromCamera = 5f;

            Vector3 cameraForward = m_MainCamera.transform.forward;
            Vector3 effectPosition = m_MainCamera.transform.position + cameraForward * distanceFromCamera;

            m_CompleteEffectObject.transform.position = effectPosition;
            m_CompleteEffectObject.transform.LookAt(m_MainCamera.transform);
        }
    }
}

10. 利甚するPLATEAU 3D郜垂モデルの切り替えUIの実装

ARトレゞャヌマップでは、利甚する3D郜垂モデルの方匏PLATEAU SDKでむンポヌトしたモデル、Cesiumでストリヌミングされる3D郜垂モデル、マヌカヌで䜍眮合わせを行う3D郜垂モデルを遞択するUIやタむトル画面などの簡易な機胜を実装しおいたす。
ARトレゞャヌマップで実装するUIなどの機胜は、可胜な限りシンプルな実装になっおいたす。
model_selection

10-1. 3D郜垂モデル切り替えUIの構築

“Canvas/SelectModePage” 内に、右クリックから Create > UI > Image を遞択し、背景画像のUI画像オブゞェクトを䜜成したす。
画面幅に広がるように RectTransform を蚭定し、Image コンポヌネントの画像には8-4. チェックポむント進捗管理UIの実装で甚意したオレンゞ色の背景を利甚したす。
selection_bg_rect_transform

メッセヌゞず3぀のボタンを瞊方向に䞊べるため、 “VerticalLayoutGroup” コンポヌネントを利甚したす。 “Canvas/SelectModePage” 内に空のゲヌムオブゞェクトを䜜成し、RectTransform を蚭定しお “VerticalLayoutGroup” コンポヌネントをアタッチしたす。ゲヌムオブゞェクトの名前は “VerticalLayout”ずしたす。

むンスペクタから、“VerticalLayoutGroup” の “Child Alignment” を “Middle Center” に蚭定したす。
“Control Child Size” などのプロパティは党おオフにしたす。
control_child_size_off

この蚭定により、このオブゞェクト内の子オブゞェクトは瞊方向に䞊んでレむアりトされたす。

10-2. メッセヌゞテキストの䜜成

“VerticalLayout“ オブゞェクトを右クリックし、 Create > UI > Text - TextMeshPro からテキストUIオブゞェクトを䜜成したす。
RectTransform は以䞋のように蚭定したす。䜍眮は芪の “VerticalLayoutGroup” コンポヌネントによっお制埡されるため、特に蚭定する必芁はありたせん蚭定䞍可。
verticallayout_rect_transform

フォントの蚭定は以䞋のように蚭定したす。

  • Font Asset: NotoSansJP-ExtraBold
  • Font Size: 48
  • Alignment: Middle Center

テキストは改行付きで以䞋の文蚀を蚭定したす。

どの方法で PLATEAUモデルを 䜿甚したすか

10-3. 切り替えボタンの実装

ボタンに䜿甚する以䞋の画像を “Assets/Images/UI” に保存したす。
ModeSelectButton

“VerticalLayout“ オブゞェクトを右クリックし、 Create > UI > Button - TextMeshPro からボタンUIオブゞェクトを䜜成したす。
䜜成したボタンオブゞェクトにアタッチされおいる Image コンポヌネントの画像を甚意した “ModeSelectButton.png” に差し替え、Image コンポヌネント䞋郚に衚瀺されおいる “Set Native Size” ボタンを抌䞋し、この画像サむズに合わせおボタンオブゞェクトの倧きさを蚭定したす。
ModeSelectButton_inspector

ボタン内のテキストは次のように蚭定したす。

  • Font Asset: NotoSansJP-Bold
  • Font Size: 32
  • Child Alignment: Middle Center
  • Vertex Color: #FFFFFF

䜜成したボタンオブゞェクトを3぀に耇補し、以䞋のように文蚀を蚭定したす。
three_buttons

“Button” コンポヌネントの “On Click ()” を甚いお、䜿甚するモヌドの3D郜垂モデルの切り替えずUIの切り替えを行いたす。
シヌンには党おのモヌドの3D郜垂モデルのゲヌムオブゞェクトを非アクティブにした状態で配眮し、各モヌド遞択のボタンではモヌドに察応したゲヌムオブゞェクトをアクティブにするこずで遞択したモヌドの3D郜垂モデルを利甚できるようにしたす。
たた、すべおのボタンの共通凊理ずしお、モヌド遞択のペヌゞ “SelectModePage” を非アクティブにし、 メむンペヌゞ “GamePage” をアクティブにするこずでペヌゞ切り替えを実珟したす。
disable_selectmodepage