UnityでネストされたJSONデータを読み込む
データの読み込みにはJSONObjectを利用することにしました。
JSONObject - Unify Community Wiki
こちらのありがたいAssetはResourcesフォルダにインポートしたらそれでOK。
次は元になるJSONデータ・URLを用意。
{"coord":{"lon":100,"lat":28},"sys":{"message":0.0173,"country":"CN","sunrise":1433283805,"sunset":1433333572},"weather":[{"id":800,"main":"Clear","description":"Sky is Clear","icon":"01d"}],"base":"stations","main":{"temp":291.042,"temp_min":291.042,"temp_max":291.042,"pressure":659.73,"sea_level":1016.79,"grnd_level":659.73,"humidity":36},"wind":{"speed":0.75,"deg":244.002},"clouds":{"all":0},"dt":1433303679,"id":6643967,"name":"Gezan","cod":200}
元データ↑WorldWetherAPIより。
ところでみんな目視でデータ見るときどうしてるんだろう。
私はVisualJSONをとりあえず入れてるけど結局ブラウザの整形機能使うよね。
weatherのところが一度[ ]で囲まれてる。
前もこういうやつでハマった。
IEnumerator Download() {
WWW url = new WWW("http://api.openweathermap.org/data/2.5/weather?lat=28&lon=100");//JSONデータのURLyield return url;
JSONObject json = new JSONObject(url.text);
// Debug.Log(www.text); //生JSONデータ
string weather = json.GetField ("base").str;
Debug.Log(www.text); //ネストされてないデータ
JSONObject arr = json.GetField("weather");
Debug.Log ("一回目。天気のリストは" + arr);
JSONObject arr2 = arr[0];
Debug.Log ("まるっと取り出し。" + arr2);
JSONObject result = arr2.GetField ("main");
Debug.Log ("お天気は"+ result);
}
わーいできた!ヽ(=´▽`=)ノ
小一時間ハマったくせに超カンタンに取出せたよ。
Shooting Game チュートリアル iOS対応 第01回
すすめていきます。
こちらもおとなしく、作成済みプロジェクトをDLしてそれを開きます。
いつもどおりにアップデートの案内が出るので承諾。
1.1 シェア機能を実装する
まずはテクスチャのDL。
そしてコードを書き進める。
なるほど、iOSのコードを入れる処理があるのね!よかった!
externって何?
extern 修飾子は、外部で実装されるメソッドを宣言するために使用します。
なるほど。
Application.CaptureScreenshot ("screenShot.png");
スクショの取り方もわかった。
なんでOnGUIのところはif文なんだろう?
なぜ if 文で囲っているかというと, GUI.Buttton は押された時のみ true を返すので
こうすることで押した時のみ行う処理を書くことができます.
(引用:[Unity][GUI] スクリプトから Button を作ろう - Qiita)
とりあえず、カッコ内で生成しておけば押された時にTrueを返す、と覚えておけばいいのかな。
つづいてネイティブコードを書く!
Plugins/iOSフォルダ内にmmファイルを入れておくと、ビルドしたXcodeプロジェクトに自動でファイルを追加してくれます。
へぇ。
そんでファイルの作成(手動)
.mmって??.mじゃないの?と思っていたら。
Objective-C++(Objective-Cの中でC++を使う)では.mm。
.mmなら#importとかいらない、ということらしい。合ってる?
そしてソースコードを見ていく。
#endif
extern "C"{
}
お作法ということで書けばいいのかな。
と思ったらエラー。
autoreleaseと#endifを消してコンパイルOKになりました。
あと、platformもiOSにしておきました。
extern "C"{
void Shooting_Share(const char *text, const char *url, const char *textureURL){
NSString *_text = [NSString stringWithUTF8String:text];
NSString *_url = [NSString stringWithUTF8String:url];
NSString * _textureURL = [NSString stringWithUTF8String:textureURL];UIImage *image = nil;
if([_textureURL length] != 0){
image = [UIImage imageWithContentsOfFile:_textureURL];
}
NSArray *actItems = [NSArray arrayWithObjects:_text, _url, image,nil];UIActivityViewController *uiActivityViewController = [[UIActivityViewController alloc]initWithActivityItems:actItems applicationActivities:nil];
[UnityGetGLViewController() presentViewController:uiActivityViewController animated:YES completion:nil];
}
}
でも、最初なんか狭いよ。
そのあとはいいんだけど。
ということで完成ファイルを落として比べてみることにします。
…。
同じようです。
でもまあ実装方法がわかったので、自分のプロジェクトにもこれで入れられるね!
UIActivityViewController以外でも試してみたい。
Shooting Game チュートリアル モバイル対応 第04回(失敗)
すすめていきます。
4.1 バーチャルジョイスティックをアセットストアからダウンロード
ちょっとびっくりしました。
あのソフトもあれもそれもUnityだったのね、みたいな焦り?
とりあえずインポートします!必要なファイルだけということでちゃんと気をつけて。
いつものが出ました。そもそもUnity4.6用って書いてあるし大丈夫かな?
設置はしてみた。この場所からは動かせないのかしら。
そんでコードを書いてみると。
エラー。
CrossPlatformInputManagerに変更しても、エラー。
このクラスを使うって宣言しないとだめなんじゃない?
ってことで
using UnitySampleAssets.CrossPlatformInput;
を最初にいれてみると、CrossPlatformInputManagerでエラーは消えました。
でも、入力は受け取ってくれません。
iOSだから?ということでいまさらながらPlatformをiOSにしてみます。
はいー受け取らないー。
しかも敵やっつけなくなったー。
レイヤーがおかしくなってるっぽいー。
そもそものUnityバージョンが違うのがいけないのかもしれない。
ジョイスティックも伸びているし、これは黒帯対応のに使うべきアセット。
失敗ということでこのまま今回は置きます。残念。
Shooting Game チュートリアル モバイル対応 第03回
すすめていきます。
3.1 タッチパネルに対応させる
ここでいきなりUnityRemoteというアプリの存在を知る。
iOSだけどインストールしてみました。
コンピュータとつないでEditerからPlayを押して、ということなのでやってみます。
設定はとりあえずDeviceだけ変えて。
プレイ。
すごい!!
こんなに簡単に実機テストできるなんて思っていませんでした。
コード変更、タップにも反応したしOKです。
また、「TouchクラスではなくEventクラスでタッチ情報を取得する」ほうが定石なのかな。
ということで素直に書き換え。めっちゃ簡単になった!
OnGUIメソッドはイベントドリブン的なやつ?
やー感動しました。
UnityRemoteにね!
Shooting Game チュートリアル モバイル対応 第02回
すすめていきます。
2.1 ゲームビューの画面サイズ変更
こちらは黒帯でなく引き伸ばしでの対応。
おとなしく12回終了時のデータをDLし、そこからすすめていくことに。
2.2 BackgroundとDestroyAreaの変更
うん、素直に広がったよ!
と、あれ、これだけ?
つまりデバイスのスクリーンサイズを取得しているということでいいんだよね。