Unity使用者がAndroid Studioでつまずいた点まとめ
先週、6月26日に10時間ハッカソンに行ってきました。(10時間ハッカソンというのはWCEのイベントです)
本日は「戦車」をテーマにした10時間ハッカソンを開催しました。一年生も作品を完成させることができてよかったです! pic.twitter.com/u1SitnXHeF
— WCE (@WCE_official) 2016年6月26日
今回せっかくの機会なので、Android Studioを用いてAndroidアプリを作ろうと思ったのですが、普段UnityやSiv3Dといったゲームエンジンしか使ってない自分はかなりつまずいてしまったので、つまずいた点を紹介したいと思います。
フレームの更新
まず、フレームの更新についてですが、UnityのUpdate関数のようなイベント関数はないので、自分で作る必要があります。正しかったのかはわかりませんが、今回はRunnableインターフェースとpostDelayed関数を用いて実装しました。
postDelayed関数は指定したRunnableオブジェクトのrun関数を指定した時間だけ遅れて呼び出す関数なのですが、run関数の終わりで再び自身を呼び出すことでループを実現しています。
画像を指定した大きさでキャンバスに描画する
Android Studioで座標を指定して画像を描画するにはCanvasオブジェクトとdraw関数を用います。そこまではいいのですが、実は標準で画像を解像度以外のサイズで描画できないので、drawBitmap関数にRectオブジェクトを渡してやる必要があるのですが、そこでつまずきました。
渡すRectにはsrcとdstの二種類があります。srcはもとの画像のどこを切り取るかなので、今回は全面を指定します。dstがお目当の指定する大きさです。
自分がつまずいたポイントはRectのコンストラクタでした。普段Siv3Dを使っているので(x, y, w, h)だと思ったら(left, top, right, bottom)だったんですね。これに気づかずに変な指定をして大きさ0になってしまい、画像が描画されないと嘆いてました。リファレンスはよく読みましょう。
Layoutを使う
Android端末はものによって大きさが全然違います。なので座標を直接指定することができません。この問題を解決するためにAndroid Studioでは画像やボタンといったコンポーネントをViewに分けて、それらの並べ方をxmlファイルにLayoutとして記述します。それすらわからずに、いきなりCanvasで作ってしまったので痛い目を見ました、、、
といってもCanvasのような自作のコンポーネントでもViewクラスを派生することで、xmlファイルに記述することが可能になります。
逆にxmlファイル上に記述したViewをプログラムでいじりたい時はfindViewById関数を用いればいいようです。キャストするのをお忘れなく。
まとめ
普段ゲームエンジンしか使わないというか、経験のあるツールが少ないせいでかなり手こずってしまいました。Android Studioでは見た目はxmlファイル、動作はJavaときっちり分かれている印象を受けました。htmlとJavascriptといった感じですかね?
今回のように画像などのコンポーネントから作るのではなく、各コンポーネントの全体の配置をxmlファイルで決めてしまってから、JAVAで動作を記述するのが正しい開発方法な気がします。