読者です 読者をやめる 読者になる 読者になる

夏までにiPhone アプリつくってみっか!

趣味でiPhone/Androidアプリを開発し、日々勉強した事を書いています。オープンワールド系レースゲームをUnityで開発中です。

【cocos2d-x】iOSとAndroidでオーディオファイルのリソースを分ける方法

cocos2d-x

iOS版TravelShooting JPではオーディオファイルとして、BGMには.m4a(AAC)ファイル、SEには.aiffファイルを使っています。
Androidでは.ogg(Ogg Vorbis)ファイルが推奨されているらしいので、Audacityoggファイルに変換しました。
マルチプラットフォームとしてiOS(Xcode)とAndroid(Eclipse)環境両方でビルドするためには.m4a, .aiff, .ogg全てのオーディオファイルをResouresフォルダーに入れておく必要がありますが、そうすると使われない余計なファイルがアプリに組み込まれ、アプリのサイズが肥大化してしまいます。

Xcodeの場合は、iOS用ファイルとAndroid用ファイルを別のフォルダーに分けておいて、iOS用のフォルダーのみをプロジェクトに入れることでAndroid用の.oggファイルを除外する事が可能です。

Androidの方はというと、ググるとこういうページが見つかりました。

www.cocos2d-x.org

proj.androidフォルダーにあるbuild-cfg.jsonファイルでexclude指定すれば良さそうです。
早速やってみました。

{
    "ndk_module_path" :[
        "../cocos2d",
        "../cocos2d/cocos",
        "../cocos2d/external"
    ],
    "copy_resources": [
        {
            "from": "../Resources",
            "to": "",
            "exclude": [
                "audio_ios"
            ]
        }
    ]
}

変化無し!

audio_iosフォルダーがしっかりassetsフォルダーにコピーされています。

こちらのフォーラムのやり取りによるとcocos consoleという物を使わないとダメな感じです。

discuss.cocos2d-x.org

Eclipseでビルドするときはbuild-cfg.jsonファイルは使われないのでしょう。
試しにbuild-cfg.jsonファイルを削除してビルドしてみましたが、普通にビルドできてしまいました。

では、Eclipseは何を使ってResourcesフォルダーからassetsフォルダーにコピーしているのでしょう?Eclipseのログを見てみると、どうやらbuild_native.pyのようです。
中を見てみるとリソースのコピー処理で.gzファイルを除外するコードがあったので、見よう見まねで.aiffと.m4aも除外するように修正してみました。

def copy_files(src, dst):

    for item in os.listdir(src):
        path = os.path.join(src, item)
        # Android can not package the file that ends with ".gz"
        if not item.startswith('.') and not item.endswith('.gz') and not item.endswith('.aiff') and not item.endswith('.m4a') and os.path.isfile(path):
            shutil.copy(path, dst)
        if os.path.isdir(path):
            new_dst = os.path.join(dst, item)
            os.mkdir(new_dst)
            copy_files(path, new_dst)

その結果、audio_iosフォルダーの中身の.aiff、.m4aファイルはコピーされなくなり、これまで約60MBあったアプリのサイズが、約40MBに減りました!

どう考えても美しいやり方には思えないので、もっとスマートな方法がありそうですが、とりあえずはこれで我慢しておきます。

美しい方法をご存知の方はぜひコメントをお願いいたします。