あさちゅんのゲームブログ

UnityやSiv3Dに関するゲーム開発メモを残していきます

Unity使用者がAndroid Studioでつまずいた点まとめ

先週、6月26日に10時間ハッカソンに行ってきました。(10時間ハッカソンというのはWCEのイベントです)

今回せっかくの機会なので、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で動作を記述するのが正しい開発方法な気がします。

使用したソフト
OS X El Capitan バージョン 10.11.5
Android Studio 2.1.2