AIゲーム制作ラボ
公開・収益化11分で読めます

UnityのWebビルドを10.1MB→7.4MBにした(−27.3%・2段階の実測)

まず設定2つで 10,143,315 → 7,945,839 バイト。次に未使用パッケージ39件を外して 7,374,207 バイト。合計 −27.3% です。効かなかった施策(スプラッシュ停止)も数字ごと残します。

Libra

公開 2026年9月16日

この記事の要点6 points

  1. 第1弾:設定2つ(Managed Stripping High・IL2CPP サイズ優先)で 10,143,315 → 7,945,839 バイト−21.7%
  2. 第2弾:使っていないパッケージ39件とテンプレの残骸を外して 7,374,207 バイト 合計 −27.3%
  3. 効かなかった施策も測った。 スプラッシュ画面を止めても、ダウンロード量は1バイトも減らなかった。
  4. ビルドレポートで一番大きいアセット(2.8MB)が、圧縮後のサイズにはほぼ影響しないことがある。
  5. Managed Stripping の High は「削りすぎ」が起きうる。 ビルド後に実機で必ず動作確認する。
  6. 結果として起動は 約705ms約569ms−19%になった(別記事で計測)。

ブロック崩しの 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,8397,374,207(−27.3%)
wasm.br(エンジンとコード)7,333,2806,006,7385,635,795
data.br(アセット)2,689,4771,819,1591,618,640
framework.js.br72,39671,72571,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

数えた結果はこうでした。

種類圧縮前のサイズ割合
Texture2D3,099,47280.0%
Shader426,63211.0%
MonoScript256,2766.6%
ComputeShader67,4281.7%
その他23,5640.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 Logo2,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.br1,819,1591,820,458
合計7,945,8397,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,8397,374,207−571,632(−7.2%)
wasm.br6,006,7385,635,795−370,943(−6.2%)
data.br1,819,1591,618,640−200,519(−11.0%)
ビルド時間5分26秒3分52秒−29%

ビルドレポート側でも、シェーダーが 426,632 → 356,420、スクリプトが 256,276 → 145,760 に減っていました。パッケージが持ち込んでいた分です。

壊れていないかの確認(第2弾)

パッケージを消すのは、設定を変えるより乱暴です。確認はこの順でやりました。

  1. 1

    エディターを開き直す

    コンパイルエラー0・警告0
  2. 2

    EditMode テスト

    44/44 合格
  3. 3

    PlayMode テスト

    5/5 合格(ビルド対象は WebGL のまま)
  4. 4

    ローカルで遊ぶ

    タイトル → 開始 → 発射 → ボールが動くまで
  5. 5

    コンソールを見る

    ブラウザのエラー0
  6. 6

    本番に差し替えて同じ確認

    公開 URL でもう一度

消しすぎていれば、たいていはコンパイルか起動で落ちます。今回は落ちませんでした。

で、どれだけ速くなったのか

測りました。起動が 約705ms約569ms−19%、本番の回線ではダウンロード 0.76秒+起動 0.62秒で遊べます。展開後の wasm が 38.3MB23.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