LoginSignup
1
1

More than 5 years have passed since last update.

UnityCloudBuild上で無理やり圧縮オプションをLZ4に変更する事が出来るか!?

Last updated at Posted at 2018-06-08

ネタバレ

出来ない!!!Unityつらい!!!

試したこと

Unity 2017.X + Android で異常にファイルロードが遅い場合の解決法
https://qiita.com/warapuri/items/9b705f09627ea15b3b6b

にあるように、Unity2017.x系でAndroidビルドはLZ4圧縮してビルドしないとファイルロードがめちゃくちゃ重い場合があります。

しかし、このビルド時の圧縮オプションは2018年6月現在ではUnityEditor上からしか操作できないので、UnityCloudBuildを使っているとAndroid版だけファイルロードがめちゃくちゃ遅いapkになってしまいます。issueも上がっていますが、何とかしたいですね。
参考: https://forum.unity.com/threads/support-buildoptions-compresswithlz4.487368/

これはとても困るので、PreProccessBuild内でリフレクションを使って非公開APIを叩くことで実現します。こんな感じです。


public class Preprocess  : IPreprocessBuild {

    // ビルド前処理
    public void OnPreprocessBuild (UnityEditor.BuildTarget buildTarget, string path)
    {
        if (buildTarget == BuildTarget.Android)
        {
            Debug.Log("[PREPROCESS] find Android Build");
            Console.WriteLine("[PREPROCESS] find Android Build");
            //https://github.com/Unity-Technologies/UnityCsReference/blob/master/Editor/Mono/BuildPlayerWindow.cs#L770
            MethodInfo setCompressionTypeMethodInfo =
                typeof(EditorUserBuildSettings).GetMethod("SetCompressionType",
                    BindingFlags.NonPublic | BindingFlags.Static);

            try
            {
                /* Invokeで実行するとき、staticクラスだったら第一引数はnull
                * 第二引数は普通にpublicなenum でplatform
                * 第三引数が内部定義されたenumなので、該当のint数値を直接突っ込んでいます
                */

                /* 第三引数はこんな感じで定義されています
                namespace UnityEditor
                {
                  internal enum Compression
                  {
                    None = 0,
                    Lz4 = 2,
                    Lz4HC = 3,
                  }
                }
                 */                
                var invoke = setCompressionTypeMethodInfo.Invoke(null, new object[] {BuildTargetGroup.Android, 2});
            }
            catch (Exception e)
            {
                Debug.Log(e);
                Console.WriteLine(e);
                throw;
            }

            MethodInfo getCompressionTypeMethodInfo =
                typeof(EditorUserBuildSettings).GetMethod("GetCompressionType",
                    BindingFlags.NonPublic | BindingFlags.Static);


            var obj = getCompressionTypeMethodInfo.Invoke(null, new object[] {BuildTargetGroup.Android});
            Debug.Log("[REPROCESS] current compression type:" + obj);
            Console.WriteLine("[PREPROCESS] current compression type:" + obj);
        }
    }

    // 実行順
    public int callbackOrder { get {    return 0; } }
}

これでUnityCloudBuildのログを見てみると無事Lz4形式になっていることが確認できます!!!勝った!!!!

と思ったら、このEditorUserBuildSettings.SetCompressionType()でセット出来る値はビルドが始まる前にUnityEditorが読み出しているので、ビルドプロセス前に変更しないとダメです。

PreProcessBuildより前に読みだされています。

追試方法

普通のPC上でUnityEditorのCompressionTypeをDefaultにセットしてから、このリフレクションを使った処理を呼ぶ→UnityEditor上の表示ではCompressionTypeがLZ4に書き換わっています。
しかしビルドしたapkは元の通りロードが遅いままです。

結論

つ、つらい…

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1