UnityのWebビルドを10.1MB→7.4MBにした(−27.3%・2段階の実測)
まず設定2つで 10,143,315 → 7,945,839 バイト。次に未使用パッケージ39件を外して 7,374,207 バイト。合計 −27.3% です。効かなかった施策(スプラッシュ停止)も数字ごと残します。
公開 2026年9月16日
この記事の要点6 points
- 第1弾:設定2つ(Managed Stripping High・IL2CPP サイズ優先)で 10,143,315 → 7,945,839 バイト(−21.7%)。
- 第2弾:使っていないパッケージ39件とテンプレの残骸を外して 7,374,207 バイト。 合計 −27.3%。
- 効かなかった施策も測った。 スプラッシュ画面を止めても、ダウンロード量は1バイトも減らなかった。
- ビルドレポートで一番大きいアセット(2.8MB)が、圧縮後のサイズにはほぼ影響しないことがある。
- Managed Stripping の High は「削りすぎ」が起きうる。 ビルド後に実機で必ず動作確認する。
- 結果として起動は 約705ms → 約569ms(−19%)になった(別記事で計測)。
目次11章
検証した環境最終確認 2026年9月16日
- Unity 6.6(6000.6.0f1)
- URP の 2D テンプレート・画像素材なし
- 圧縮は Brotli・Decompression Fallback なし
- Windows 11
書いてあるのは、この環境で実際に試した結果です。ツールの仕様や料金は変わるので、重要な判断の前には公式の情報も確認してください。
ブロック崩しの Web ビルドが約10MB ありました。スマホで開くと重い。
削りにいったところ、設定を2つ変えるだけで 21.7%、さらに使っていないパッケージを外して合計 27.3% 小さくなりました。ビルド時間まで短くなっています。
−27.3%
合計サイズ
10,143,315 → 7,374,207 バイト
−38%
展開後の wasm
38.3MB → 23.7MB
3:52
ビルド時間
最初は 8分33秒
0行
書いたコード
設定と削除だけ
結果(2段階)
| 最初 | 第1弾のあと | 第2弾のあと | |
|---|---|---|---|
| 合計 | 10,143,315 バイト | 7,945,839 | 7,374,207(−27.3%) |
wasm.br(エンジンとコード) | 7,333,280 | 6,006,738 | 5,635,795 |
data.br(アセット) | 2,689,477 | 1,819,159 | 1,618,640 |
framework.js.br | 72,396 | 71,725 | 71,551 |
| ビルド時間 | 8分33秒 | 5分26秒 | 3分52秒 |
- 最初10,143,315 バイト
- 第1弾7,945,839 バイト
- 第2弾7,374,207 バイト
圧縮(Brotli)後のサイズ。ブラウザが実際にダウンロードする量です。
第1弾は設定を2つ変えただけ。第2弾は使っていないものを外しただけです。コードは1行も書いていません。
変えた設定は2つだけ
1. Managed Stripping Level:Minimal → High
C# のコードのうち、使っていない部分を削る強さです。Minimal は最小限しか削りません。High にすると、到達しないコードをかなり積極的に削ります。
これが wasm.br に効きました。
2. IL2CPP Code Generation:速度優先 → サイズ優先
IL2CPP が C# を C++ に変換するときの方針です。既定は実行速度を優先しますが、サイズ優先に切り替えられます。
ブロック崩し程度の処理では、速度の差を体感できませんでした。60fps は維持しています。
変えなかった設定と、その理由
| 設定 | 判断 |
|---|---|
| 例外サポート(Explicitly Thrown → None) | 変えない。 さらに小さくなるが、try / catch が効かなくなり、障害の原因を追えなくなる |
| Decompression Fallback | 無効のまま。 サーバー側で Content-Encoding を返せるので不要。有効にするとコードが増える |
| 圧縮形式 | Brotli のまま。 gzip より小さい |
| デバッグシンボル | Off のまま(もともと Off) |
| Strip Engine Code | 有効のまま(もともと有効) |
削ったあとが本番:壊れていないかを確認する
Managed Stripping の High には副作用があります。使っていないと判断されたコードが削られるので、リフレクション経由で呼んでいる処理や、JsonUtility、Addressables から参照している型が消えることがあります。
やっかいなのは、エディターでは動くのにビルドしたものだけ壊れる点です。自動テストも通ってしまいます。
なので、ビルド後は必ずブラウザで確認しました。
ビルド後にブラウザで見ること
今回はすべて問題なしでした。もし壊れていたら、link.xml で「この型は残す」と指定して作り直すことになります。
ついでに直したこと
ブラウザのタブに Unity Web Player | breakout と出ていました。Player Settings の Product Name が既定のままだったからです。ゲーム名と運営名を設定して、ブロック崩し に変わりました。
小さいことですが、共有されたときに目に入る場所です。
第2弾:何が入っているかを数えてから削る(2026-09-16 追記)
7.9MB のうち何がどれだけ占めているのか。当てずっぽうで設定をいじる前に、ビルドレポートを数えました。
Unity は毎回 Library/LastBuild.buildreport にビルドの内訳を残しています。これを読むと、アセット1つずつのサイズが出ます。
UnityEditor.AssetDatabase.LoadAssetAtPath<UnityEditor.Build.Reporting.BuildReport>(path)
→ report.packedAssets[].contents[] に packedSize と sourceAssetPath
数えた結果はこうでした。
| 種類 | 圧縮前のサイズ | 割合 |
|---|---|---|
| Texture2D | 3,099,472 | 80.0% |
| Shader | 426,632 | 11.0% |
| MonoScript | 256,276 | 6.6% |
| ComputeShader | 67,428 | 1.7% |
| その他 | 23,564 | 0.6% |
| 合計 | 3,873,372 |
- Unity のロゴ(スプラッシュ画面)2,796,376
- シェーダー426,632
- URP の SMAA 用テクスチャ268,920
- スクリプト256,276
- コンピュートシェーダー67,428
ロゴ1枚が飛び抜けている。ただしこれは圧縮前の数字です(次の節)。
そして Texture2D の中身の内訳が、これです。
| アセット | サイズ |
|---|---|
| Built-in Texture2D: Splash Screen Unity Logo | 2,796,376 |
| URP の SMAA 用テクスチャ(AreaTex.tga) | 268,920 |
| URP のデバッグ用フォント | 16,508 |
Unity のロゴ1枚で、アセット全体の72%。
2Dのブロック崩しに画像素材は1つも入れていないので、入っているのはテンプレートとエンジンのものだけです。
効かなかった:スプラッシュ画面の停止
Unity 6 では Personal でもスプラッシュ画面を止められます。手元で確かめました。
UnityEditor.PlayerSettings.SplashScreen.show = false;
止めてビルドし直した結果がこれです。
| 止める前 | 止めたあと | |
|---|---|---|
data.br | 1,819,159 | 1,820,458 |
| 合計 | 7,945,839 | 7,947,158 |
1バイトも減っていない。むしろ 1,319 バイト増えた。
理由は単純で、ロゴのような画像は Brotli でほとんど消えるからです。ビルドレポートが出すのは圧縮前のサイズなので、「大きい順に並べて上から潰す」をやると、こういう空振りをします。
なお、スプラッシュ自体はそのまま止めています。サイズではなく、起動してから遊べるまでの時間が短くなるためです。
効いた:使っていないパッケージを外す
残るのは wasm(コード)とシェーダーです。ここに効くのは、そもそもプロジェクトに入れているものを減らすことでした。
Packages/manifest.json を開くと、テンプレートが入れた依存が 55件ありました。2Dのブロック崩しに必要ないものが並んでいます。
外したのは 39件です。
| 外したもの | 例 |
|---|---|
| 2D 系のインポーター・ツール | Aseprite / PSD Importer / SpriteShape / Tilemap Extras |
| 使っていない機能パッケージ | Timeline / Visual Scripting / バージョン管理 / チュートリアル基盤 |
| 3D 向けのモジュール | 物理(3D)/ 地形 / 布 / 車両 / 風 / ナビメッシュ |
| 使っていない表現のモジュール | パーティクル / 動画 / XR / ベクターグラフィックス |
| その他 | アナリティクス / アセットバンドル / 画面キャプチャ / Android JNI |
残したのは16件だけ。URP・Input System・uGUI・2D 物理・オーディオ・Test Framework・CLI の Pipeline などです。
あわせて、テンプレートが置いていった Assets/Welcome(チュートリアル用の画面)とサンプルシーン2つも消しました。
結果
| 外す前 | 外したあと | 差 | |
|---|---|---|---|
| 合計 | 7,945,839 | 7,374,207 | −571,632(−7.2%) |
wasm.br | 6,006,738 | 5,635,795 | −370,943(−6.2%) |
data.br | 1,819,159 | 1,618,640 | −200,519(−11.0%) |
| ビルド時間 | 5分26秒 | 3分52秒 | −29% |
ビルドレポート側でも、シェーダーが 426,632 → 356,420、スクリプトが 256,276 → 145,760 に減っていました。パッケージが持ち込んでいた分です。
壊れていないかの確認(第2弾)
パッケージを消すのは、設定を変えるより乱暴です。確認はこの順でやりました。
- 1
エディターを開き直す
コンパイルエラー0・警告0 - 2
EditMode テスト
44/44 合格 - 3
PlayMode テスト
5/5 合格(ビルド対象は WebGL のまま) - 4
ローカルで遊ぶ
タイトル → 開始 → 発射 → ボールが動くまで - 5
コンソールを見る
ブラウザのエラー0 - 6
本番に差し替えて同じ確認
公開 URL でもう一度
消しすぎていれば、たいていはコンパイルか起動で落ちます。今回は落ちませんでした。
で、どれだけ速くなったのか
測りました。起動が 約705ms → 約569ms(−19%)、本番の回線ではダウンロード 0.76秒+起動 0.62秒で遊べます。展開後の wasm が 38.3MB → 23.7MB(−38%)と、ダウンロード量より大きく減っていたのが効いています。
計測の方法とつまずいた点はUnityのWebゲームの読み込み時間を測るにまとめました。
次に残っている手
- URP のシェーダーを減らす:地形や草の揺れ、テモポラル AA、レンズフレアのシェーダーがまだ入っています。パッケージを外しても URP 本体が持っているので、
IPreprocessShadersで名前ごと落とす必要があります - 例外サポートを None にする:数十KB。障害調査とのトレードオフなので保留
- スマホ実機での fps:PC(60Hz)では 60.1fps で上限に張り付いている。余裕の量は低性能の端末で測る
ここまでで 10,143,315 → 7,374,207 バイト(−27.3%)。コードは1行も書いていません。
ビルドしたものを自分のサーバーで配る手順はUnityのWebゲームを自前サーバーで公開するに、ビルドを AI に回させる手順はAIにUnityのテスト・動作確認・ビルドまで回させる手順にあります。実物はブロック崩しのページから遊べます。
FAQ
よくある質問
Managed Stripping を High にすると何が危ないですか?
使っていないと判断されたコードが削られるため、リフレクションで呼び出しているコードや JsonUtility、Addressables 経由で参照している型が消えることがあります。エディターでは動くのにビルド後だけ壊れるのが厄介な点です。壊れた場合は link.xml で保持する型を指定します。今回のブロック崩しでは問題は起きませんでした。
例外サポートを切ればもっと小さくなりますか?
小さくなりますが、今回は変えていません。try / catch が効かなくなり、例外が出たときに原因が追えなくなるためです。数十KB のために障害調査を難しくする取引だと判断しました。
Decompression Fallback は有効にすべきですか?
サーバーで Content-Encoding を返せるなら不要です。有効にするとフォールバック用のコードが増え、読み込みも遅くなります。ヘッダーを設定できない共有サーバーに置く場合だけ有効にしてください。
使っていないパッケージを消すと何が減りますか?
主に wasm(コード)です。今回は 6,006,738 → 5,635,795 バイトで、6.2% 減りました。アセット側(data)も、パッケージが持ち込んでいたシェーダーとスクリプトの分だけ 11.0% 減っています。
スプラッシュ画面を止めれば軽くなりますか?
軽くなりませんでした。ビルドレポート上は Unity のロゴ画像が 2,796,376 バイトで、アセット全体の72%を占めています。ところが止めても圧縮後のサイズは変わりませんでした(むしろ 1,319 バイト増えた)。ロゴのような画像は Brotli でほぼ消えるからです。起動が速くなる効果はあるので、設定自体は止めたままにしています。
Unity Personal でもスプラッシュを消せますか?
Unity 6 では消せました。この環境(Unity 6.6・Personal)で PlayerSettings.SplashScreen.show を false にでき、ブラウザで開いてもロゴは出ませんでした。
どのパッケージを消していいか、どう判断しましたか?
題材が2Dのブロック崩しで、画像も音も外部通信も使っていないことが分かっていたので、3D 物理・地形・パーティクル・動画・XR・Timeline・Visual Scripting などを外しました。判断が正しいかはテストとブラウザでの動作確認で見ます。消しすぎればコンパイルか実行で落ちます。
この記事は役に立ちましたか?
NEXT
あわせて読む
UnityのWebゲームを自前サーバーで公開する(Caddyの設定と実測)
Unity の WebGL ビルドを自分のサーバーで配信するときに必要な設定を実測で残します。.br に Content-Encoding と application/wasm を付ける、末尾スラッシュの 308、前段の圧縮との二重がけ、アップロードと反映にかかった時間。
AIにUnityのテスト・動作確認・ビルドまで回させる手順
Unity CLI の run_tests / editor_play / capture_game_view / build を使って、人が画面を触らずにテストと動作確認とWebGLビルドを回した手順を、実際のコマンドと所要時間つきで残します。
UnityのWebゲームの読み込み時間を測る(軽量化の前後で比較)
ダウンロード 0.76秒、起動 0.6秒、プレイ中 60.1fps。10.1MB 版と 7.37MB 版を同じ条件で比べたら起動が19%速くなりました。計測用ページの作り方と、圧縮を外したあとのサイズという見落としがちな数字、そして fps の計測でつまずいた話です。