Cesium for Unityデモで好きな場所に行く

https://cesium.com/platform/cesium-for-unity/
cesium for Unity のデモの7番は、
1-8の数字キーで設定された場所に行くことができますが、
これを、好きな場所に行けるように改造してみます。

<iframe width="560" height="315" src="https://www.youtube.com/embed/qXJKF2eo4oE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>



まず、こちらのソースをコピペします。
内部では、OpenStreetMapのAPIを利用して地名を緯度経度に変換しています。
Unity2023.1からはasync/awaitがつかえるようになるので
今後はそちらを利用したほうが簡単になるかもしれません。


```
using CesiumForUnity;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Networking;
using TMPro;
using Unity.Mathematics;

namespace MyCeciumTest
{
    public class FlyToTheLocation : MonoBehaviour
    {
        [Tooltip("The CesiumFlyToController that will take flight at runtime.")]
        public CesiumFlyToController flyToController;

        public const string OSMDefaultPlaceToLanLng = "https://nominatim.openstreetmap.org/search?format=json&addressdetails=1&limit=1";
        public delegate void OSMLatLngDelegate(OSMSearchLatLngResultMin result);

        [System.Serializable]
        public class OSMSearchLatLngResultMin
        {
            public double lat;
            public double lon;
            public string display_name;
        }

        public void OnLocationSet(TMP_Text _text)
        {
            if (!string.IsNullOrEmpty(_text.text))
            {
                OSMPlaceToLatLng(_text.text, placeToLanLngCB);
            }
        }

        void placeToLanLngCB(OSMSearchLatLngResultMin _result)
        {
            if (_result != null)
            {
                Debug.Log(_result.display_name);
                if (this.flyToController != null)
                {
                    this.flyToController.FlyToLocationLongitudeLatitudeHeight(
                        new double3(_result.lon, _result.lat, 200.0), 185f, 22.5f, true
                    );
                }
            }
        }

        public void OSMPlaceToLatLng(string _place, OSMLatLngDelegate _latLngCB, string _otherProperty = "&accept-language=us")
        {
            StartCoroutine(osmPlaceToLatLngCo(_place, _otherProperty, _latLngCB));
        }
        IEnumerator osmPlaceToLatLngCo(string _place, string _otherProperty, OSMLatLngDelegate _latLngCB)
        {
            string uri = $"{OSMDefaultPlaceToLanLng + _otherProperty}&q={Uri.EscapeDataString(_place)}";
            Debug.Log(uri);
            UnityWebRequest webRequest = UnityWebRequest.Get(uri);
            yield return webRequest.SendWebRequest();
            if (webRequest.result == UnityWebRequest.Result.ConnectionError)
            {
                Debug.Log(webRequest.error);
            }
            else
            {
                char[] trimchars = { '[', ']' };
                string json = webRequest.downloadHandler.text.Trim(trimchars);
                OSMSearchLatLngResultMin result = JsonUtility.FromJson<OSMSearchLatLngResultMin>(json);
                _latLngCB?.Invoke(result);
            }
        }
    }
}

```
上記スクリプトをデモプロジェクトに追加したら、
空のオブジェクトに貼り付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/2b86cc60-15ef-75c6-84ec-a0d43abca347.png)

FlyToControllerはDinamicCameraのところにあるので、DynamicCameraをドラッグアンドドロップしてセットします。

次に適当なUICanvasを作り、中にInputFieldを作成します。
InputField(TextMeshPro)にする場合は日本語が文字化けするので、日本語フォントのTextAssetを使用してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/59911/d5e516d4-f263-7541-7b2e-76cf8f66b801.png)

InputFieldを作成したら、OnEndEditの右下の+をクリックし、
先ほどのスクリプト内にあるOnLocationSetを追加してください。
Textの部分にはInputFieldの一番下にあるText(実際に入力に使用している部分)を入れます。

以上で、InputFieldに入力した場所に移動できるようになります。