Adobe AIR 3.9 で iOS, Android, PC 向けに
ゲームを作って世に出す時にありがちなこと

Created: 2013-11-20
Modified: 2013-11-20
Written by Tatsuya Koyama

0. これは何

この文書では、Adobe AIR でマルチプラットフォーム向けのゲーム開発を行ったときに私が遭遇した、 細かい問題や不具合とその解決方法、また そもそも AIR ってどうなの という議論についての私の今のところの考えをシェアします。

iOS, Android 向けのゲームを作ろうとしている人の参考になれば幸いです。

1. 実際に AIR で作ってリリースしたゲーム

まず宣伝ですが、自分は 2012 年に Mr.WARP 、2013 年に iro-mono というゲームをリリースしました。Adobe AIR 製です。

自分は職業もゲームプログラマですが、これらは完全に趣味で制作したものです。 iOS, Android, PC のブラウザで遊べて時間もそれほどかからないので、是非さわってみてください。


とりあえず AIR 製のゲームでこれくらいは動く、というのが確認頂けると思います。 Mr.WARP の方についてはソースコードも公開しています。 Stage 3D のハンドリングには Starling Framework を、自前の汎用ゲームフレームワークでラップして使っています。

2. ある程度わかっている人向けの概略

忙しい人のために、先に伝えるべきファクトを示しておきます。

  • 2013 年 11 月現在、最新版である AIR SDK 3.9 を使用しないと、iOS 申請でリジェクトされてしまいました
    • iOS7 の iPad で起動しないとのことでしたが、自分の端末では再現しませんでした
    • AIR SDK 3.9 でパッケージングしたもので再申請したら通りました

  • AIR 3.5 以上を使用した場合、swf をルート直下のパスに置いてパッケージング しないと、iOS 版がスプラッシュ画面で止まります
    • Android 版は問題なく動くのと、実機ログを見てもそれらしいものが出ないのでハマりやすいところだと思います

続いて、AIR に対する所感を述べます。 同じマルチプラットフォーム向けのソリューションとして、Cocos-2dxUnity と比較します。 まず良いところから。

  • 2012年 3 月、モバイルで Stage 3D が使えるようになってから、ゲームを動かすミドルウェアとして実用に耐えるレベルになったと思います

  • 好みの問題ですが、ActionScript 3.0 はゲームを書く言語としては手頃だと思います
    • (C++ ほどプリミティブすぎず、JavaScript ほどライトすぎないという意味で)

  • ブラウザで動かせるのは Cocos-2dx などに比べてアドバンテージです
    • Unity にも Web Player がありますが

  • 無料で iOS / Android にリリースできます
    • Unity にも無料版がありますが、起動時にロゴが入ります

  • 大きい企業が提供している分、安定性や周辺のソフトはまあまあ整っている感じです

次に、悩ましく思っているところ。

  • ミドルウェアを介して楽をしているぶん、不具合に遭遇したときに Adobe の対応を待たなければいけないケースがありえます
    • その辺は「いざとなったらソースを直せる」Cocos 2dx などの方が小回りがきくとも言えます

  • 最新版の SDK で前よりもアプリの起動に時間がかかるようになった気が。
    • iOS, Android ともに 3 秒程度、背景色の画面が目に入る感じです
    • (注: 専用のテクスチャフォーマットである ATF を使うと起動も速くなるらしいです。今度試す)

  • 未来が危うい雰囲気がします
    • ネットの記事は日本語・英語ともにちょいちょい出てくるのでまだ使っている人はいそう
    • Adobe は AIR 推しのようですが、「モバイル Flash のサポートが終わった」とか「Unity が見放した」とか悪いニュースばかり目立つので、人が離れてしまいそうなのが怖いですね

と、まあ良し悪しあるよね、といったところです。 選択肢として十分アリだと思いますが、AIR だからこそ、という決め手もまだ見つかっていない現状です。

3. AIR でゲームを作るときの開発環境

3.1 個人開発でお金をかけない場合

iOS アプリや Flash の swf ファイルを作るには Adobe のお高いソフトが必要になると考えている人は多そうですが、 Flash Builder (AS3 の統合開発環境)を使うことを諦めればお金をかけずに開発からリリースまでは可能です。 開発に必要な AIR SDK, Flex SDK は無料でダウンロードできます。

実際、時代に逆行するようですが私は Emacs でコーディングを行い、Makefile を書いてターミナルでコマンドを叩いて swf や ipa, apk をビルド しています。まあ趣味開発としてはこれで十分です。Emacs 好きだし。


割りと原始的な感じで開発してる

ただ、今なら Creative Cloud があるので昔よりは有料ソフトを使う敷居が低いですね。 Creative Cloud が無い時代は 90,000 円近くする単体のソフトを買う必要がありましたが、 年間 60,000 円で Flash Builder に加えて PhotoShop や諸々の高価なソフトも使えるようになると思えば、 趣味開発目的としても現実的なラインです。(なんか Adobe の回し者みたくなってるな…)

ああ、あと Windows の人なら FlashDevelop というオープンソースの IDE がありましたね。 あれが Mac でも使えればなあ。

3.2 会社でちゃんとやる場合

さすがに仕事でチーム開発するなら、AS 特化の補完とリッチなデバッグ機能が使える Flash Builder を使うべきでしょう。 何にしろデザイナー陣は Adobe のソフトを使う人が多いでしょうから、 Creative Cloud のグループ版を導入すればいいと思います。企業としては安く済むレベルですね。

4. そもそもゲーム開発の選択肢として AIR はどうなのか

これですが、まだ私自身の各種ミドルウェアの知識が足りていないので、確信めいたことは言えません。 これについては申し訳ない。勉強します。 仕事や趣味開発を通してもう少し見えてくることがあったら、またちゃんとまとめたいと思っています。

ところで、ゲーム開発環境としてミドルウェア(とその周辺ソフトウェア)を考えるときに、 評価軸となる観点は何でしょうか。 自分はチームでゲーム開発をする場合にカギとなるのは「エキスパートが自分の領域で全力を出せること」だと思っていて、 つまりはアーティストやゲームデザイナーが自己完結でコンテンツを作れる開発環境をどれくらい用意できるか、 ってところが重要だと考えています。 (アニメーションの組み込みとかデータの差し替えとかに、できるだけプログラマの作業を介したくない)

ここで「Flash で作った UI やアニメーションを取り込みやすい」みたいな特性があれば、 他のミドルウェアに比べて AIR がアドバンテージを得られるかもしれませんが、 そういう事例も寡聞にして知りません。 MovieClip とかそのまま再生できるんじゃないの、とか思われそうですが、 描画に Stage3D を用いるためにはスプライトシートとメタデータに書き出して それをプログラム側で再生してやる必要があるので、 結局他のゲーム開発環境でもやるようなデータの変換やハンドリングは必要になります。 (Flash で作ったアセットを Stage3D のゲームに統合するスマートな方法があれば知りたい)

ですので、ゲーム開発という観点で見ると まあアリだけど AIR にこだわる理由も特にない、 という印象ですかね。 もともと AIR や Flash ってツールとか Web のインタラクション向けで、 ゲームに力入れだしたのは最近なので、もうちょっと様子を見てもいいかもしれません。 まあそんな中 Unity が勢いあるのは間違いない ので、そのうち Unity 一色になってしまうかもしれませんが。

※ 2013-11-20 追記

会社の AIR 力の高い人から聞きましたが、「Flash で作成したアニメーションを取り込んで Starling で再生」 であれば DragonBones がその要件を満たしてくれそうです。 (カンファレンスとかで見たことあったけど忘れてた…)

テクスチャをコマアニメでなくパーツで書き出してくれるので、省メモリなのがポイント。 良さそうなので今度試してみようと思います。

5. AIR ゲーム開発の Tips

最後に AIR 開発でありがちな細かい Tips を並べておきます。

5.1 - AIR 3.5 以降の iOS ビルドで起動しない問題

これなかなか分からなくて解決に時間かかってしまいました。 結論としては AIR 3.5 以降は swf をルート直下のパスに置いてパッケージングしないと、iOS 版がスプラッシュ画面で止まる というものだったのですが、不意打ちすぎて参りました。 3.5 のリリースノートとか見てもそういう話は見当たらなかったしなぁ。

ちなみに実際の swf ファイルを直下に置いておかなくても、-e オプションで展開先のディレクトリを指定できるので、 ビルドコマンドはこんな感じで書けばよいです:

解決に当たっては Adobe や Starling の Forum とか色々見て回りましたが、 最終的にはおめがさんのエントリに助けられました。感謝。

iOS はビルド作るのに 5 分くらいかかってしまうのでいつも最後にテストするんですが、 何かと問題起きるのもまた iOS なので厄介ですね。

5.2 - AIR 3.9 でビルドしないと iOS 申請がリジェクトされる問題

上記の問題がすぐに解決できなかったので、最初は仕方なく AIR 3.4 でビルドしたもので申請しましたが、ダメでした。 Apple からのレポートは「iOS7 の iPad2 で起動するとスプラッシュで止まる」というものでした。 自分の iPad2 をしぶしぶ iOS7 にアップデートして試してみたのですが、 普通に動いてしまった ので絶望しかけました。再現性のないバグは直せない…

まあ本当のことを言うと、正直 3.9 を使わないのは危ないだろうなとは思っていました。 iOS7 に対応したとアナウンスされたのが 3.9 からだからです。 上記の問題を解決後に AIR SDK 3.9 でビルドしたものを申請したら、無事通りました。

5.3 - iOS でマナーモードにしてても音鳴っちゃう問題

以下の 3 行を記述すればマナーモードに従います。 逆に言うとこれをやっておかないとマナーモードでも容赦なく音が鳴るのでびっくりします。

この Mode は AIR 3.4 から使用可能になったものです。 (当時 Mr.WARP は AIR 3.3 で作っていたので諦めていました…)

5.4 - Starling における描画のパフォーマンス・チューニングについて

わかっている人には常識ですが、GPU を使った描画の場合 描画単体よりも コンテキストスイッチ の方がオーバーヘッドになりえます。 スイッチが発生する例としては、 テクスチャの切り替え、ブレンドモードの変更、スムーシング方式の変更 などですね。

実際 Draw Call の数が 30〜40 くらいになると実機で露骨に FPS 落ちだすのが見えるくらいなので、 この辺はテクスチャアトラスを使ったり描画順序を気にしたり、ということを地道にやる必要があります。 (あと ATF を使うのと使わないのとで結構違うようです。iro-mono は png でやってしまいましたが)


Draw Call を考えず無邪気にこういう描画をやるとめっちゃ重くなる

また Starling には若干のクセがあって、一部の古い端末のために無色の image の描画の最適化を行っています。 その影響で、color や alpha の変更の際にもスイッチングが発生してしまう ようになっています。 不透明 (alpha = 1) と半透明 (alpha < 1) の描画で、スイッチングが発生してしまう のです。

公式の wiki にも書いてありますが、半透明と不透明のオブジェクトが混在する場合には、 不透明を alpha = 1 とするのではなく alpha = 0.9999 といった実質不透明の値に指定する ことで、 見た目は変わらないのに劇的にパフォーマンスが上がることが往々にしてあります。

この辺は Starling 特有の実装を知っていないと罠にハマりやすいところですのでお気をつけください。 (Starling 側にはもう少しスマートな対応をしておいてほしかったですが…)

6. おわりに

以上、私が経験したことの一部をざっとまとめました。 まだまだ私の知らないこともあるでしょうし、そもそも完璧な解というのも無いでしょう。 でも、色んなプラットフォーム向けにゲームを作って世に出すということに関しては、 数年前よりもずっと環境が整ってきているように思います。

作り手としては、こうした道具をうまく利用して、 ユーザに品質の高い作品を届けたいですね。