Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

ネタバレ

出来ない!!!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は元の通りロードが遅いままです。

結論

つ、つらい…

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away