【Unity】Androidビルド高速化?

この記事は、 KENTEM TechBlog アドベントカレンダー2023 5日目、12月7日の記事です。

開発部エンジニアのY.A.です。

Unity開発におけるAndroid実機デバッグの高速化についてです。

環境

今回高速化を検証した環境です。

開発環境

  • Unity : 2023.2.0f1
  • OS : Windows10
  • AndroidStudio : 2022.3.1
  • VisualStudio : 2022

プロジェクト設定

  • レンダリング方法 : URP
  • 実行プラットフォーム : Android
  • スクリプティングバッグエンド : IL2CPP
  • ターゲットアーキテクチャー : ARM64

ビルド設定

デバッグ前提で組むため下記の条件を有効にします。

  • 開発者ビルド : 有効
  • スクリプトデバッグ : 有効

はじめに

Unityでのアプリケーション開発では、Editor上で実行で賄える部分が多いため実機実行が億劫になりがちです。
実機でのみ起きる問題の対処は少し面倒だなと感じてしまいます。
そんな時に、実機デバッグに時間がかかるとよりテンションが下がってしまいますよね。
弊社の場合、アプリケーションの動作を確認する際に、実機でしか起きないバグがありその確認に苦慮していました。

結果

結果的に言うと、Androidの実機デバッグの方法を「Unityでの実行」から「AndroidStudioでの実行」に変更することで 安定した速度でデバッグビルド/実行することができます。

もともと記事作成時には、「5倍の速度になる」という形で構成していたのですが、
実行時間が早くなることがあるくらいに落ち着いてしまいました。
今回の記事作成に当たり厳密な調査をするとそんなに変わらないことも多くありました。

ただ、Kentemの開発環境でビルド速度に安定感があるため、
安定して早くビルドできる環境」としてご紹介します!

構成

実行環境の変化を簡単にまとめると以下のような形です。
Unityだけで完結していた部分に、AndroidStudioを間にかませるようにしました。
Androidの実機実行に毎回5分以上かかっていた際、iOSの開発チームにどうしているか相談したところ、
「そんなにかかっていない」という話を聞いたのがきっかけでした。
iOSとAndroidのビルド環境の大きな違いで言うと、Unity自体で実行するかどうかかなと考え、
AndroidでもiOSと同じようにネイティブのIDEで実行するようにしました。

調査結果

結果を表にまとめると以下のようになります。
※2回目以降の下の括弧内の数値は、4回実測した際の1回ごとの数字です。

初回のビルド時間に大差はありませんが、2回目以降は数倍早くなっています。
この数値を計算したプロジェクトは、URPでソースコードが多めなものでした。
2回目のビルド時にはソースコードに1行だけ変更を加え、その結果が実機実行時に反映されていることも確認しています。

Unity環境の「2回目以降」を見ていただくとわかるように、あまり数値が安定していません。
私たちのプロジェクトでは一時期毎回300秒~400秒実機実行にかかっていましたが、検証をしてみると、毎回ではないことが分かりました。

▼考えうる要因

  • Unityのバージョン : できるだけ最新の状態に更新しているため検証時と異なっています
  • コードの変更量 : 実際の開発時には数行の変更ではない

比較

これだけでは記事として面白くないので、シンプルな開発環境でどのような結果になるかを比較しました。
比較の環境は以下のようなものです。

シーン構成

3DのシーンにCubeを一つ配置し、そこにオブジェクトを回転させるコンポーネントを付けます。

TurnObject.cs

コンポーネントは以下のようなスクリプトで作成されています。

using System;
using UnityEngine;

/// <summary>GameObjectを回転させるコンポーネント</summary>
public class TurnObject : MonoBehaviour
{
    /// <summary>回転速度(度/秒)</summary>
    private const float _turnSpeed = 90f;

    private void Update()
    {
        //フレームでの回転角度計算
        var turnAngle = Time.deltaTime * _turnSpeed;
        transform.Rotate(0f, turnAngle, 0f);
    }
}

検証では、2回目のビルドの際に「turnSpeed」の値を変更し、実行時に回転速度が変わっていることを確認しています。
turnSpeedはConst化することで、コードのビルドが確実に走っていることを確認しています。

比較項目

実行環境 描画方法
Unity URP
Android Studio 非URP

URP環境はビルドに大幅に時間がかかるため条件に加えました

比較結果

2回目以降のビルドでは、安定してAndroidStudioの方が早く実行できました。
ただ、Unityでエクスポート完了後に自分でAndroidStudioの実行をしなければならないため、 「プロジェクト規模が小さい場合にはメリットがそこまで大きくない」という結果になりました。

その他

IL2CPPのビルド設定を「より速いビルド」にすることで多少の改善も見られました。
デバッグ環境での確認には効果があるなと感じました。

結果

初回のメリットは大きいのですが、2回目以降に関してはそこまで大きなメリットがありませんでした。
これももっとコード量の多いプロジェクトになってくると差が出てくるかもしれません。
※「IL2CPPのビルド設定」以外は最初の検証環境と同等の環境で行っています。
■より速いビルド
■通常時(最初の検証結果と同じもの)

まとめ

AndroidStudioで実行を行うことで、条件によっては早く実行できることもありましたが、毎回安定して高速に実行出来るわけではありませんでした。
Unity実行でそんなに困っていない人は、あえてAndroidStudioで実行するメリットはほとんどありません。

ただ、「実機デバッグに毎回5分以上掛かって困っている」という、同じ悩みを抱える方は一度試してもらえるといいかもしれません。

KENTEMでは、Unityを使ったアプリの開発者を大募集しています!
UnityでXRアプリの開発にご興味ある方は、是非下記のリンクからご応募ください。
hrmos.co