効いてくる Player Settings
Assets/
Scripts/
プロジェクトの設定
すでにあるものこのレッスンで追加
tab 03 で作ったタッチ用 canvas があるからこそ、この tab が重要になります。向きの設定、safe area、CPU のアーキテクチャが正しい位置に揃っていないと、Knight の操作ボタンが親指の届かない場所に置いておかれます。
Player Settings には二百近い選択肢がありますが、ビルドが動くか、出荷できるか、審査を通るかを左右するのはその中の十二項目です。
向きと safe area の設定が、UI を実機で生かすも殺すも決めます。
識別情報 — 初めてのビルド前に決めておく
- 1
で Company Name と Product Name を設定します。
- 2
Other Settings → Package Name は com.yourstudio.yourgame の形にします。これはあとから変更できません——Google Play はこの名前だけでアプリを永遠に識別し続けるからです。
- 3
Version は 1.0.0、Bundle Version Code は 1。アップロードのたびに code を 1 つ上げてください——同じ番号だと Play が拒否します。
- 4
アプリアイコンは Icon → Adaptive で設定します。Android は前面レイヤーと背面レイヤーの二枚が必要で、ベタ塗りの一枚画像では代わりになりません。
解像度と表示の設定
Default Orientation は Landscape Left、または Portrait にします。まともな向きが一つしかないのに Auto Rotation を有効にすると、プレイヤーをいらつかせるだけです。
Render Outside Safe Area はチェックを入れたままにしてゲームを画面いっぱいに描画し、Notch の扱いは UI 側で Screen.safeArea を使って行います。
Optimized Frame Pacing は、カクつきが確認できたときだけ外してください。多くの機種では入れた方が良くなります。
Other Settings — ビルドを壊す連中
- 1
Scripting Backend は IL2CPP にします。64-bit では Mono が Play Store に認められていませんし、そもそも IL2CPP の方がずっと高速です。
- 2
Target Architectures は ARMv7 と ARM64 の両方にチェックを入れます。ARM64 は必須で、ARMv7 は古いスマホを取りこぼさないために残します。
- 3
Minimum API Level を 23 か 24(Android 6〜7)にすればほぼすべてのユーザーに届きます。Target API Level は Automatic(highest installed)のままで構いません。
- 4
Managed Stripping Level は Medium です。High はもっと多く削りますが、reflection からしか到達できないコードまで消してしまうことがあります。
- 5
Graphics APIs では Auto のチェックを外し、Vulkan を一番上、OpenGLES3 をその次に置きます。OpenGLES2 は丸ごと削除してください。
<linker>
<assembly fullname="Assembly-CSharp">
<type fullname="SaveData" preserve="all" />
<namespace fullname="Game.Data" preserve="all" />
</assembly>
</linker>APK か AAB か
✓ APK
✓ AAB (App Bundle)
フレームレート — Unity は自動で設定してくれない
using UnityEngine;
public class MobileBoot : MonoBehaviour
{
void Awake()
{
// mobile defaults to 30 fps unless you say otherwise
Application.targetFrameRate = 60;
// VSync must be off for targetFrameRate to be respected
QualitySettings.vSyncCount = 0;
// stop the screen dimming during gameplay
Screen.sleepTimeout = SleepTimeout.NeverSleep;
DontDestroyOnLoad(gameObject);
}
}