シーンごとにビルド結果の容量を出す

ビルドするとEditor.logにどのアセットがどのくらいの容量使っているかが出力されます。
ただこのログファイルは長く、該当の容量が記載されている箇所を見つけるのは毎回面倒くさいです。
そこで、ログファイルの該当箇所だけを抽出したいです。
また、シーン別々にビルドしてどのシーンが容量を食っているのかもわかるようにしたいと思います。

というわけでエディタ拡張を作りました。
出力先のパス(outputPath)だけ変えてください。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEngine;

public class BuildScenes {

//出力先パス
static string outputPath = @"C:/work/sandbox/buildAllScenes/";

//メニューの BuildにBuild Scenesコマンドを追加
[MenuItem("Build/Build Scenes")]
public static void Build() {
Debug.Log(outputPath);
if (!Directory.Exists(outputPath)) {
Directory.CreateDirectory(outputPath);
}

var scenes = GetScenes();
BuildTarget target;
#if UNITY_EDITOR_WIN
target = BuildTarget.StandaloneWindows;
#else
target = BuildTarget.StandaloneOSXIntel;
#endif
for (var i = 0; i < scenes.Length; i++) {
var name = GetSceneName(scenes[i]);
string errorMessage = BuildPipeline.BuildPlayer(
new string[] { scenes[i] },
outputPath + name + ".exe", // 出力先
target, // ビルド対象プラットフォーム
BuildOptions.Development // ビルドオプション
);
Debug.Log(i + ":build " + name);
var log = AnalyzeLog();
StreamWriter writer = new StreamWriter(outputPath + name + ".log");
writer.WriteLine(log);
writer.Close();
}
}

//シーンのパスからシーン名だけを取得する
static string GetSceneName(string path) {
var a = path.LastIndexOf("/");
var b = path.LastIndexOf(".");
return path.Substring(a + 1, b - a - 1);
}

//ビルド対象のシーン一覧を取得する
static string[] GetScenes() {
List<string> sceneList = new List<string>();

EditorBuildSettingsScene[] scenes = EditorBuildSettings.scenes;
foreach (EditorBuildSettingsScene scene in scenes) {
sceneList.Add(scene.path);
}
return sceneList.ToArray();
}

//ログファイルを解析し、容量部分だけを抽出する
public static string AnalyzeLog() {
string logPath;
#if UNITY_EDITOR_WIN
logPath = @"C:\Users\" + Environment.UserName + @"\AppData\Local\Unity\Editor\Editor.log";
#else
logPath = "~/Library/Logs/Unity/Editor.log";
#endif
FileStream fs = new FileStream(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader sr = new StreamReader(fs);
string text = sr.ReadToEnd();
sr.Close();
fs.Close();
var matches = new Regex(@"Build Report\s[\s\S]*?-------------------").Matches(text);
if (matches.Count <= 0) {
Debug.LogError("No Log");
return null;
}
return matches[matches.Count - 1].ToString();

}

}

実行すると出力先のフォルダにこんな感じでexeと.logファイルが出力されます。

block

logの中身はこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Build Report
Uncompressed usage by category:
Textures 6.9 mb 14.1%
Meshes 0.0 kb 0.0%
Animations 0.0 kb 0.0%
Sounds 197.5 kb 0.4%
Shaders 5.0 mb 10.2%
Other Assets 520.2 kb 1.0%
Levels 5.5 kb 0.0%
Scripts 2.7 mb 5.5%
Included DLLs 3.9 mb 8.0%
File headers 47.8 kb 0.1%
Complete size 49.0 mb 100.0%

Used Assets and files from the Resources folder, sorted by uncompressed size:
4.5 mb 9.1% Assets/Mech/PostProcessing/Resources/Shaders/Uber.shader
3.1 mb 6.4% Assets/Fungus/Textures/DialogBoxSliced.png
2.2 mb 4.5% Assets/Fungus/Resources/Sprites/Background.png

使用バージョン

Unity 5.6.4f1
Windowsでのみ確認

Unityカテゴリの記事
History Inspectorの紹介
敵AIとビジュアルスクリプティング
Chronosを使った感想
コンポーネントの順番をスクリプトから並び替える
Smart Inspectorの紹介
Kris' Favorite Assets が便利
キー操作でUIのナビゲーションをループさせる
TextMeshProのSprite Assetを更新する
UnityPhysicsDebugDraw2D が便利
色管理を考える
細かいTips
ビルドスクリプトを書く
AnimatorのCulling Modeでハマった話
Vectrosityを使ってUGUI上で線や円のアニメーションをする
スプレッドシートからjsonデータを読み込む
ビジュアルノベルアセットFungusにコマンドを追加してカスタマイズする
Skinned Mesh Renderer の Boundsについて
シーンビューにクオリティ設定のスライダーを出すエディタ拡張
ビルド結果のFile headersが大きい理由
フリーのビジュアルノベルアセットFungusを使ってRPGのイベントを作る
Move To View を改良する
フリーのビジュアルノベルアセットのFungusが便利
Visual Studio で保存時にフォーマットする
スプレッドシートからデータを読み込む
Easy Save2 で シリアライズされたクラスを保存する
ShaderでSpriteの色相をシフトする
Sprite、Texture の 色相をシフトする
uGUIのButtonをクリック時にハイライトのままになる
uGUIのCanvas Groupを使って透過処理をしたり、操作を制限する
自作のコンフィグ画面に必要なもの
uGUIでトグルなボタンを作る
uGUI で動的にボタンを作る
Easy Save2 を使ってみる
csv読み込んで ローカライズ
LoadLevelAdditive で共通シーンを加算
画面全体に色をかける
Any State でどこからでも遷移できるようにする
iTween のStop ではまる
sprite の multiple で 境界がおかしくなる
2D画面に線を引く Line Renderer
Renderer の Materials を スクリプトから設定する
背景をスクロールさせる