【Unity×AI】uloop でシーンを一括監査する — Missing Script や重いメッシュを一発で洗い出す

こんにちは、saba です。

uloop シリーズ第 3 弾。今回はシーンの一括監査です。

「Missing Script が紛れてないか」「やたら重いメッシュが置かれてないか」——こういうのを目視で探すのは苦行です。execute-dynamic-code ならシーン全体を C# で走査して、レポートを 1 コマンドで受け取れます。実際に動かした結果つきで紹介します。

基本: シーンを丸ごとスキャンする

Unity API の FindObjectsByType でシーン内の全オブジェクトを取り、気になる項目を集計して文字列で返すだけです。

uloop execute-dynamic-code --code 'using UnityEngine; using System.Text; \
  var sb = new StringBuilder(); \
  var all = UnityEngine.Object.FindObjectsByType<GameObject>(FindObjectsSortMode.None); \
  int missing = 0; \
  foreach (var go in all) { \
    foreach (var c in go.GetComponents<Component>()) if (c == null) missing++; \
  } \
  var filters = UnityEngine.Object.FindObjectsByType<MeshFilter>(FindObjectsSortMode.None); \
  long verts = 0; string heaviest = "none"; int hv = 0; \
  foreach (var f in filters) if (f.sharedMesh != null) { \
    verts += f.sharedMesh.vertexCount; \
    if (f.sharedMesh.vertexCount > hv) { hv = f.sharedMesh.vertexCount; heaviest = f.gameObject.name; } \
  } \
  return $"総GameObject: {all.Length}, MissingScript: {missing}, 合計頂点: {verts}, 最重メッシュ: {heaviest}({hv}v)";'

実測の返り値がこちら(テスト用のまっさらなシーンなので数字は小さいです)。

{ "Result": "総GameObject: 4, MissingScript: 0, 合計頂点: 24, 最重メッシュ: SabaCube(24v)" }

監査結果の実出力

MissingScript の判定は「GetComponents<Component>() の中に null が混じっているか」で見ています。コンポーネントが null = スクリプトが解決できていない(Missing)状態です。

ちなみに 最重メッシュ: SabaCube は、第1回で私がコマンドから生成した Cube です。生成 → 監査で検出、と一連の流れがコマンドだけで回っているのがわかると思います。

実戦での監査項目

実プロジェクトでは、走査するコードに項目を足していくだけで健康診断が育ちます。たとえば:

  • 無効化されっぱなしのオブジェクト!go.activeInHierarchy の数
  • 巨大テクスチャTexture2D を走査して width * height が閾値超えのものを列挙
  • 命名規則違反 — 名前が GameObject (1) のような未リネームのもの
  • 重複タグ / 参照切れ — 特定コンポーネントの null フィールド

「シーンを開いて Hierarchy を上から眺める」作業が、再現可能なコマンドになるのが大きいです。CI 的に「監査コマンドを流して Missing が 0 でなければ落とす」といった運用にもつなげられます。

AI に監査を任せる

そして例によって、これを Claude Code に投げると強力です。

「このシーン、重そうなメッシュと Missing Script がないか監査して。見つかったら一覧で出して」

AI が監査コードを組み立てて execute-dynamic-code で走らせ、結果を読んで問題があれば修正コードまで書く——「調べる」と「直す」が地続きになります。人間は一覧を見て取捨選択するだけ。

一度に大量のオブジェクトを文字列連結でレポートすると、返り値が膨れて読みにくくなります。件数が多いときは「上位 N 件だけ返す」「ファイルに書き出す(※ファイル書き込みは FullAccess が必要)」など、出力を絞る工夫をしましょう。

まとめ

  • FindObjectsByType + 集計を execute-dynamic-code に渡せば、シーンの健康診断が 1 コマンドになる
  • Missing Script・頂点数・重いメッシュなど、目視だと面倒な項目を確実に拾える
  • 監査コードは項目を足して育てられ、再現可能なので運用にも乗せやすい
  • AI に任せれば「監査 → 修正」まで自走する

3 回にわたって uloop CLI を紹介してきました。「ターミナルから Unity を触れる」だけで、計測も監査も最適化も AI との共同作業になる——これが uloop のいちばんの魅力だと思います。Unity × AI、ぜひ試してみてください。

ではでは!