最終課題:ゲームを世に出す
everything from tab 01–05 · signed release build on a real phone
コース最後の課題です。Arena を——ウェーブも敵もタッチ操作もすべて——実機のスマホに入れてください。署名済みの release ビルドとして、5 分間フレームレートを保つこと(出せる端末なら 60 FPS、どんなに悪くても 30 を割らない)、アプリを落としても進行状況を覚えていること。
再利用するもの
エディタのスクリーンショットではなく、誰かにインストールしてもらえるスマホのアプリアイコン。
パート 1 — シーンを片付ける
Arena.unity を開きます——タブ 01 から育て続けてきたシーンです。GameDirector がスポーンポイントを全部持っているか確認してください。
テストの残骸を消します。余分なカメラ、置き忘れのライト、よけておいたブロックなどです。
シーンには AudioListener・EventSystem・CinemachineBrain が、それぞれちょうど一つずつでなければなりません。
タブ 03 のタッチ用 Canvas が残っていて、ゲームをスマホで動かしたときに自分で有効になるかを確かめます。
パート 2 — ビルドを設定する
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 itvoid Awake()
{
Application.targetFrameRate = 60;
QualitySettings.vSyncCount = 0;
Screen.sleepTimeout = SleepTimeout.NeverSleep;
DontDestroyOnLoad(gameObject);
}パート 3 — 最初のビルドは必ず壊れている
想定内です。まず Development Build を作って実機に入れ、プレイしながら adb logcat を読んでください。実機でしか起きないバグこそ、この課題の狙いです。
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 MB | 150 MB を超えると、Google Play は追加の配信設定を必要とします。 |
| コールドスタートから操作可能まで | ≤ 5 s | ブラックスクリーンが長いほど、プレイヤーはアプリを落とします。 |
| 使用中のメモリ | ≤ 600 MB | これを超えると、RAM 3 GB のスマホではバックグラウンドでアプリが殺され始めます。 |
| logcat の例外 | 0 | 1 フレームに 1 回の NullReference は、音もなく FPS を殺します。 |
もっとやりたい人へ
.aab を Play Console に internal test としてアップロードし、自分のスマホには Play Store からインストールします。
RAM が 3 GB 未満のスマホでは render scale と shadow distance を下げる、デバイス階層の判定を追加します。
同じプロジェクトを iOS 向けにもビルドし、同等のハードウェアでフレームレートを比較します。
ゲーム内で FPS とメモリを出すオーバーレイを切り替えられるようにすると、テスターが実際の数値を報告できます。
これでコースは終わり
「変数は何?」から始めて、スマホの上で動く署名済みビルドまで来ました。これがパイプラインの全体です。
ここから先は広さではなく深さの段階です。動きを磨き、敵を賢くし、本物のレベルデザインと自分たちのアートスタイルを作ります。
次に作るべきは、ゲームプレイが一つで中身が 5 分ぶん、そして最後まで作り切れるゲームです。この分野で最も珍しいスキルは完成させることだからです。