- 1. ARãã¬ãžã£ãŒãããããã¥ãŒããªã¢ã«ã®æŠèŠ
- 2. ç°å¢äœæ
- 2-1. ãããžã§ã¯ãäœæ
- 2-2. PLATEAU SDKã®è¿œå
- 2-3. 3Déœåžã¢ãã«ã®èªã¿èŸŒã¿
- 2-4. PLATEAU SDK-Toolkits ã®è¿œå
- 2-5. PLATEAU SDK-AR-Extensions ã®è¿œå
- 2-6. PLATEAU SDK-Maps-Toolkit ã®è¿œå
- 2-7. Google ARCore APIã®èšå®
- 2-8. ã·ãŒã³ã®äœæ
- 2-9. ARç°å¢ããã³Geospatialã³ã³ãããŒã©ãŒã®èšå®
- 2-10. ãªã¯ã«ãŒãžã§ã³ã®èšå®
- 3. Geospatial API äœçœ®åããæ©èœã®å®è£ (PLATEAU SDK)
- 4. Geospatial API äœçœ®åããæ©èœã®å®è£ (Cesium)
- 5. ããŒã«ãŒäœçœ®åããæ©èœã®å®è£
- 6. UIå®è£ ã®æºå
- 7. ã¿ã€ãã«ç»é¢ã®å®è£
- 8. ã«ãŒã管çã®å®è£
- 8-1. ã«ãŒããã€ã³ãã®å®è£
- 8-2. çµè·¯ã®äœæ
- 8-3. ãã¹è¡šç€ºçšãªããžã§ã¯ãã®ãã¬ããäœæ
- 8-4. ãã§ãã¯ãã€ã³ãé²æ管çUIã®å®è£
- 8-5. ã¹ããã¯ããŒUIã®å®è£
- 8-6. ã³ã³ããªãŒããããã¢ããUIã®å®è£
- 8-7. ã«ãŒããã€ã³ããããŒãžã£ãŒã®å®è£
- 8-8. ã«ãŒããã€ã³ããããŒãžã£ãŒãªããžã§ã¯ãã®äœæ
- 9. ARãªããžã§ã¯ãïŒã¡ãã«ïŒã®å®è£
- 10. å©çšããPLATEAU 3Déœåžã¢ãã«ã®åãæ¿ãUIã®å®è£
è¿å¹Žã芳å
çšã¢ããªã±ãŒã·ã§ã³ãªã©ãARæè¡ãçšããŠçŸå®ã®éœåžç©ºéã®äžã§äœéšå¯èœãªåšéåã®ARã¢ããªã±ãŒã·ã§ã³ãå€ãèŠãããŸããéœåžã«ãããARã¢ããªã±ãŒã·ã§ã³ã§ã¯ãèªå·±äœçœ®èªèã«ããã³ã³ãã³ãã®äœçœ®ãããã衚瀺ã³ã³ãã³ãã®ãªã¯ã«ãŒãžã§ã³ïŒé®èœïŒè¡šçŸãéèŠã§ãã
ãã®ãã¥ãŒããªã¢ã«ã§ã¯ãPLATEAU SDK for Unityã PLATEAU SDK-Toolkits for Unity ããã³ PLATEAU SDK-AR-Extensions for Unity ãçšããŠãè¡ã«é
眮ããã芳å
ã³ã³ãã³ããé²èŠ§ããã¢ããªã±ãŒã·ã§ã³ãéçºããŸãã
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
Unityã®éçºç°å¢ã®æºå
PLATEAU SDK for Unity ã®ããŠã³ããŒãïŒ2-2. PLATEAU SDKã®è¿œå ïŒ
PLATEAU SDK Toolkit for Unity ã®ããŠã³ããŒãïŒ2-4. PLATEAU SDK-Toolkits ã®è¿œå ïŒ
UIç»åã®ããŠã³ããŒãïŒ Assets/Images/UI å
ã®ç»åãããŠã³ããŒãããŠãã ããã
Unity Hub ãããããžã§ã¯ããäœæããŸããUnity ããŒãžã§ã³ 2021.3.35F1(LTS) ã§ã3D(URP) ãéžæããŠãããžã§ã¯ããäœæããŸãã
äœæããããããžã§ã¯ãã«ãPLATEAU SDK for Unity ãå°å
¥ããŸãã
https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/Installation.html
PLATEAU SDK ã䜿ã£ãŠ3Déœåžã¢ãã«ãã€ã³ããŒãããŸãã
https://project-plateau.github.io/PLATEAU-SDK-for-Unity/manual/ImportCityModels.html
ãã¡ããåèã«PLATEAU SDK-Toolkits for Unityããããžã§ã¯ãã«ã€ã³ããŒãããŸãã
ãã¡ããåèã«PLATEAU SDK-AR-Extensions for Unityã Google ARCore ExtensionsãCesium for Unity ããããžã§ã¯ãã«ã€ã³ããŒãããŸãã
ãã¡ããåèã«PLATEAU SDK-Maps-Toolkitããããžã§ã¯ãã«ã€ã³ããŒãããŸãã
Geospatial API ãå©çšããããã«ã¯ã Google Cloud ãããžã§ã¯ããçšæããARCore API ã®èªèšŒãèšå®ããå¿
èŠããããŸããARCore API ãæå¹åããAPIèªèšŒãèšå®ããããšã§ç«¯æ«ãã Geospatial API ãå©çšããããšãã§ããããã«ãªããŸããèšå®æ¹æ³ã«ã€ããŠã¯å¥ã®ããã¥ã¡ã³ãã«ãŠè§£èª¬ãããŠããããããã¡ããåèã«èšå®ããŠãã ããã
PLATEAU Tutorials TOPIC14ïœVRã»ARã§ã®æŽ»çš[3/3]ïœGoogle Geospatial APIã§äœçœ®æ
å ±ã«ãã3Déœåžã¢ãã«ã®ARãäœæãã
ARãã¬ãžã£ãŒããããå®è£
ããã·ãŒã³ãäœæããŸããFile > New Scene ãéžæããæ°ããã·ãŒã³ãäœæããŸããARã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã«ã¡ã©ã¯ARå°çšã®ã«ã¡ã©ãåŸè¿°ã®æé ã§çšæããŠå©çšãããããããã©ã«ãã§ã·ãŒã³ã«å«ãŸããŠãã âMain Cameraâ ãåé€ããŠãã ããã
äžèšãå®äºããããFile > Save ãéžæãïŒããã㯠Ctrl + S / â + SïŒãâAssets/Scenesâ ã« âMainâ ã®ååã§ã·ãŒã³ãä¿åããŸãã
以äžã§ã¯äžéšè§£èª¬çšã« âTutorialâ ãšåœåããã·ãŒã³ã§ARãã¬ãžã£ãŒãããã®æ§ç¯æé ã«ã€ããŠè§£èª¬ããŠããå ŽåããããŸãã
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â ãã€ã³ããŒãããŸãã
ãµã³ãã«ã«å«ãŸãã âAssets/Samples/PLATEAU SDK AR Extensions for Unity/0.3.0/AR Samples/Prefabs/AR.prefabâ ãã·ãŒã³äžã«ãã©ãã°ã¢ã³ãããããããŠã€ã³ã¹ã¿ã³ã¹åããŸãããã¬ãããã·ãŒã³äžã«é
眮ãããšãéãã¢ã€ã³ã³ãšæåã§è¡šç€ºããããã¬ããæ¬äœã«å€æŽãå ãããããšã·ãŒã³äžã®ãã¬ããã®ã€ã³ã¹ã¿ã³ã¹ã«ãå€æŽãåæ ãããŸãã
ããã§ã¯ããã¬ããããäžèŠãªãªããžã§ã¯ããªã©ãåé€ããŠå¥ã®ãªããžã§ã¯ããšããŠå©çšãããããçæããã€ã³ã¹ã¿ã³ã¹ãå³ã¯ãªãã¯ãã Prefab > Unpack Completely ãéžæããŠãã¬ããã®åç
§ãåé€ããŸãã
âARâ ãã¬ããã«ã¯ããããã°çšã®èšå®ãŠã£ã³ããŠã Geospatial API ã®ãã©ããã³ã°æ
å ±ã衚瀺ããããã®UIãªã©ãå«ãŸããŠããŸãããããã¯ä»¥äžã®ç»åã«è¡šç€ºãããŠããã¡ãã¥ãŒããéãããšãã§ããŸããéçºäžã¯ARãGeospatial APIãæ£ããåäœããŠãããã確èªããã®ã«æå¹ãªã®ã§ãåé€ããªããŠãåé¡ãããŸããããã¢ããªã±ãŒã·ã§ã³ã®å©çšè
ã«ãšã£ãŠã¯äžèŠãªããŒã¿ã§ãããããå®ææžã¿ã®ARãã¬ãžã£ãŒãããã§ã¯ãããã®UIãªã©ã¯åé€ããŠããŸãã
ARãã¬ãžã£ãŒãããã§å¿
é ãšãªãã³ã³ããŒãã³ãã¯ä»¥äžã®ãããªæ§æã§ãã
PLATEAU SDK ã§ã€ã³ããŒããã3Déœåžã¢ãã«ã«ã¯LODèšå®ã«ãã£ãŠç°ãªããŸããã建ç©ã®ãã¯ã¹ãã£ãèšå®ãããŠãããããããããªã¯ã«ãŒãžã§ã³çšã«å©çšããããã®ãããªã¢ã«ã®èšå®ãå¿
èŠã«ãªããŸãã
以äžã® AR Extensions ã®READMEããã¥ã¡ã³ããåèã«ããªã¯ã«ãŒãžã§ã³ã®ããã® Renderer Feature ãã¬ã€ã€ãŒã®èšå®ãè¡ã£ãŠãã ããã
ARãªã¯ã«ãŒãžã§ã³æ©èœã®å©çšæ¹æ³
äœæããã·ãŒã³ã«PLATEAU SDKãçšããŠARãã¬ãžã£ãŒãããã§äœ¿çšãã3Déœåžã¢ãã«ãã€ã³ããŒãããŸãã
以äžã®PLATEAU SDKå
¬åŒããã¥ã¡ã³ããåèã«3Déœåžã¢ãã«ãã€ã³ããŒãããŠãã ãããARãã¬ãžã£ãŒãããã§ã¯çŸå®ã®å»ºç©ã®ãªã¯ã«ãŒãžã§ã³ã®ããã«3Déœåžã¢ãã«ãå©çšãããããã建ç¯ç©ã以å€ã®èŠçŽ ã¯ã€ã³ããŒãããå¿
èŠã¯ãããŸããã
PLATEAU SDK - éœåžã¢ãã«ã®ã€ã³ããŒã
ã€ã³ããŒããå®äºãããšãã·ãŒã³äžã«3Déœåžã¢ãã«ã®ã²ãŒã ãªããžã§ã¯ããçæãããŸãã
â»ARãã¬ãžã£ãŒãããã§ã¯ãããžã§ã¯ããGitHubã«ã¢ããããŒãããéœåäžãã·ãŒã³ãã¡ã€ã«ã50MiB以äžã«ãªããšã¢ããããŒãæã«èŠåã¡ãã»ãŒãžã衚瀺ããã100MiB以äžã¯ã¢ããããŒããã§ããªããªããããããã解決ããããã«å»ºç©ã®æ¬äœã®ããŒã¿ãFBXãã¡ã€ã«ãšããŠåºåããŠåæ§ç¯ããããšã§ãããåé¿ããŠããŸãã
PLATEAU > PLATEAU SDK ãã PLATEAU SDK ãšãã£ã¿ãŒãŠã£ã³ããŠãéãããšã¯ã¹ããŒãã¿ããéžæããŸããâéžæãªããžã§ã¯ãâ ã®âãšã¯ã¹ããŒã察象â ã«ã€ã³ããŒããã3Déœåžã¢ãã«ãªããžã§ã¯ãã®åç
§ãèšå®ããŸããåºå圢åŒã¯FBXãéžæãããã¯ã¹ãã£ã®ãã§ãã¯ã¯ãªãã«ããŸãïŒARãã¬ãžã£ãŒãããã§ã¯ãªã¯ã«ãŒãžã§ã³çšã«3Déœåžã¢ãã«ã䜿çšãããã¯ã¹ãã£ãäžèŠã®ããïŒã
åºåèšå®ãå®äºããããâåºåãã©ã«ãâ ã® âãã©ã«ããã¹â ã âåç
§...â ãã¯ãªãã¯ããŠâ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) ãèšå®ããŸãã
ã¹ã±ãŒã«ã«é¢ããŠãFBXã®ããã©ã«ãã®åäœèšå®ãã»ã³ãã¡ãŒãã«ã§ãããUnityã®ã€ã³ããŒãèšå®ã§ã¯ããã解決ããããã®ãã§ãã¯ããã¯ã¹ããããŸããUnityãããšã¯ã¹ããŒããã3Déœåžã¢ãã«ã®FBXãã¡ã€ã«ã¯åäœãå€æããå¿
èŠãªãæ£ãã倧ããã§è¡šç€ºããããšãã§ããããããã®ãã§ãã¯ããã¯ã¹ããªãã«ããããšã§æ£ãã倧ããã§è¡šç€ºãããããšãã§ããŸããäžæ¹ã§ãX軞ãå転ããçŸè±¡ã¯èšå®ããã¯è§£æ¶ãããªãããã¹ã±ãŒã«ã®xã-1ã«èšå®ããŠãã ããã
å°ããã®å転ãèµ·ããçŸè±¡ã¯SDKããŒãžã§ã³2.3.2以éã§è§£æ¶ãããŠããããšã¯ã¹ããŒãæã«åº§æšè»žãWUNã«èšå®ããããšã§æ£ããåãã§3Déœåžã¢ãã«ãé
眮ããããšãã§ããŸãã
ãããžã§ã¯ããã¥ãŒãã âAssets/Prefabsâ ãã©ã«ããäœæããã·ãŒã³äžã«ãã âBuildingsâ ãªããžã§ã¯ãããã©ãã°ã¢ã³ãããããããŠãã¬ãããäœæããŠãã ããã
ãšã¯ã¹ããŒãã®å
ã«ãªã£ãã·ãŒã³äžã®å»ºç©ãªããžã§ã¯ããåé€ããäœæãããã¬ããã«å·®ãæ¿ããŸãã3Déœåžã¢ãã«ã®èŠªãªããžã§ã¯ã㯠âPLATEAU Instanced City Modelâ ã³ã³ããŒãã³ããã¢ã¿ãããããŠããããã®ã³ã³ããŒãã³ããã緯床çµåºŠãªã©ãååŸããŠäœçœ®åãããããããããã®ãªããžã§ã¯ãã®åãªããžã§ã¯ãã®ã¿ãåé€ããŸãã
æåŸã«3Déœåžã¢ãã«ã®èŠªãªããžã§ã¯ãã®äžã«ãäœæãã âBuildingsâ ãã¬ãããé
眮ããŸãã
以äžã§3Déœåžã¢ãã«ã®è»œéåãšãã¬ããåã¯å®äºã§ãã
ARãã¬ãžã£ãŒãããã§ã¯ãªã¯ã«ãŒãžã§ã³ã®ããã®3Déœåžã¢ãã«ã ãã§ãªããåŸè¿°ããæé ã§çšæããã¡ãã«ã®ARãªããžã§ã¯ããäœçœ®åãããããå¿
èŠãããããããããããŸãšããŠäœçœ®åããããããã®èŠªãªããžã§ã¯ããäœæããŸãã
ããšã©ã«ããŒäžã§å³ã¯ãªãã¯ãã㊠Create Empty ãéžæããŠç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããŸããããã§ã¯ PLATEAU SDK ã§ã€ã³ããŒãããã¢ãã«ãå©çšããããã âPreImportedCityModelâ ãšããååã«èšå®ããŸãã
âPreImportedCityModelâ ã®äžã«ã€ã³ããŒããã3Déœåžã¢ãã«ãªããžã§ã¯ããé
眮ããŸãããã®ãšãã âPreImportedCityModelâ ããèŠã3Déœåžã¢ãã«ãªããžã§ã¯ãã®ããŒã«ã«åº§æšããããã±ãŒã¹ãããããã3Déœåžã¢ãã«ãªããžã§ã¯ãã®ããŒã«ã«åº§æšã (0, 0, 0) ã«èšå®ãããŠããããšã確èªããŠãã ããã
â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éœåžã¢ãã«ã®åç
§ãèšå®ããŸãã
以äžã§ãã«ãããã¢ããªã±ãŒã·ã§ã³ã§ãã®ã·ãŒã³ãèµ·åãããšãã€ã³ããŒããã3Déœåžã¢ãã«ã®å°åã§3Déœåžã¢ãã«ãçŸå®ã®å»ºç©ãšåãäœçœ®ã«è¡šç€ºãããããã«ãªããŸãã
以äžã®æé ã«åŸããã€ã³ããŒããã3Déœåžã¢ãã«ã«ãªã¯ã«ãŒãžã§ã³ã®èšå®ãè¡ããŸãã
5-6. é®èœãããªããžã§ã¯ãã®ã¬ã€ã€ãŒãå€æŽ
5-7. é®èœãããªããžã§ã¯ãã®ãããªã¢ã«ãZWriteã«å€æŽ
Geospatial API ãçšããŠAR空éå ã«Cesiumã§ã¹ããªãŒãã³ã°ãããPLATEAUã®3Déœåžã¢ãã«ã衚瀺ãããå®è£ ãè¡ããŸããPLATEAU SDK ãçšããŠã€ã³ããŒããã3Déœåžã¢ãã«ãšåãæé ã§èšå®ããããšãã§ããŸãã
ã¡ãã¥ãŒã® Cesium > Cesium ãã Cesium ã®ãšãã£ã¿ãŒãŠã£ã³ããŠãéããŸãã
âBlank 3D Tiles Tilesetâ ãæŒäžããã·ãŒã³äžã« Cesium 3D Tileset ãªããžã§ã¯ããäœæããŸãããã®ãªããžã§ã¯ãã¯æ¬¡ã®ããã«ãCesium 3D Tileset ã¯ç·¯åºŠçµåºŠã®åº§æšã Unity 空éå
ã®åº§æšã«å€æããããã® CesiumGeoreference ã³ã³ããŒãã³ããã¢ã¿ããããã芪ãªããžã§ã¯ããšäžç·ã«äœæãããŸãã
äœæããã âCesium3DTilesetâ ãªããžã§ã¯ããéžæããã€ã³ã¹ãã¯ã¿ãŒã確èªããŸãã
âTileset Sourceâ ã âFrom Urlâ ã«å€æŽãã以äžã® PLATEAU 3D Tiles ã¹ããªãŒãã³ã°ã®é
ä¿¡ããŒã¿ãããå©çšããå°åã®URLãéžæããŸãã
plateau-3D Tiles-streaming - 4. é
ä¿¡ããŒã¿ïŒ3D TilesïŒäžèŠ§
ARãã¬ãžã£ãŒãããã§ã¯ãGINZA SIXãäžå¿ãšããARã¢ããªã±ãŒã·ã§ã³ãäœæããŠãããããäžå€®åº LOD2ïŒãã¯ã¹ãã£ãªãïŒã®URLã䜿çšããŸãã
PLATEAU SDKã§ã€ã³ããŒããã3Déœåžã¢ãã«ãšåæ§ã«äœçœ®åããã³ã³ããŒãã³ããèšå®ããŸãïŒ3-3. äœçœ®åããã³ã³ããŒãã³ãã®èšå®ïŒãããã§ã¯ãCesium ã§ã¹ããªãŒãã³ã°ããã3Déœåžã¢ãã«ãå©çšãããããäœçœ®åããçšã®èŠªãªããžã§ã¯ãã®ååã¯âStreamingCityModelâãšèšå®ããŸãã
ãŸããäœçœ®åããã³ã³ããŒãã³ãã®å
±éèšå®ã¯PLATEAU SDKã§ã€ã³ããŒãããã¢ãã«ãšå
±éã§ãããäœçœ®åããã®å¯Ÿè±¡ãšãªã3Déœåžã¢ãã«ã¯Cesiumãçšããããã âCesium Georeferenceâ ãš âCesium 3D Tilesetâ ã«åã®æé ã§äœæãããªããžã§ã¯ãã®ã³ã³ããŒãã³ããèšå®ããŸãããããããäœæãã âCesiumGeoreferenceâ ãªããžã§ã¯ããš âCesium3DTilesetâ ãªããžã§ã¯ãã®åç
§ãèšå®ããŸãã
以äžã®æé ã«åŸããã€ã³ããŒããã3Déœåžã¢ãã«ã«ãªã¯ã«ãŒãžã§ã³ã®èšå®ãè¡ããŸãã
5-6. é®èœãããªããžã§ã¯ãã®ã¬ã€ã€ãŒãå€æŽ
5-7. é®èœãããªããžã§ã¯ãã®ãããªã¢ã«ãZWriteã«å€æŽ
Geospatial APIãå©çšãããARããŒã«ãŒã®æ©èœãçšããŠå®éã®å»ºç©ã®äœçœ®ã«3Déœåžã¢ãã«ã衚瀺ãããå®è£
ãè¡ããŸãããã®æ¹æ³ã§ã¯ãARããŒã«ãŒãš3Déœåžã¢ãã«ã®çžå¯Ÿäœçœ®ããããããèšå®ãã建ç©ããã®çžå¯Ÿäœçœ®ã«åœããå Žæã«ARããŒã«ãŒãé
眮ããããšã§3Déœåžã¢ãã«ã衚瀺ãããŸãã
PLATEAU SDKãçšããŠã€ã³ããŒããã3Déœåžã¢ãã«ãããŒã«ãŒã§äœçœ®åããããŸãããå©çšãã3Déœåžã¢ãã«ã¯ç¬¬3ç« ãšåæ§ãªã®ã§ã第3ç« ã§äœæãã3Déœåžã¢ãã«ãã³ããŒããŠå©çšããŸãã
ã·ãŒã³äžã® âPreImportedCityModelâ ãªããžã§ã¯ããå³ã¯ãªãã¯ã âDuplicateâ ãæŒäžããŠã²ãŒã ãªããžã§ã¯ããè€è£œããŸããè€è£œãããªããžã§ã¯ãã âCityModelsâ ãšåœåããŸãããã®ãªããžã§ã¯ãã«ã¢ã¿ãããããŠããã³ã³ããŒãã³ãã® âPlateau AR Positioningâ ãš âGsi Geoid Height Providerâ ã¯ããŒã«ãŒã«ããäœçœ®åããã§ã¯äžèŠã«ãªããããåé€ããŸãã次ã«ãæ°ãã âARMarkerBasedCityModelâ ãšããååã§ã²ãŒã ãªããžã§ã¯ããäœæãã ãã®ãªããžã§ã¯ãã®äžã« âCityModelsâ ãªããžã§ã¯ããé
眮ããŸããä»ã®ARçš3Déœåžã¢ãã«ãšæ§æãç°ãªãã®ã¯ãARããŒã«ãŒã®äœçœ®åããã§ã¯äœçœ®ãåãããããã®å¥ã®èŠªãªããžã§ã¯ããå¿
èŠã«ãªãããã§ãã
äœçœ®åããã§å©çšããARããŒã«ãŒã®èšå®ãè¡ããŸãã
âAssets/Imagesâ ãã©ã«ããäœæããARããŒã«ãŒã«èšå®ããããã«çšæãã以äžã®ç»åãé
眮ããŸããARããŒã«ãŒãå©çšããäœçœ®åããã§ã¯Geospatial APIã®ãããªVPSã®æ©èœãå©çšããã端æ«ã®ãžã£ã€ãã»ã³ãµãŒãªã©ãå©çšããäœçœ®æ
å ±ãå©çšãããããèªã¿åã£ãããŒã«ãŒããé¢ããŠããŸããšãèªèããããŒã«ãŒã®AR空éå
ã®äœçœ®ãšå®éã«ARããŒã«ãŒã眮ããŠããäœçœ®ã«ãºã¬ãçºçããŸãããã®ãããäžå®è·é¢ããšã«ããŒã«ãŒãèšå®ããããšã§ãæåã«èªã¿åã£ãããŒã«ãŒã®äœçœ®ãã移åããããšã«å床ããŒã«ãŒãèªã¿åã£ãŠå床äœçœ®åãããè¡ãããšãã§ããŸãã
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ããŒã«ãŒãçšããäœçœ®åãããè¡ãã³ã³ããŒãã³ããèšå®ããŸããã1ãã§çšæãã âARMarkerBasedCityModelâ ãªããžã§ã¯ãã« âPlateau AR Marker City Modelâ ã³ã³ããŒãã³ããã¢ã¿ããããŸããéœåžã¢ãã«ãªããžã§ã¯ãã« âCityModelsâ ãªããžã§ã¯ããããŒã«ãŒç»åã©ã€ãã©ãªã« âAR Tracked Image Managerâ ã³ã³ããŒãã³ããã¢ã¿ãããããŠãã âAR Origin Sessionâ ãªããžã§ã¯ããèšå®ããŠãã ãããããŒã«ãŒç»åã©ã€ãã©ãªãèšå®ãããšãâARããŒã«ãŒèšå®â é
ç®ã衚瀺ãããŸãã
ARããŒã«ãŒèšå®ãè¡ãããã«ã¯ãçžå¯Ÿäœçœ®ãæå®ããããã®ã²ãŒã ãªããžã§ã¯ããéžæããå¿
èŠããããŸãã âCityModelsâ ãªããžã§ã¯ã以äžã«ã²ãŒã ãªããžã§ã¯ããäœæããŸãããã®ãªããžã§ã¯ãã¯3Déœåžã¢ãã«ããèŠãããŒã«ãŒãçŸå®ç©ºéã«é
眮ããçžå¯Ÿäœçœ®ã«èšå®ããå¿
èŠããããŸãã âPlateau AR Marker City Modelâ ã³ã³ããŒãã³ãã®ããŒã«ãŒèšå®ãå®äºããŠããè¡ããŸãã
äœæãããªããžã§ã¯ãã¯âARMarkerPointãšåœåããŸãã
âPlateau AR Marker City Modelâ ã³ã³ããŒãã³ãã® âARããŒã«ãŒèšå®â ã®äžéšã«è¡šç€ºãããŠãã â+â ãã¿ã³ãæŒäžããããŒã«ãŒèšå®ãè¿œå ããŸãããã«ããŠã³ãã察象ãšããããŒã«ãŒç»ååãéžæãããã®äžã® Transform ã®åç
§ã«ã¯å
çšã®æé ã§äœæããã²ãŒã ãªããžã§ã¯ãã以äžã®ããã«èšå®ããŸãã
è€æ°æã®ARããŒã«ãŒãèšçœ®ããå Žåã¯å¥ã®ããŒã«ãŒç»åãçšæããäžèšã®ã¹ããããç¹°ãè¿ããŠãã ããã
次ã«ãäœçœ®åããçšã®ãªããžã§ã¯ããçŸå®ç©ºéã«ããŒã«ãŒã眮ãäœçœ®ã«åãããŠé
眮ããŸãããã®ãšããããŒã«ãŒèšå®ãå®äºããŠãããšãé
眮ãããããŒã«ãŒã®ãã¬ãã¥ãŒãã·ãŒã³ãã¥ãŒäžã§è¡šç€ºãããŸãããã®ãã¬ãã¥ãŒã¯ãšãã£ã¿ãŒçšã®å®è£
ã®ãããã²ãŒã ãã¥ãŒããã«ãããã¢ããªã±ãŒã·ã§ã³ã§ã¯è¡šç€ºãããŸããã
ä»åã¯ã¹ã¿ãŒãå°ç¹ãšãªãGINZA SIXã®å
¥ãå£ä»è¿ã«äœçœ®åããçšã®ãªããžã§ã¯ããé
眮ããŸãããã®èšå®ã«ãããå®éã®GINZA SIX ã®å
¥ãå£ä»è¿ã®ãã®äœçœ®ã«å°å·ããããŒã«ãŒç»åããã®åãã«é
眮ããããšã§ããã®äœçœ®ã«3Déœåžã¢ãã«ã衚瀺ãããããšãã§ããŸãã
以éã®é
ç®ã§ã¯ã3Dæ©èœä»¥å€ã«ãUIã®æ©èœãå®è£
ããŸãããã®ãããUIãåããŸãšãããã£ã³ãã¹ãªã©ãäºåã«æ§ç¯ããŸãã
ARãã¬ãžã£ãŒãããã§ã¯ Unity UI (com.unity.ugui) ãçšããŠUIãå®è£
ããŸãã
ARã·ãŒã³ã®ããšã©ã«ããŒãå³ã¯ãªãã¯ãã UI > Canvas ãéžæããŠãã£ã³ãã¹ãªããžã§ã¯ããäœæããŸãã
âCanvasScalerâ ã³ã³ããŒãã³ãã®ãã©ã¡ãŒã¿ã次ã®ããã«èšå®ããŸãã
ãã®èšå®ã«ããã端æ«ã®è§£å床ãå€åããå Žåãç»é¢æ¯çã«åãããŠUIã®å€§ããã調æŽãããããšãã§ããŸãã
ARãã¬ãžã£ãŒãããã§ã¯ãç»é¢é·ç§»ããšãåããŸãšããã²ãŒã ãªããžã§ã¯ããäœæããã¢ã¯ãã£ãã»éã¢ã¯ãã£ããåãæ¿ããããšã§ããŒãžé·ç§»ãå®çŸããŸãã
以äžã®3ã€ã®ããŒãžã«å¯Ÿå¿ããã²ãŒã ãªããžã§ã¯ããäœæããŸãã
- TopPage
- ã¢ããªã±ãŒã·ã§ã³ãèµ·åããéã«äžçªæåã«è¡šç€ºãããããŒãž
- ãARãã¬ãžã£ãŒããããã®ã¿ã€ãã«ã®è¡šç€º
- ãå§ããŸããããã®ãã¿ã³ãã¿ããããŠæ¬¡ã®ããŒãžãžé·ç§»
- SelectModePage
- 3Déœåžã¢ãã«ã®å©çšæ¹æ³ãéžæããããŒãž
- å®è£ ãã3ã€ã®çš®é¡ã®3Déœåžã¢ãã«ããäžã€ãéžæãã
- GamePage
- ARãã¬ãžã£ãŒãããã®ã¡ã€ã³ã²ãŒã ããŒãž
- ã²ãŒã ã«å¿ èŠãªé²æ管çUIãã¡ãã»ãŒãžUIã衚瀺ãã
ãã®ç« 以éã§ã¯ããããã®ããŒãžãªããžã§ã¯ãã®äžã«UIãé 眮ããŠã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸããåºæ¬çã«UIã®ã³ãŒã«ããã¯ãªã©ã§åããŒãžãªããžã§ã¯ãã®ã¢ã¯ãã£ãã»éã¢ã¯ãã£ããåãæ¿ãããããããããã®ããŒãžã®å®è£ æã¯ããŒãžãªããžã§ã¯ããã¢ã¯ãã£ãã«ããŠéçºãè¡ã£ãŠãã ããã
iPhoneãªã©ã®äžéšã®ç«¯æ«ã§ã¯ã液æ¶ã®äžéšã«ããããããŒã ãã¿ã³ãªã©ããããããã»ãŒããšãªã¢ãšããUIãé
眮ããŠãåé¡ãªãé åãèšå®ãããŠããŸãããããã£ãŠããã¿ã³ãªã©ã®ã€ã³ã¿ã©ã¯ãã£ããªUIã¯ãã®ã»ãŒããšãªã¢å
ã«åãŸãããã«å®è£
ããå¿
èŠããããŸãã
UIã²ãŒã ãªããžã§ã¯ãã端æ«ã®ã»ãŒããšãªã¢ã®å€§ããã«åãããŠæ¡çž®ããæ©èœã¯ãµã³ãã«ã® âSafeAreaScalerâ ã¹ã¯ãªããã§å®è£
ãããŠããããããã¡ããå©çšããŸãã
åããŒãžãªããžã§ã¯ãã« âSafeAreaâ ãšããååã§ã²ãŒã ãªããžã§ã¯ããäœæãã âSafeAreaScalerâ ãã¢ã¿ããããŸããRectTransform ã¯æ¬¡ã®ããã«èšå®ããŸãã
ãã®ããã«èšå®ããããšã§ãå®è¡æã«ã»ãŒããšãªã¢ã«åºããããã« RectTransfrom ã®å€§ãããå€æŽãããŸãã
å°ãèæ¯ç»åãªã©ã¯ã»ãŒããšãªã¢ã«å¶éããããšæ¬ ããŠããŸããããã»ãŒããšãªã¢ã®å€åŽã«é
眮ããå¿
èŠããããŸãã
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 ã䜿çšããããããããã®ãã©ã³ããã¡ã€ã«ã«å¯ŸããŠåæ§ã«ãã©ã³ãã¢ã»ãããäœæããŸãã
âCanvas/TopPageâ ã«èµ·åæã«è¡šç€ºãããç»é¢ãå®è£
ããŸãã
ã¿ã€ãã«ç»é¢ã¯åã«UIã䞊ã¹ãäžéšUIã«ã¢ãã¡ãŒã·ã§ã³ãä»äžããŠããã·ã³ãã«ãªæ§æã§ãããç¹çããã¹ãç¹ããªããããããã§ã¯å€§ãŸããªæ§æãšäžéšã®å®è£
ã®ã¿çŽ¹ä»ããŸãã
èæ¯ç»åã¯æ¬¡ã®ç»åã䜿çšããŠããŸãã
âCanvas/TopPageâ ã®çŽäžã« âBackgroundâ ã®åå㧠UIç»åãªããžã§ã¯ããäœæããäžèšã®ç»åãèšå®ããŸãã
ããã«ããã®ãªããžã§ã¯ãã®äžã«è£
食ã®ããã®ã³ã€ã³ç»åãé
眮ããŸããã¿ã€ãã«ç»é¢ã§ã¯ã³ã€ã³ã®ã¢ãã¡ãŒã·ã§ã³ã®ãããç»åãªããžã§ã¯ãã®èŠªãªããžã§ã¯ããäœæãã芪ãªããžã§ã¯ããçšããŠäœçœ®ã調æŽããŸãã
âSafeAreaâ ã®äžã«ã¿ã€ãã«ããŽãPLATEAUããŽãã²ãŒã éå§ãã¿ã³ãé
眮ããŸãã
ã²ãŒã éå§ãã¿ã³ã¯ä»¥äžã®ç»åã䜿çšããŸãã
âButtonâ ã³ã³ããŒãã³ãã® âOn Click ()â ã«ããŒãžãåãæ¿ããããã®åŠçãç»é²ããŸãããã¿ã³ãæŒãããéã«ã âTopPageâ ãéã¢ã¯ãã£ãã«ãã次ã®ããŒãžã§ãã âSelectModePageâ ãã¢ã¯ãã£ãã«ããŸãã
ARãã¬ãžã£ãŒãããã§ã¯ãAR空éäžã«è€æ°ã®ãã§ãã¯ãã€ã³ããé
眮ãããã®ãã§ãã¯ãã€ã³ããå®éã«æ©ããŠç®æãäœéšãæäŸããŠããŸãããã®ç« ã§ã¯ãã®ãã§ãã¯ãã€ã³ããããã管çããä»çµã¿ãå®è£
ããŸãã
ãã§ãã¯ãã€ã³ããå«ããäžé£ã®ã«ãŒããå®çŸ©ããããã®åç¹ãã«ãŒããã€ã³ããšããŠå®çŸ©ããŸããã«ãŒããã€ã³ããšãã§ãã¯ãã€ã³ããè€æ°ã€ãªããããšã§ã«ãŒããäœæããããšãã§ããŸãã
以äžã®ãããªã¹ã¯ãªããã â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 ãªããžã§ã¯ãããã§ãã¯ãã€ã³ããã©ãããå€å®ã§ããããã«ãªããŸãããã®ãã©ã°ã¯ãã«ãŒããã€ã³ããããŒãžã£ãŒã®å®è£
ãã®é
ç®ã§å®è£
ããã«ãŒããã€ã³ããããŒãžã£ãŒã§äœ¿çšããŸãã
åé
ã§äœæããã¹ã¯ãªãããçšããŠçµè·¯ãäœæããŸãããŸãã¯ãã«ãŒããã€ã³ãã®ãã¬ãããäœæããŸãã
ã·ãŒã³äžã« â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. ã«ãŒããã€ã³ããããŒãžã£ãŒã®å®è£
åŸã«è¡ãããšã§ã·ãŒã³ãã¥ãŒã§çµè·¯ãèŠèŠçã«ç¢ºèªããªããã«ãŒããèšå®ããããšãã§ããŸãã
次ã®ç®çå°ãŸã§ã®éçã衚瀺ããããã®ãã¬ãããäœæããŸãã
以äžã®ç»åãããŠã³ããŒããã âAssets/Images/UIâ ãã©ã«ãã«é
眮ããŸãã
ã·ãŒã³äžã«ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããâPathPointâ ã«ååãå€æŽããŸãã
äœæãã âPathPointâ ã« âSpriteRendererâ ã³ã³ããŒãã³ããã¢ã¿ãããã âSpriteâ ã«çšæããç»åãèšå®ããŸãã
â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â ãªããžã§ã¯ãã âAssets/Prefabsâ ã«ãã©ãã°ã¢ã³ãããããããŠãã¬ãããäœæããŸãã
ç®çå°ã®é²æã衚瀺ããUIãå®è£
ããŸãã
ç®çå°ã§ããã¡ãã«ã«å°éãããšãã¢ã€ã³ã³ã«ã¡ãã«ã衚瀺ãããŸãã
1ã€ç®ã®ç®çå°ã«ééãããšãã®UI
å
šãŠã®ç®çå°ãééãããšãã®UI
以äžã®UIçŽ æã âAssets/Images/UIâ ã«é
眮ããŸãã
ãã®UIã¯ããŒãžã®äžéšã«è¡šç€ºããããããäžéšã®ããŒãšã㊠âBottomBarâ ã®ååã§æ°ãã âGameSceneâ ã® âSafeAreaâ å
ã« ã²ãŒã ãªããžã§ã¯ããäœæããRectTransform ã次ã®ãããªãã©ã¡ãŒã¿ã§èšå®ããŸããããã«ãããç»é¢ã®äžéšã«é«ã176pxã®é åãèšå®ããããšãã§ããŸãã
âBottomBarâ ãå³ã¯ãªãã¯ãã UI > Image ãéžæããŠUIç»åãªããžã§ã¯ããäœæããŸããâOrangeBackground.pngâ ãç»åã«èšå®ãã次ã®ããã«ãã©ã¡ãŒã¿ãèšå®ããŸãã
âBottomBarâ ã®é åã§åŒã䌞ã°ãã®ã§ã¯ãªãã300pxãšããé«ãã§äžæ¹åã«ã¯ã¿åºãããã«èšå®ããããšã§ãã¹ããŒããã©ã³ã®ã»ãŒããšãªã¢ã§UIã®äœçœ®ãããããŠãèæ¯ç»åãäžæ¹åã«åãŸãããã«ããããšãã§ããŸãã
âBottomBarâ å
ã« âCheckPointProgressUIâ ã®ååã§ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæãããã®äžã«é²æ衚瀺ã®ã¡ã€ã³UIãæ§ç¯ããŸãã
âCheckPointProgressUIâ ã« âHorizontalLayoutGroupâ ã³ã³ããŒãã³ããã¢ã¿ããããâSpacingâ ã 24ã âChild Alignmentâ ã âMiddle Centerâ ã«èšå®ããŸãã
âCheckPointProgressUIâ ã®äžã«ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããâCheckPoint1â ãšåœåããŸãããã®ãªããžã§ã¯ãã®äžã«ã¡ãã«ã®ã¢ã€ã³ã³ãšãã®ã³ã³ããã®UIãæ§ç¯ããŸãã
äœæãã âCheckPoint1â ã¯ããããåããŸãšãããªããžã§ã¯ãã§ãæçµçã«ãããè€è£œããŠä»ã®ãã§ãã¯ãã€ã³ãã®UIãªããžã§ã¯ããäœæããŸãã
âCheckPoint1â ã® RectTransform ã¯å¹
ãšé«ãã 112px ã«èšå®ããŸãã
âCheckPoint1â ãå³ã¯ãªãã¯ãã UI > Image ãéžæããåãªããžã§ã¯ãã« âBaseâ ã®ååã§UIç»åãªããžã§ã¯ããäœæããŸãã次ã®ç»åã®ããã«ãã©ã¡ãŒã¿ãèšå®ããŸãããã®èšå®ã§ãâCheckPoint1â ã®å€§ããã«åºããããã«ç»åã衚瀺ãããŸãã
âImageâ ã³ã³ããŒãã³ãã®ç»åã«ã¯ âCheckPointButton.pngâ ãéžæããŸãã
âCheckPoint1â ãå³ã¯ãªãã¯ãã UI > Image ãéžæããåãªããžã§ã¯ãã« âIconâ ã®ååã§UIç»åãªããžã§ã¯ããäœæããŸãã âImageâ ã³ã³ããŒãã³ãã®ç»åã« âCoinLeft.pngâ ãèšå®ããRectTransform ã¯æ¬¡ã®ããã«èšå®ããŸãã
以äžã§æ¬¡ã®ãããªã³ã€ã³ã®ã¢ã€ã³ã³ãäœæããããšãã§ããŸãã
次ã«ãã¢ã€ã³ã³ãšã¢ã€ã³ã³ã®éã«è¡šç€ºããã©ã€ã³ãå®è£
ããŸãã
âCheckPointProgressUIâ ãå³ã¯ãªãã¯ãã UI > Image ããUIç»åãªããžã§ã¯ããäœæããâImageâ ã³ã³ããŒãã³ãã®ç»åã« âPathPointLine.pngâ ãèšå®ããŸãã
RectTransform ã¯æ¬¡ã®ããã«èšå®ããŸãã
æåŸã«ãã¢ã€ã³ã³1âã©ã€ã³âã¢ã€ã³ã³2âã©ã€ã³âã¢ã€ã³ã³3ãšãªãããã«äœæãããªããžã§ã¯ããè€è£œããããšã©ã«ããŒäžã§äžŠã³æ¿ããŸãã
以äžã§ãé²æ衚瀺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ç»åã®åç
§ãèšå®ããŠãã ããã
以äžã§é²æç¶æ³UIã®æ§ç¯ã¯å®äºã§ãã
ç¹å®ã®ç¶æ³ã§ã¡ãã»ãŒãžã衚瀺ããã¹ããã¯ããŒãå®è£
ããŸããARãã¬ãžã£ãŒãããã¯ã¢ã€ã³ã³ã®ç°ãªã2çš®é¡ã®ã¹ããã¯ããŒãçšæããŸãã
以äžã®ç»åã âAssets/Images/UIâ ã«ä¿åããŸãã
âSnackbar.pngâ ããããžã§ã¯ããã¥ãŒã§éžæããã€ã³ã¹ãã¯ã¿ãéããŸãã
âSprite Editorâ ãã¿ã³ãæŒäžããŠã¹ãã©ã€ããšãã£ã¿ãŒãéããå³äžã®ãŠã£ã³ããŠã® âBorderâ ã
- L: 62
- R: 62
- T: 48
- B: 80
ã«èšå®ããŸãã
ãã®èšå®ã«ãããUIã®é«ããšå¹
ã®æ¯çãçŽ æã®ç»åãšç°ãªã£ãå Žåã§ããé©åã«æ¡å€§ãããããã«ãªããŸãã
ã·ãŒã³ã® âCanvas/GamePage/SafeAreaâ ã« âCheckPointSnackBarâ ã®ååã§æ°ãã Image ãªããžã§ã¯ããäœæããŸãïŒå³ã¯ãªã㯠> UI > ImageïŒã
RectTransform ã¯æ¬¡ã®ããã«èšå®ããŸãã
Image ã³ã³ããŒãã³ãã®ç»åã«ã¯ããªãŽã³ã®èšå®ããã âsnackbar.pngâ ã âImage Typeâ ã âSlicedâ ã«æå®ããŸãã
âCheckPointSnackBarâ ã®åãªããžã§ã¯ããšããŠãå³ã¯ãªã㯠> UI > Text - TextMeshPro ãéžæããŠã¡ãã»ãŒãžè¡šç€ºçšã®ããã¹ããªããžã§ã¯ããäœæããŸãã
âFont Assetâ 㯠âNotoSansJP-ExtraBoldâ ãæå®ããŸãã
ã¡ãã»ãŒãžãæ£ããé åã«è¡šç€ºãããããã«ã次ã®ããã« RectTransform ãèšå®ããŸãã
âCheckPointSnackBarâ ã®åãªããžã§ã¯ããšããŠãå³ã¯ãªã㯠> UI > Image ãéžæããŠã¢ã€ã³ã³è¡šç€ºçšã®UIç»åãªããžã§ã¯ããäœæãã次ã®ããã« RectTransform ãèšå®ããŸããImage ã³ã³ããŒãã³ãã®ç»åã«ã¯ âFlag.pngâ ãæå®ããŸãã
次ã«ãã¹ããã¯ããŒã«è¡šç€ºããã¡ãã»ãŒãžã管çããã¹ã¯ãªãããå®è£ ããŸãã 以äžã®ã¹ã¯ãªããã â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â ã®ã»ããã¢ããã¯å®äºã§ãã
åè¿°ã®éããã¢ã€ã³ã³ã®ç°ãªãå¥ã®ã¹ããã¯ããŒãçšæãããããäœæãã âCheckPointSnackBarâ ãè€è£œããâCameraSnackBarâ ãšåœåããŸããã¢ã€ã³ã³ã® Image ã³ã³ããŒãã³ãã®ç»åã âCamera.pngâ ã«å€æŽããŸãã
å
šãŠã®ç®çå°ã«å°éãããšãã®ãããã¢ããUIãå®è£
ããŸãã
以äžã®UIç»åã âAssets/Images/UIâ ã«ä¿åããŸãã
èæ¯ã®ããã¯ã¹ãšãã¿ã³ã®ç»åã¢ã»ããã¯ã¹ãã©ã€ããšãã£ã¿ãŒãçšããŠããªãŽã³ãèšå®ããŸãã
ã·ãŒã³ã® âCanvas/GamePageâ ã«ç©ºã®ã²ãŒã ãªããžã§ã¯ãã âCongraturationsModalâ ã®ååã§äœæããŸããã¢ãŒãã«ã¯åžžã«ç»é¢äžå€®ã«è¡šç€ºããããããã»ãŒããšãªã¢ã®äžã«ãããå¿
èŠã¯ãããŸããã
RectTransform ã¯æ¬¡ã®ããã«èšå®ããŸãã
ã³ã³ããªãŒããããã¢ããUIã®ã³ã³ãã³ãã¯ä»¥äžã®ããã«äœæããŸãã
ããããã以äžã®ããã«ã»ããã¢ããããŸãã
- Background: Image
- Icon: Image
- Message: Text - TextMeshPro (NotoSansJP-Bold)
- Button: Button - TextMeshPro (NotoSansJP-Bold)
ãã®ãããã¢ããã¯ã¹ã¯ãªãããã衚瀺ç©ãå€æŽããããšããªããããç¹ã«å°çšã®ã¹ã¯ãªãããäœæããå¿
èŠã¯ãããŸããã
æŒåºã®ããããããã¢ããã衚瀺ããéã®æ¬¡ã®ãããªã¢ãã¡ãŒã·ã§ã³ãå®è£
ããŸãã
- éæ床ã»ã¹ã±ãŒã«ã0 â 1ãžã¢ãã¡ãŒã·ã§ã³ããã
- ã¹ã±ãŒã«ã® 0 â 1 ãžã®ç§»è¡ã¯ã¢ãã¡ãŒã·ã§ã³ã«ãŒãã調æŽããããšã§ãè·³ãããããªæŒåºãå®çŸãã
ãŸãããããã¢ããã®è¡šç€ºç©å
šäœã®éæ床ãå€æŽã§ããããã« âCanvasGroupâ ã³ã³ããŒãã³ãã âCongraturationsModalâ ã«ã¢ã¿ããããŸãã
次ã«ãã¢ãã¡ãŒã·ã§ã³ãèšå®ããããã«ã âAnimationâ ã³ã³ããŒãã³ããã¢ã¿ããããŸãã
ã¡ãã¥ãŒã® Window > Animation > Animation ãã Animation ãŠã£ã³ããŠãéããããšã©ã«ããŒäžã§ âAnimationâ ã³ã³ããŒãã³ããã¢ã¿ãããããã²ãŒã ãªããžã§ã¯ããéžæãããš Animation ãŠã£ã³ããŠã«è¡šç€ºããã âCreateâ ãã¿ã³ããã¢ãã¡ãŒã·ã§ã³ã¯ãªãããäœæããããšãã§ããŸãã
âCreateâ ãã¿ã³ãæŒäžãããšãã¢ãã¡ãŒã·ã§ã³ã¯ãªããã®ãã¡ã€ã«ä¿åå
ãéžæããå¿
èŠãããããã âAssets/Animations/UIâ ãã©ã«ããäœãã âShowModalâ ã®ååã§ãã¡ã€ã«ãäœæããŸãã
以äžã® âAdd Propertyâ ãããã¹ã±ãŒã«ãšéæ床ã«é¢ããããããã£ãäœæããŸãã
ããããã以äžã®ãããªã«ãŒãã«èª¿æŽããŸãã
ã¢ãã¡ãŒã·ã§ã³ã¯ãªãããäœæã§ãããã â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â ã®ã¡ãœãããæå®ããŸãã
ãã¬ã€ã€ãŒã®äœçœ®æ
å ±ã«ããã¡ãã«ã®ç²åŸå€å®ãé²æã管çããæ©èœãå®è£
ããŸãã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â ã«ç»é²ããã äžé£ã®éçã衚瀺ãããããšãã§ããŸãã
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);
}
}
äœæããã¹ã¯ãªãããåäœããããããã·ãŒã³äžã«æ°ããã²ãŒã ãªããžã§ã¯ããäœæããã¹ã¯ãªãããã¢ã¿ããããŸãã
ç°¡åãªæ§æã«ãããããåã¢ãŒãããšã«å°çšã®ã«ãŒããã€ã³ããããŒãžã£ãŒãªããžã§ã¯ããäœæããŠå©çšããŸããåã責åãæã£ããªããžã§ã¯ããã·ãŒã³å
ã«éè€ããããšã«ãªããŸãããäžã€ã®ã¢ãŒãã ããèŠãå Žåã«ãã®æ§æãã·ã³ãã«ãã€ãããããããããã®ãããªã«å®è£
ããŠããŸãããããã£ãŠãäžã€ã®ã¢ãŒãã®äžã§ã«ãŒããã€ã³ããããŒãžã£ãŒãæ§ç¯ããããšãåæ§ã«ä»ã®ã¢ãŒãã§ãã«ãŒããã€ã³ããããŒãžã£ãŒãæ§æããŠãã ããïŒè€è£œããå Žåã¯å¥ã®ã¢ãŒãã®åç
§ãæ®ããªãããã«æ³šæããŠãã ããïŒã
äœæããã«ãŒããã€ã³ããããŒãžã£ãŒã®åãã£ãŒã«ããèšå®ããŸãã
èšå®é ç® | æŠèŠ |
---|---|
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éœåžã¢ãã«ã®å Žåã«ããã®åç §ãæå®ããŸãã |
ã¡ãã«ã®ã¡ãã·ã¥ïŒïŒDãœããã§åç€åœ¢ã®åºæ¬åœ¢ç¶ã®ã¡ãã·ã¥ãçšæããŸãã
ãããªã¢ã«ïŒã¡ãã«ã®å
åŽãšå€åŽã§äºã€çšæããŸãã
â å
åŽéšåïŒç®çå°ã®ç»åããã¯ã¹ãã£èšå®ããããããªã¢ã«ãé©çš
â¡ å€åŽéšåïŒåè²ã®ãããªã¢ã«ãé©çš
ããŒã¿ã«ã¡ãã·ã¥ïŒã²ãŒã ã®ãšãã§ã¯ãè¡šçŸçã§äžè¬çãªããã圢ç¶ã¡ãã·ã¥ãçšæã
以äžã¯ã¡ãã·ã¥ã®ïŒµïŒ¶ã§ããã·ã§ãŒããŒåŽã§ã¡ãã·ã¥ã®ïŒµïŒ¶ã®ã¹ã¯ããŒã«æ©èœãå®è£
ãããšãã§ã¯ããäžããäžã«æ²¿ã£ãŠæµãããããªè¡šçŸãäœæããŸãã
ã¹ã¯ããŒã«è¡šçŸã¯ã·ã§ãŒããŒã°ã©ãã§å®è£
ããŸããã·ã§ãŒããŒã°ã©ã (Shader Graph) ã¯Unityã®ããŒã«ã§ãããŒã³ãŒãã§ã·ã§ãŒããŒãäœæã§ããããã«èšèšãããŠããŸããããŒããšåŒã°ããããžã¥ã¢ã«èŠçŽ ãã€ãªããããšã§ãã·ã§ãŒããŒãçŽæçã«èšèšã§ã,è€éãªã³ãŒããæžããã«ã3Dãªããžã§ã¯ãã®èŠãç®ãã«ã¹ã¿ãã€ãºããããšãå¯èœã§ãã
ãšãã§ã¯ãçšã®ãããªã¢ã«ãæ°èŠã§äœæããŸããããããžã§ã¯ããŠã€ã³ã㊠> å³ã¯ãªãã¯ã¡ãã¥ãŒ > Create > Material ããæŒäžããŸãã
ãããžã§ã¯ããŠã£ã³ããŠã«æ°ãããããªã¢ã«ãäœæãããŸãã
ãããžã§ã¯ããŠã£ã³ããŠããäœæãããããªã¢ã«ãéžæããŠã¡ãã·ã¥ã«ãã©ãã°ã¢ã³ãããããããäœæãããããªã¢ã«ããšãã§ã¯ãã®ã¡ãã·ã¥ã«å²ãåœãŠãŸãã
ã·ã§ãŒããŒã°ã©ãã®ã¢ã»ãããæ°èŠäœæããŸããUnityã®ãããžã§ã¯ããŠã€ã³ã㊠> å³ã¯ãªãã¯ã¡ãã¥ãŒ > Create > Shader Graph > URP > Unlit Shader Graph ãæŒäžããŸãã
æ°ããã·ã§ãŒããŒã°ã©ãã®ã¢ã»ãããäœæãããŸãã
ã¢ãã«ã«å²ãåœãŠã New Material ã«äœæããã·ã§ãŒããŒãå²ãåœãŠãŸãããããªã¢ã«ãéžæããŠã€ã³ã¹ãã¯ã¿ãŒãããNew Shader GraphããéžæããŸãã
äœæããã·ã§ãŒããŒã°ã©ãã®ã¢ã»ãããããã«ã¯ãªãã¯ãã·ã§ãŒããŒã°ã©ãã®ç·šéãŠã€ã³ããŠã衚瀺ããŸãã
ã·ã§ãŒããŒã°ã©ãã®ç·šéãŠã€ã³ããŠå
ã§å³ã¯ãªã㯠> Create Node ãæŒäžããŠãCreate Nodeã®ããã«ã衚瀺ããŸãã
Create Nodeã®ããã«ããé©å®å¿
èŠãªããŒããè¿œå ããŠãããŸããæ€çŽ¢ããã¯ã¹ã«ããŒã¯ãŒããå
¥åããããšã§ãä»»æã®ããŒããæ€çŽ¢ããããšãã§ããŸãã
以äžã®ããŒãã°ã©ãã¯ã¡ãã·ã¥ã®ïŒµïŒ¶ãã¢ãã¡ãŒã·ã§ã³ããçºã®æå°æ§æãšãªããŸãã
â TimeããŒããè¿œå ããæéçµéã«äŒŽãå€ãå ç®
â¡ ã¹ã¯ããŒã«ã®ç§»åé床ãSpeedããã©ã¡ãŒã¿ãŒãè¿œå
⢠TimeããŒãã«äžèšã®å€ãããããæ¥ç¶ããé床ã®èª¿æŽãå¯èœã«ãã
⣠Vector2ããŒãã®Xã0ã«èšå®ãYã«ã®ã¿UVã®ç§»åãé©çšãã瞊æ¹åã«ã®ã¿ã¢ãã¡ãŒã·ã§ã³ãé©çš
†ãšãã§ã¯ãã®éæ床çšã®ãã¯ã¹ãã£ããããªã¢ã«ã«èšå®å¯èœã«ãã
⥠SamplerTextureïŒDããŒãã«ãã¯ã¹ãã£ãšUVãèšå®
⊠æçµçãªã¢ã«ãã¡å€ãåºååŽã«æ¥ç¶
ã·ã§ãŒããŒã°ã©ãã®ç·šéãŠã€ã³ããŠå³åŽã®Graph Inspectorã以äžã®èšå®ã«ããŸãã
ç·šéäœæ¥ã®å®äºåŸãã·ã§ãŒããŒã°ã©ãã®ç·šéãŠã€ã³ããŠã®å³äžã®ãSave AssetããæŒããšããããŸã§ã®äœæ¥ãã¢ã»ããã«ä¿åãããŸãã
ã·ãŒã³ã«æ»ããšãã§ã¯ããã¢ãã¡ãŒã·ã§ã³ããããšã確èªããŸãã
ãããªã¢ã«ã®ãã©ã¡ãŒã¿ãŒã«ã€ããŠ
èšå®é ç® | æŠèŠ |
---|---|
Base Color | ãšãã§ã¯ãã®è² |
Base Texture | ã¢ã«ãã¡çšã®ãã¯ã¹ã㣠|
Speed | ãšãã§ã¯ãã®ã¢ãã¡ãŒã·ã§ã³é床 |
Alpha | å šäœã®ãšãã§ã¯ãã®äžéæ床 |
ã¡ãã«ã®ãªããžã§ã¯ãã®ãã¬ãããåç¶æ
ããšã«çšæããŸããå
·äœçã«ã¯ãéåžžãããååŸæãããååŸåŸãã®ãã¬ãããçšæããŸãã
ååŸåŸæã«ã¯ã¡ãã«åäœã衚瀺ãããååŸåŸã«ã¯ã¡ãã«ã¯é衚瀺ã«ãªããããŒã¿ã«ã®ãšãã§ã¯ãã®è²ãçœè²ã«ãªããŸãã
éåžž | ååŸæ | ååŸåŸ |
---|---|---|
![]() |
![]() |
![]() |
äœæããåãã¬ããã¯ãCheckPointObjectãã³ã³ããŒãã³ãã®ãNormalStatePrefabãããComplete Effect PrefabãããCompletedStatePrefabãã«èšå®ããŸãã
以äžã®ãœãŒã¹ã³ãŒãã â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);
}
}
}
ARãã¬ãžã£ãŒãããã§ã¯ãå©çšãã3Déœåžã¢ãã«ã®æ¹åŒïŒPLATEAU SDKã§ã€ã³ããŒãããã¢ãã«ãCesiumã§ã¹ããªãŒãã³ã°ããã3Déœåžã¢ãã«ãããŒã«ãŒã§äœçœ®åãããè¡ã3Déœåžã¢ãã«ïŒãéžæããUIãã¿ã€ãã«ç»é¢ãªã©ã®ç°¡æãªæ©èœãå®è£
ããŠããŸãã
ARãã¬ãžã£ãŒãããã§å®è£
ããUIãªã©ã®æ©èœã¯ãå¯èœãªéãã·ã³ãã«ãªå®è£
ã«ãªã£ãŠããŸãã
âCanvas/SelectModePageâ å
ã«ãå³ã¯ãªãã¯ãã Create > UI > Image ãéžæããèæ¯ç»åã®UIç»åãªããžã§ã¯ããäœæããŸãã
ç»é¢å¹
ã«åºããããã« RectTransform ãèšå®ããImage ã³ã³ããŒãã³ãã®ç»åã«ã¯8-4. ãã§ãã¯ãã€ã³ãé²æ管çUIã®å®è£
ã§çšæãããªã¬ã³ãžè²ã®èæ¯ãå©çšããŸãã
ã¡ãã»ãŒãžãš3ã€ã®ãã¿ã³ã瞊æ¹åã«äžŠã¹ãããã âVerticalLayoutGroupâ ã³ã³ããŒãã³ããå©çšããŸãã âCanvas/SelectModePageâ å ã«ç©ºã®ã²ãŒã ãªããžã§ã¯ããäœæããRectTransform ãèšå®ã㊠âVerticalLayoutGroupâ ã³ã³ããŒãã³ããã¢ã¿ããããŸããã²ãŒã ãªããžã§ã¯ãã®åå㯠âVerticalLayoutâãšããŸãã
ã€ã³ã¹ãã¯ã¿ãããâVerticalLayoutGroupâ ã® âChild Alignmentâ ã âMiddle Centerâ ã«èšå®ããŸãã
âControl Child Sizeâ ãªã©ã®ããããã£ã¯å
šãŠãªãã«ããŸãã
ãã®èšå®ã«ããããã®ãªããžã§ã¯ãå ã®åãªããžã§ã¯ãã¯çžŠæ¹åã«äžŠãã§ã¬ã€ã¢ãŠããããŸãã
âVerticalLayoutâ ãªããžã§ã¯ããå³ã¯ãªãã¯ãã Create > UI > Text - TextMeshPro ããããã¹ãUIãªããžã§ã¯ããäœæããŸãã
RectTransform ã¯ä»¥äžã®ããã«èšå®ããŸããäœçœ®ã¯èŠªã® âVerticalLayoutGroupâ ã³ã³ããŒãã³ãã«ãã£ãŠå¶åŸ¡ããããããç¹ã«èšå®ããå¿
èŠã¯ãããŸããïŒèšå®äžå¯ïŒã
ãã©ã³ãã®èšå®ã¯ä»¥äžã®ããã«èšå®ããŸãã
- Font Asset: NotoSansJP-ExtraBold
- Font Size: 48
- Alignment: Middle Center
ããã¹ãã¯æ¹è¡ä»ãã§ä»¥äžã®æèšãèšå®ããŸãã
ã©ã®æ¹æ³ã§ PLATEAUã¢ãã«ã 䜿çšããŸããïŒ
ãã¿ã³ã«äœ¿çšãã以äžã®ç»åã âAssets/Images/UIâ ã«ä¿åããŸãã
âVerticalLayoutâ ãªããžã§ã¯ããå³ã¯ãªãã¯ãã Create > UI > Button - TextMeshPro ãããã¿ã³UIãªããžã§ã¯ããäœæããŸãã
äœæãããã¿ã³ãªããžã§ã¯ãã«ã¢ã¿ãããããŠãã Image ã³ã³ããŒãã³ãã®ç»åãçšæãã âModeSelectButton.pngâ ã«å·®ãæ¿ããImage ã³ã³ããŒãã³ãäžéšã«è¡šç€ºãããŠãã âSet Native Sizeâ ãã¿ã³ãæŒäžãããã®ç»åãµã€ãºã«åãããŠãã¿ã³ãªããžã§ã¯ãã®å€§ãããèšå®ããŸãã
ãã¿ã³å ã®ããã¹ãã¯æ¬¡ã®ããã«èšå®ããŸãã
- Font Asset: NotoSansJP-Bold
- Font Size: 32
- Child Alignment: Middle Center
- Vertex Color: #FFFFFF
äœæãããã¿ã³ãªããžã§ã¯ãã3ã€ã«è€è£œãã以äžã®ããã«æèšãèšå®ããŸãã
âButtonâ ã³ã³ããŒãã³ãã® âOn Click ()â ãçšããŠã䜿çšããã¢ãŒãã®3Déœåžã¢ãã«ã®åãæ¿ããšUIã®åãæ¿ããè¡ããŸãã
ã·ãŒã³ã«ã¯å
šãŠã®ã¢ãŒãã®3Déœåžã¢ãã«ã®ã²ãŒã ãªããžã§ã¯ããéã¢ã¯ãã£ãã«ããç¶æ
ã§é
眮ããåã¢ãŒãéžæã®ãã¿ã³ã§ã¯ã¢ãŒãã«å¯Ÿå¿ããã²ãŒã ãªããžã§ã¯ããã¢ã¯ãã£ãã«ããããšã§éžæããã¢ãŒãã®3Déœåžã¢ãã«ãå©çšã§ããããã«ããŸãã
ãŸãããã¹ãŠã®ãã¿ã³ã®å
±éåŠçãšããŠãã¢ãŒãéžæã®ããŒãž âSelectModePageâ ãéã¢ã¯ãã£ãã«ãã ã¡ã€ã³ããŒãž âGamePageâ ãã¢ã¯ãã£ãã«ããããšã§ããŒãžåãæ¿ããå®çŸããŸãã