Unity ~ Android / iOS 両対応ウハウハだと思ったがワナが潜んでいた件 ~

「Android 開発の落とし穴」では Java での Android アプリ開発における注意点をご紹介しましたが、今回は開発環境に付随する部分のお話です。

Unity で Android / iOS 両対応アプリ開発をしたら、ここが気になった!ここに引っかかった!という点をつらつらとあげてみたいと思います。

Unityとは

ゲーム・インタラクティブコンテンツ開発用の統合開発エンジン。さまざまなプラットフォームに対応。

unity3d.com

Android / iOS 共通編

プラットフォーム別にあれこれしたい!

C# で書けば、Android / iOS どちらでも出力できるすてきな Unity。 ただし、何でもかんでもいい具合にすべてやってくれる、というわけではもちろんありません。 やはり OS やハードウェア、外部サービス依存は避けて通れない…。

そんなときの”プラットフォーム依存コンパイル”。

#if UNITY_EDITOR
    // エディタ上でのみ実行
#endif

#if UNITY_ANDROID
    // Android 実機上でのみ実行
#endif

#if UNITY_IOS
    // iOS 実機上でのみ実行
#endif
// UNITY_IPHONE は 非推奨

他にもいろいろあります。
Unity – マニュアル: プラットフォーム依存コンパイル

Google Play / App Store を開きたい!

ストアのページをアプリから開きたければ、Application.OpenURL すれば良いのですが、 Google Play と App Store では当然 URL が異なります。

#if UNITY_ANDROID
    // market://details?id=パッケージ名
    Application.OpenURL ("market://details?id=jp.sglabs.burokuzu");
#elif UNITY_IOS
    // http://appstore.com/アプリ名
    Application.OpenURL ("http://appstore.com/burokuzualternative");
#endif

ちなみに、AppStore を開くためのアプリ名のルールは、
Technical Q&A QA1633: Creating easy-to-read short links to the App Store for your apps and company
を参照。

テクスチャが汚い!

iPhone / iPad では画像の透明部分と色がついた部分のエッジが汚いことがあります。

以下は、フォーマットごとの特徴とサンプルです。

Compressed (PVRTC)

  • 場合によってかなり汚い
  • メモリ節約
  • 速い
  • iOSで使える
  • 1024×1024のテクスチャファイルサイズで0.5MB

Compressed (ETC1)

  • 汚い
  • メモリ節約
  • 速い
  • 不透明画像のみ
  • どのAndroidでも使える
  • 1024×1024のテクスチャファイルサイズで0.5MB

16bit (RGBA 16 bit)

  • 汚い(色階調がガタガタ)
  • メモリやや節約
  • 遅い
  • 1024×1024のテクスチャファイルサイズで2.0MB

Truecolor (RGBA 32 bit)

  • 綺麗
  • メモリ馬鹿食い
  • 遅い
  • 1024×1024のテクスチャファイルサイズで4.0MB

(詳細はリファレンス(共通)リファレンス(iOS)リファレンス(Android)を参照ください)

ご覧のとおり、テクスチャ形式次第で綺麗さをとるか、速度&メモリ優先するかのトレードオフとなります。

実際に、パフォーマンスを優先して Compressed(PVRTC)形式を採用したところ、画像が汚くなってしまいました。 なので、Compressed はあきらめて Truecolor か RGBA16 フォーマットにしました。

一方 Android は GPU がバラバラ、最適な圧縮形式はまちまちなのですが、 ETC1 にしておくのがよさそうです。 ETC1 は Android 端末で共通して使える圧縮形式です。 PVRTC とは異なり、目立って汚くなることはありませんでした。

インスペクタ上では汚くならないように Truecolor を設定します。 さらに、Build Settings – Android にて “Texture Compression” を “Don’t override” から “ETC1 or RGBA16” に変えておきます。

Android 編

バックキーが効かない!

Android でバックキーが効かない場合は、イベントを拾ってあげましょう。

// Update is called once per frame
void Update ()
{
    #if UNITY_ANDROID
        if (Input.GetKeyUp (KeyCode.Escape)) {
            // Backキー押された!
        }
    #endif
}

ナビゲーションバーがジャマ!

端末によっては、ソフトウェアボタンでホーム、バック、メニューボタンを実現しているものがありますが、常に画面下部をボタンで占拠されるとゲームをする上で画面が狭く、邪魔になってしまいます。

Android 4.4 から Immersive Mode という全画面モードが OS でサポートされました。 Unity 4.6 系は標準ではサポートされていませんが、Android Immersive Mode アセットを使うと簡単に実現できます。Unity 5系は標準サポートしています。

Android Immersive Mode – Asset Store

以上、Unity で Android / iOS 両対応アプリ開発時のワナ(!?)まとめでした。


参考