ネタバレ
出来ない!!!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は元の通りロードが遅いままです。
結論
つ、つらい…