U
タブ 05モバイルへ書き出す7 レッスン — タップで開く
07 / 07 · 26 分
モバイルへ書き出す★ 練習課題

最終課題:ゲームを世に出す

ここまでのプロジェクト▸ Arena.unity

everything from tab 01–05 · signed release build on a real phone

練習課題3–5 時間

コース最後の課題です。Arena を——ウェーブも敵もタッチ操作もすべて——実機のスマホに入れてください。署名済みの release ビルドとして、5 分間フレームレートを保つこと(出せる端末なら 60 FPS、どんなに悪くても 30 を割らない)、アプリを落としても進行状況を覚えていること。

再利用するもの

Everything from tabs 01–04タブ 01〜04 のすべてAndroid build setupAndroid ビルド設定Player SettingsURP mobile qualityURP のモバイル品質Save / load JSONJSON のセーブとロードadb logcat実機ログの確認Keystore + .aabkeystore と署名・配布
アニメーション図

エディタのスクリーンショットではなく、誰かにインストールしてもらえるスマホのアプリアイコン。

パート 1 — シーンを片付ける

  • Arena.unity を開きます——タブ 01 から育て続けてきたシーンです。GameDirector がスポーンポイントを全部持っているか確認してください。

  • テストの残骸を消します。余分なカメラ、置き忘れのライト、よけておいたブロックなどです。

  • シーンには AudioListener・EventSystem・CinemachineBrain が、それぞれちょうど一つずつでなければなりません。

  • タブ 03 のタッチ用 Canvas が残っていて、ゲームをスマホで動かしたときに自分で有効になるかを確かめます。

パート 2 — ビルドを設定する

the settings you must change
Project Settings → Player
  Company Name            your studio               // not DefaultCompany
  Product Name            Arena
  Package Name            com.yourstudio.miniarena  // permanent
  Version / Bundle Code   1.0.0 / 1
  Default Orientation     Landscape Left
  Scripting Backend       IL2CPP
  Target Architectures    ARMv7 + ARM64             // ARM64 is mandatory
  Minimum API Level       24
  Managed Stripping       Medium
  Graphics APIs           Vulkan, OpenGLES3         // remove OpenGLES2

URP Asset (mobile)
  Shadow Max Distance     40
  Cascade Count           1
  HDR                     off
  MSAA                    disabled
  Render Scale            0.85

Assets/link.xml
  preserve SaveData       // or stripping deletes it
MobileBoot.cs — must exist in the first scene
void Awake()
{
    Application.targetFrameRate = 60;
    QualitySettings.vSyncCount = 0;
    Screen.sleepTimeout = SleepTimeout.NeverSleep;
    DontDestroyOnLoad(gameObject);
}

パート 3 — 最初のビルドは必ず壊れている

想定内です。まず Development Build を作って実機に入れ、プレイしながら adb logcat を読んでください。実機でしか起きないバグこそ、この課題の狙いです。

terminal
adb devices                          # is the phone actually connected?
adb logcat -c && adb logcat -s Unity # clear, then watch only Unity

# after the build
adb install -r Builds/arena-dev.apk
adb shell monkey -p com.yourstudio.miniarena 1

ほぼ全員が踏む五つのバグ

  • マテリアルがピンク色——Shader が URP へ変換されていないサインです。マテリアルを変換してからビルドし直します。

  • ボタンが反応しない——EventSystem が無いのか、画面いっぱいの透明な Image が raycast を食べているのかのどちらかです。

  • セーブファイルが空——IL2CPP の stripping が SaveData を削り落としています。link.xml に追加してください。

  • 実機で 20 FPS、エディタで 200 FPS——リアルタイムシャドウとポストエフェクトのせいです。URP アセットを確認しましょう。

  • ノッチに UI が隠れる——タッチ用 Canvas に SafeAreaFitter が付いていません。

パート 4 — リリースビルド

  • keystore を作ったらプロジェクトの外に保存し、バックアップは二カ所に。失くすとアプリを更新できなくなります。

  • 何かをコミットする前に、*.keystore を .gitignore へ入れておきます。

  • Development Build のチェックを外し、Build App Bundle にチェックを入れて .aab をビルドします。

  • 署名済み .apk も残しておいてください。友達に渡して試してもらうのはこのファイルです。

できたといえる条件

  • ✓アプリが実機のスマホに入っていて、Unity ではなく独自のアイコンから起動する。
  • ✓タッチ操作だけで一連の流れを最後までこなせる。移動、カメラの狙い、三つのスキルすべて、敵を一体倒すところまで。
  • ✓ノッチ付きスマホでは UI 要素がすべてセーフエリアの内側に収まり、タブレットでも崩れないようアンカーされている。
  • ✓アプリをバックグラウンドへ送って強制終了し、開き直すと HP も位置もゴールドも戻っている。
  • ✓5 分間プレイし続けても 30 FPS 以上を維持する。1 分目ではなく 5 分目で測ります。
  • ✓一通りプレイしたあとの adb logcat -s Unity に exception が一つも出ない。
  • ✓Development Build を外した状態でビルドした、署名済み .aab がある。
  • ✓他人があなたの .apk を自分のスマホに入れて、ちゃんと動いた。

狙うべき数値

項目目標値理由
5 分目の FPS≥ 30発熱でフレームレートが落ちるため、5 分目の数値だけが正直です。
.aab のビルドサイズ≤ 150 MB150 MB を超えると、Google Play は追加の配信設定を必要とします。
コールドスタートから操作可能まで≤ 5 sブラックスクリーンが長いほど、プレイヤーはアプリを落とします。
使用中のメモリ≤ 600 MBこれを超えると、RAM 3 GB のスマホではバックグラウンドでアプリが殺され始めます。
logcat の例外01 フレームに 1 回の NullReference は、音もなく FPS を殺します。

もっとやりたい人へ

ボーナス 1

.aab を Play Console に internal test としてアップロードし、自分のスマホには Play Store からインストールします。

ボーナス 2

RAM が 3 GB 未満のスマホでは render scale と shadow distance を下げる、デバイス階層の判定を追加します。

ボーナス 3

同じプロジェクトを iOS 向けにもビルドし、同等のハードウェアでフレームレートを比較します。

ボーナス 4

ゲーム内で FPS とメモリを出すオーバーレイを切り替えられるようにすると、テスターが実際の数値を報告できます。

これでコースは終わり

  • 「変数は何?」から始めて、スマホの上で動く署名済みビルドまで来ました。これがパイプラインの全体です。

  • ここから先は広さではなく深さの段階です。動きを磨き、敵を賢くし、本物のレベルデザインと自分たちのアートスタイルを作ります。

  • 次に作るべきは、ゲームプレイが一つで中身が 5 分ぶん、そして最後まで作り切れるゲームです。この分野で最も珍しいスキルは完成させることだからです。