Unity Perf Audit について
Unity Perf Audit は、Unity プロジェクトの C# スクリプトを静的に調べ、CPU、GPU、メモリのパフォーマンス上のアンチパターンを検出するスキルです。ゲームの実行や外部パッケージを必要とせず、重大度、ファイルと行番号、優先修正案をまとめます。
主な機能
- 01C# ファイルとプロジェクト構成の一覧化
- 02CPU、GPU、メモリのパターン検査
- 03重大度に基づく問題の順位付け
- 04ファイルと行番号の特定
- 05優先修正案と変更前後のコード
活用シーン
- 01ビルド前の Unity プロジェクト監査
- 02報告された低フレームレートの調査
- 03スタッターやメモリ増加に絞った検査
- 04描画関連のパフォーマンスパターン確認
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ juliankerignard/ unity-skills --skill unity-perf-auditインストール後、Claude Code で/unity-perf-auditを入力して読み込まれたか確認します。
同梱ファイルreferences/anti-patterns.md
詳細
Unity Perf Audit
このスキルでできること
Unity プロジェクトの C# コードを静的解析し、パフォーマンスのアンチパターンを検出します。ゲームの実行やプロファイリングは不要です。Grep と Glob でソースコードをスキャンします。
出力内容:
- プロジェクト内の C# ファイルの一覧(件数、サイズ、大きなファイル)
- 検出したアンチパターンのレポート(深刻度と場所を含む)
- 優先度の高い修正案 5 件(修正前/修正後のコード付き)
前提条件
Assets/に C# スクリプトがある Unity プロジェクト- プロジェクトフォルダーへの読み取りアクセス
- パッケージや外部ツールは不要
判断フロー
Symptome rapporte ?
|
+-- FPS bas en general --> Lancer le scan complet (etapes 1-5)
+-- Spikes ponctuels / stuttering --> Focus CPU (anti-patterns C1-C12)
+-- Memoire qui grimpe / crashs OOM --> Focus Memory (anti-patterns M1-M7)
+-- Rendu lent, draw calls hauts --> Focus GPU (anti-patterns G1-G5)
+-- Pas de symptome precis (audit preventif) --> Scan complet
クイックスタート
- プロジェクトの構造をスキャンする(Glob
**/*.cs) - CPU、GPU、メモリのアンチパターンを検出する(Grep)
- 各問題をスコアリングして分類する
- ファイル名と行番号を含むレポートを作成する
- 優先度の高い修正案を 5 件提示する
ステップごとのガイド
ステップ 1:プロジェクトの構造をスキャンする
Glob を使って、プロジェクト内の C# ファイルをすべて一覧にします。
Glob: Assets/**/*.cs
分析項目:
.csファイルの総数- 500 行を超えるファイルを特定する(Read で行数を数えるか、
wc -lを使用) - スクリプトが最も多いフォルダーを特定する(プロジェクトの構造)
- 分析対象から
Plugins/、ThirdParty/、TextMesh Pro/フォルダーを除外する(外部コード)
すべてのファイルの行数を数える Bash コマンド:
find <project>/Assets -name "*.cs" -not -path "*/Plugins/*" -not -path "*/ThirdParty/*" -not -path "*/TextMesh Pro/*" | xargs wc -l | sort -rn | head -20
概要を作成します:
## Structure projet
- **Fichiers C#** : 47
- **Lignes totales** : 12,340
- **Fichiers > 500 lignes** : PlayerManager.cs (623), GameController.cs (891)
- **Dossiers principaux** : Scripts/ (28), UI/ (12), Enemies/ (7)
ステップ 2:アンチパターンを検出する
C# ファイルをスキャンして、CPU、GPU、メモリのアンチパターンを検出します。検出対象のパターンの完全な一覧については、references/anti-patterns.md を参照してください。
検出した項目ごとに、ファイル、行番号、コード行を記録します。除外対象を除く、プロジェクト内のすべての .cs ファイルに対して Grep 検索を実行します。
ステップ 3:スコアリングして分類する
ファイルごと、および全体のスコアを付けます。
| 深刻度 | ポイント | 影響 |
|---|---|---|
| 致命的 | 10 | 目に見えるラグを直接引き起こす(毎フレーム) |
| 高 | 5 | 高負荷時に大幅なパフォーマンス低下を引き起こす |
| 中 | 2 | プロファイラーで測定可能な影響がある |
| 低 | 1 | ベストプラクティス。影響は最小限 |
全体スコア:
- 0-10:問題なし。対応は不要です。
- 11-30:許容範囲です。いくつかの問題を修正してください。
- 31-60:問題があります。ビルド前の修正を推奨します。
- 61+:重大です。修正が必須です。
コード内で実際に見つかった問題のみをスコアリングします。仮定上の問題を決して作り出さないでください。
ステップ 4:レポートを作成する
レポートの形式:#、Probleme、Severite、Fichier:Ligne、Description の列を含む表。深刻度の高い順(致命的 > 高 > 中 > 低)にグループ化します。深刻度ごとの概要(件数 + スコア)を追加します。判定(問題なし/許容範囲/問題あり/重大)と全体スコアを含めます。
ステップ 5:優先度の高い修正案を 5 件提示する
修正案ごとに、修正前と修正後のコードを示します。深刻度の高い問題から順に選びます(まずは致命的な問題)。形式:タイトル、深刻度、行番号、影響、修正前/修正後のコード。
一般的な修正パターン:
| アンチパターン | 標準的な修正方法 |
|---|---|
| Update 内の GetComponent | Awake でプライベートフィールドにキャッシュする |
| 実行時の Find | Awake でキャッシュするか、SerializeField 経由で注入する |
| Update 内の Camera.main | private Camera _cam; void Awake() => _cam = Camera.main; |
| Update 内の文字列連結 | StringBuilder または string.Format を使うか、ログを削除する |
| Update 内の Instantiate | オブジェクトプーリング(Queue + 有効化/無効化)を使う |
| Update 内の foreach | List<T> を使った for ループにする |
| SendMessage | 直接インターフェースまたは C# イベントを使う |
| .tag == | .CompareTag("name") にする |
| new WaitForSeconds の繰り返し | static readonly WaitForSeconds としてキャッシュする |
| イベントの購読解除漏れ | OnDisable() または OnDestroy() に -= を追加する |
| Unload のない Resources.Load | 使用後に Resources.UnloadUnusedAssets() を追加するか、Addressables に移行する |
厳格なルール
必ず守ること:
- 実際のコードで見つかった問題のみ報告する(推測はしない)
- 各問題について、ファイルと正確な行番号を示す
- コードの修正例を修正前・修正後で具体的に提示する
- 影響度の高い順に優先順位を付ける(Critical を最初にする)
- サードパーティーのコード(Plugins/, ThirdParty/, TextMesh Pro/)は対象外にする
- コンテキストを確認する:
Start()内のGetComponentは許容されますが、Update()内では問題です
絶対にしてはいけないこと:
- 一度しか実行されないコード(Start、Awake、OnEnable の初回実行、ローディング画面)の最適化を提案する
- コードに存在しない問題をでっち上げる
- 大規模なリファクタリングを勧める(ホットパスを修正し、アーキテクチャには手を加えない)
- 外部ツールや有料パッケージを提案する
- ホットパス外の固定コレクションに対する
foreachを問題として報告する - 誤検出を無視する:問題のあるコンテキストで該当パターンが使われていることを確認してから報告する
関連スキル
- 特定のパフォーマンスバグ(クラッシュ、一時的なフリーズ)を診断しますか?
/unity-debug(Unity Debug)を使用します - 検出された問題を構造的なリファクタリングで修正しますか?
/unity-refactor(Unity Refactor)を使用します - 修正後にテストしますか?
/unity-test(Unity Test)を使用します
トラブルシューティング
| 問題 | 解決策 |
|---|---|
GetComponent の誤検出が多すぎる | 外側のメソッドを確認します。Awake/Start/OnEnable 内の GetComponent は問題ありません。Grep で -B 20 を使い、コンテキストを確認します。 |
| コメント内でパターンが検出される | // で始まる行、または /* */ ブロック内の行を除外します。ファイルを読んで確認します。 |
| ファイルが大きすぎて分析できない | offset/limit を指定してセクションごとに読みます。Update、FixedUpdate、LateUpdate メソッドに注目します。 |
| プロジェクトに Assets/ フォルダーがない | プロジェクトのパスを確認します。Unity プロジェクトのルートを確認するようユーザーに依頼します。 |
| プロトタイプのスコアが非常に高い | 状況を考慮します。プロトタイプに高度な最適化は必要ありません。問題点には触れつつ、緊急度を下げます。 |
| 無効化されたコードにアンチパターンがある | #if/[System.Obsolete]/デッドコードを示すコメントがないか確認します。デッドコードは報告しません。 |
| .cs ファイルが見つからない | プロジェクトが空か、スクリプトがパッケージ内にある可能性があります。フォルダーのフィルターを付けずに Glob **/*.cs で確認します。 |
| イベントリークの誤検出 | パターンを確認します。+= が OnEnable にあり、-= が OnDisable にあれば問題ありません。匿名ラムダ(登録解除できません)も確認します。 |
アンチパターンの完全な一覧については、references/anti-patterns.md を参照してください。