前提・実現したいこと
https://www.urablog.xyz/entry/2018/04/30/160940
↑このサイトの方と同じようにドロップダウンリストに都市を表示させたい。
(今回使用しているスクリプトはこのサイトのものです)
発生している問題・エラーメッセージ
ボタンにスクリプトをアタッチしてインスペクターでドロップダウンを指定したのですが実行してみるとドロップダウンリストがSeaneからもGameビューからも消えてしまいます。
エラーメッセージは出ていませんでした。
該当のソースコード
WeatherController
1//------------------------------------------------------------------------ 2// 3// (C) Copyright 2018 Urahimono Project Inc. 4// 5//------------------------------------------------------------------------ 6using UnityEngine; 7using UnityEngine.UI; 8using System.Collections; 9using System.Collections.Generic; 10using System.Linq; 11 12public class WeatherController : MonoBehaviour 13{ 14 private static readonly string DEFINITION_TABLE_URL = "http://weather.livedoor.com/forecast/rss/primary_area.xml"; 15 private static readonly System.Xml.Linq.XName CITY_TITLE_ATTRIBUTE = System.Xml.Linq.XName.Get( "title" ); 16 private static readonly System.Xml.Linq.XName CITY_ID_ATTRIBUTE = System.Xml.Linq.XName.Get( "id" ); 17 18 private static readonly string API_URL = "http://weather.livedoor.com/forecast/webservice/json/v1"; 19 private static readonly string API_CITY_PARAMETER = "city"; 20 21 [SerializeField] 22 private Dropdown m_dropdownUI = null; 23 [SerializeField] 24 private WeatherUI[] m_weatherUIs = null; 25 26 27 private CityData[] m_cities = null; 28 29 30 private void Start() 31 { 32 StartCoroutine( Initialize() ); 33 } 34 35 36 #region Initialize 37 38 private IEnumerator Initialize() 39 { 40 if( m_dropdownUI == null ) 41 { 42 yield break; 43 } 44 45 // 都市情報が取得できるかわからないから、それまではUIを隠しておこうか。 46 m_dropdownUI.gameObject.SetActive( false ); 47 48 // 日付ごとの天気情報UIは天気を取得してから表示するようにしよう。 49 foreach( var weatherUI in m_weatherUIs ) 50 { 51 if( weatherUI != null ) 52 { 53 weatherUI.gameObject.SetActive( false ); 54 } 55 } 56 57 58 CityData[] cities = null; 59 { 60 System.Action<CityData[]> onFinished = ( i_cities ) => 61 { 62 cities = i_cities; 63 }; 64 yield return GetCityTableProcess( onFinished ); 65 } 66 67 if( cities == null || cities.Length == 0 ) 68 { 69 Debug.LogErrorFormat( "都市情報取ってこれんかったわ。フォーマットでも変わったのかなぁ。" ); 70 yield break; 71 } 72 73 // 都市名をリストで表示できるようにしよう。 74 m_dropdownUI.AddOptions( cities.Select( value => value.Name ).ToList() ); 75 m_dropdownUI.gameObject.SetActive( true ); 76 77 m_cities = cities; 78 } 79 80 private IEnumerator GetCityTableProcess( System.Action<CityData[]> i_onFinished ) 81 { 82 if( i_onFinished == null ) 83 { 84 Debug.LogErrorFormat( "コールバックが指定されてないぜ。これじゃ結果がわからないぜ。" ); 85 yield break; 86 } 87 88 string xmlText = null; 89 { 90 System.Action<string> onFinished = ( i_text ) => 91 { 92 xmlText = i_text; 93 }; 94 yield return CallWebRequest( DEFINITION_TABLE_URL, onFinished ); 95 } 96 97 if( string.IsNullOrEmpty( xmlText ) ) 98 { 99 Debug.LogErrorFormat( "1次細分区定義表の取得に失敗だ!" ); 100 i_onFinished( null ); 101 yield break; 102 } 103 104 Debug.LogFormat( "1次細分区定義表(XML):\n{0}", xmlText ); 105 CityData[] cities = ParseCityList( xmlText ); 106 107 i_onFinished( cities ); 108 } 109 110 private CityData[] ParseCityList( string i_xmlText ) 111 { 112 113 var cities = new List<CityData>(); 114 115 try 116 { 117 System.Xml.Linq.XDocument xml = System.Xml.Linq.XDocument.Parse( i_xmlText ); 118 System.Xml.Linq.XElement root = xml.Root; 119 120 // cityタグに都市情報があるはずだ! 121 // フォーマットが変わったら、この方法じゃ無理になるかもしれないかもね。 122 var cityElements = root.Descendants( "city" ); 123 if( cityElements != null ) 124 { 125 foreach( var element in cityElements ) 126 { 127 var titleAttribute = element.Attribute( CITY_TITLE_ATTRIBUTE ); 128 var idAttribute = element.Attribute( CITY_ID_ATTRIBUTE ); 129 if( titleAttribute == null || idAttribute == null ) 130 { 131 continue; 132 } 133 134 cities.Add( new CityData( idAttribute.Value, titleAttribute.Value ) ); 135 } 136 } 137 } 138 catch( System.Exception i_exception ) 139 { 140 Debug.LogErrorFormat( "うーむ、このXML情報は読み込めなかったらしい。エラーの詳細を添付しておくよ。{0}", i_exception ); 141 } 142 143 return cities.ToArray(); 144 } 145 146 #endregion // Initialize 147 148 149 #region GetWeather 150 151 public void OnGetWeather() 152 { 153 // UI上で取得ボタンを押したら呼ばれるぜ! 154 155 if( m_cities == null || m_cities.Length == 0 ) 156 { 157 Debug.LogErrorFormat( "都市情報を取得できてないから、天気取得なんて無理無理!" ); 158 return; 159 } 160 161 if( m_dropdownUI == null || 162 !m_dropdownUI.gameObject.activeInHierarchy ) 163 { 164 Debug.LogErrorFormat( "都市のUI表示されてなくね?" ); 165 return; 166 } 167 168 string selectedCityName = m_dropdownUI.captionText.text; 169 if( string.IsNullOrEmpty( selectedCityName ) ) 170 { 171 Debug.LogErrorFormat( "どこの都市を選択したか、わかんないんだけど……。" ); 172 return; 173 } 174 175 CityData selectedCity = m_cities.FirstOrDefault( value => value.Name == selectedCityName ); 176 if( selectedCity == null ) 177 { 178 Debug.LogErrorFormat( "知らない都市なんだが……。この都市知ってる? {0}", selectedCityName ); 179 return; 180 } 181 182 StartCoroutine( GetWeatherProcess( selectedCity.ID ) ); 183 } 184 185 private IEnumerator GetWeatherProcess( string i_cityID ) 186 { 187 if( string.IsNullOrEmpty( i_cityID ) ) 188 { 189 Debug.LogErrorFormat( "ちゃんと都市IDを入れてくれよ!" ); 190 yield break; 191 } 192 193 string requestURL = string.Format( "{0}?{1}={2}", API_URL, API_CITY_PARAMETER, i_cityID ); 194 string jsonText = null; 195 { 196 System.Action<string> onFinished = ( i_text ) => 197 { 198 jsonText = i_text; 199 }; 200 yield return CallWebRequest( requestURL, onFinished ); 201 } 202 203 if( string.IsNullOrEmpty( jsonText ) ) 204 { 205 Debug.LogErrorFormat( "天気情報の取得に失敗だ!" ); 206 yield break; 207 } 208 209 210 Debug.LogFormat( "天気情報(Json):\n{0}", jsonText ); 211 212 var weatherData = JsonUtility.FromJson<WeatherData>( jsonText ); 213 SetWeatherUI( weatherData ); 214 } 215 216 private void SetWeatherUI( WeatherData i_weatherData ) 217 { 218 if( i_weatherData == null ) 219 { 220 Debug.LogErrorFormat( "天気情報が空のようだぜ!" ); 221 return; 222 } 223 224 var forecasts = i_weatherData.forecasts; 225 if( forecasts == null || forecasts.Length == 0 ) 226 { 227 Debug.LogErrorFormat( "天気情報が空のようだぜ!" ); 228 return; 229 } 230 231 if( m_weatherUIs == null || m_weatherUIs.Length == 0 ) 232 { 233 Debug.LogErrorFormat( "天気情報を表示するUIの準備が出来ていないようだね" ); 234 return; 235 } 236 237 // 日付毎のUIの数より天気情報の日付数の方が多い場合は、UI分だけ表示。 238 // 逆に日付毎のUIの数の方が多い場合は、天気情報分だけ表示。 239 for( int i = 0; i < m_weatherUIs.Length; ++i ) 240 { 241 var ui = m_weatherUIs[ i ]; 242 if( ui == null ) 243 { 244 continue; 245 } 246 247 if( forecasts.Length <= i ) 248 { 249 ui.gameObject.SetActive( false ); 250 continue; 251 } 252 253 ui.gameObject.SetActive( true ); 254 var forecast = forecasts[ i ]; 255 256 // 温度は入っていないこともあるみたいなので、一応チェックしておこう。 257 ui.Data = forecast.date; 258 ui.Weather = forecast.telop; 259 ui.TemperatureMin = forecast.temperature.min != null ? forecast.temperature.min.celsius : null; 260 ui.TemperatureMax = forecast.temperature.max != null ? forecast.temperature.max.celsius : null; 261 } 262 263 } 264 265 #endregion // GetWeather 266 267 268 private IEnumerator CallWebRequest( string i_requestURL, System.Action<string> i_onFinished ) 269 { 270 if( i_onFinished == null ) 271 { 272 Debug.LogErrorFormat( "コールバックが指定されてないぜ。これじゃ結果がわからないぜ。" ); 273 yield break; 274 } 275 276 if( string.IsNullOrEmpty( i_requestURL ) ) 277 { 278 Debug.LogErrorFormat( "URLぐらい指定してくれよ……。" ); 279 i_onFinished( null ); 280 yield break; 281 } 282 283 var request = UnityEngine.Networking.UnityWebRequest.Get( i_requestURL ); 284 yield return request.SendWebRequest(); 285 286 // ドキュメントなどでは"isError"を使って判定しているようだけど、 287 // "isNetworkError"に名前が変わったようなので、こっちを使ってくれよな! 288 if( request.isHttpError || request.isNetworkError ) 289 { 290 Debug.LogErrorFormat( "残念ながらエラーが発生しちまったらしい。詳細を添付しておく。{0}", request.error ); 291 i_onFinished( null ); 292 yield break; 293 } 294 295 i_onFinished( request.downloadHandler.text ); 296 } 297 298 299} // class WeatherController
試したこと
カメラの範囲に収まっていないかと思い確認してみましたがスクリプトをアタッチしないで実行すると普通に表示されていて?、違うゲームオブジェクトなどにスクリプトをアタッチしたりしてみたのですがどこにアタッチしても再生すると消えてしまいます…
APIを呼ぶ練習用にと思い始めたのですがサイトの通りやってみてもうまくいかず行き詰ってしまいました。どなたか教えていただけると助かります…
補足情報(FW/ツールのバージョンなど)
Unity2019.4.10f1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/25 10:47
2021/02/25 11:27
2021/02/25 11:38