unity-cleaner について
unity-cleaner は、Unity プロジェクトのアセットを監査・整理するスキルセットです。未使用や重複などのアセットを探し、依存関係や参照を調べられます。削除操作には確認手順があります。
主な機能
- 01未使用アセットと重複ファイルの検出
- 02欠落した参照とスクリプトの特定
- 03アセット使用状況と依存ツリーの確認
- 04空フォルダーと大容量アセットの一覧
- 05確認トークンによるアセット削除
活用シーン
- 01リリース前の Unity プロジェクト監査
- 02未使用・重複アセットの調査
- 03アセットの依存関係と参照の追跡
- 04欠落したスクリプトコンポーネントの除去
MCP 対応
スキルモジュールとして、MCP ワークフローに Unity アセットの検索、分析、整理操作を提供します。一部の削除操作には安全制限と確認手順があります。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ besty0728/ unity-skills --skill unity-cleanerインストール後、Claude Code で/unity-cleanerを入力して読み込まれたか確認します。
詳細
このモジュールのスキルを呼び出す前に: 名前や説明から推測したパラメーターを使ってスキルを呼び出そうとしている場合は、いったん停止してください。まずこのファイルを読むか、
GET /skills/recommend?includeSchema=trueでスキーマを取得してください。recommend/schema からすでにパラメーター定義を取得している場合は、そのまま dryRun に進めます。
トリガー
- プロジェクトの肥大化を抑える
- 重複または孤立したアセットを探す
- リリース前の監査
- プロジェクトの軽量化、重複または孤立したアセットの調査、リリース前の監査
Unity Cleaner スキル
安全性:
cleaner_delete_assetsは2段階の confirmToken ハンドシェイクを使用します。プレビューするにはconfirmTokenを指定せずに呼び出し、実際に削除するには返されたトークン(有効期間5分)を指定して再度呼び出します。dryRunパラメーターはありません。
ガードレール
動作モード(v1.9の3段階):
- Approval(デフォルト):すべての分析/クエリスキル(
cleaner_find_unused_assets、cleaner_find_duplicates、cleaner_find_missing_references、cleaner_get_asset_usage、cleaner_find_empty_folders、cleaner_find_large_assets、cleaner_get_dependency_tree)は SemiAuto です。直接実行できます。 - Auto/Bypass:SemiAuto と FullAuto は直接実行できます。
- このモジュールで Auto が禁止されているスキル:
cleaner_delete_assets、cleaner_delete_empty_folders(どちらもSkillOperation.Deleteを伴います)。Approval/Auto ではMODE_FORBIDDENが返されます。これらを実行できるのは Bypass モード、またはユーザー管理の Allowlist エントリーを通じた場合のみです。許可フローでは実行可能になりません。 cleaner_fix_missing_scriptsはExecute | Modify操作です(アセットを削除せず、欠落しているコンポーネント参照をその場で null に置き換えます)。そのため NeverInSemi ゲートの対象にはなりません。Auto/Bypass では直接実行されます。Approval では実行前に標準の許可ハンドシェイクが必要です。cleaner_delete_assetsは、モードゲートで許可されている場合でも、2段階のconfirmTokenハンドシェイクを使用します。まずプレビューし(トークンなし)、次に返されたトークン(有効期間5分)で確定します。
禁止事項(よくある誤認):
cleaner_delete/cleaner_removeは存在しません → cleaner スキルは検索と報告のみを行います。実際に削除するにはasset_deleteを使用してください。cleaner_fixは存在しません → 欠落したスクリプト参照には、cleaner_fix_missing_scriptsを使用してください。cleaner_scan/cleaner_find_unusedは存在しません → 用途に応じて次のスキルを使用してください:cleaner_find_unused_assets、cleaner_find_duplicates、cleaner_find_missing_references、cleaner_find_empty_folders、cleaner_find_large_assets
ルーティング:
- 見つかったアセットを削除するには →
assetモジュールのasset_delete/asset_delete_batchを使用します。 - プロジェクトを検証するには →
validationモジュールを使用します。
スキル一覧
| スキル | 説明 |
|---|---|
cleaner_find_unused_assets | 他から参照されていないアセットを検索 |
cleaner_find_duplicates | コンテンツハッシュで重複ファイルを検索 |
cleaner_find_missing_references | 欠落しているスクリプト/アセット参照を検索 |
cleaner_delete_assets | 2段階の confirmToken でアセットを削除(プレビュー → 確定) |
cleaner_get_asset_usage | 特定のアセットを参照しているものを検索 |
cleaner_find_empty_folders | プロジェクト内の空フォルダーを検索 |
cleaner_find_large_assets | ファイルサイズが大きいアセットを検索 |
cleaner_delete_empty_folders | すべての空フォルダーを削除 |
cleaner_fix_missing_scripts | GameObject から欠落したスクリプトコンポーネントを削除 |
cleaner_get_dependency_tree | アセットの依存関係ツリーを取得 |
スキル
cleaner_find_unused_assets
特定のタイプの未使用と思われるアセットを検索します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
assetType | string | いいえ | "Material" | アセットタイプのフィルター |
searchPath | string | いいえ | "Assets" | 検索パス |
limit | int | いいえ | 100 | 結果の最大数 |
戻り値:{success, assetType, potentiallyUnusedCount, assets: [{path, name, type, sizeBytes}]}
# Find unused materials
result = call_skill("cleaner_find_unused_assets", assetType="Material")
# Find unused textures in a specific folder
result = call_skill("cleaner_find_unused_assets",
assetType="Texture2D", searchPath="Assets/Textures")
cleaner_find_duplicates
MD5 ハッシュで重複ファイルを検索します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
assetType | string | いいえ | "Texture2D" | アセットの種類 |
searchPath | string | いいえ | "Assets" | 検索パス |
limit | int | いいえ | 50 | グループの最大数 |
戻り値: {success, duplicateGroupCount, totalWastedBytes, totalWastedMB, groups: [{count, sizeBytes, wastedBytes, files}], skipped: [{path, reason}]} — skipped には、ハッシュ計算のために読み取れなかったファイルが列挙されます。これにより、グループから黙って除外されることはありません。
# Find duplicate textures
result = call_skill("cleaner_find_duplicates", assetType="Texture2D")
print(f"Wasted space: {result['totalWastedMB']:.2f} MB")
cleaner_find_missing_references
スクリプトが欠落しているコンポーネントや、null の参照を検索します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
includeInactive | bool | いいえ | true | 非アクティブなオブジェクトを含める |
戻り値: {success, issueCount, missingScripts, missingReferences, issues: [{type, gameObject, path, ...}]}
# Scan for all missing references
result = call_skill("cleaner_find_missing_references")
print(f"Missing scripts: {result['missingScripts']}")
print(f"Missing references: {result['missingReferences']}")
cleaner_delete_assets
指定したアセットを2段階の確認で削除します。
⚠️ 安全第一:削除には2回の呼び出しが必要です。最初にプレビューし、その後に確定します。
ステップ1 - プレビュー(confirmToken なし):
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
paths | string[] | いいえ* | 削除するアセットのパス |
*このプレビューステップでは必須です。ステップ2では省略し、confirmToken によってすでに取得されたパスのみを削除します。
戻り値: {success, action: "preview", totalAssets, existingAssets, totalBytes, totalMB, confirmToken, message, expiresIn, assetsToDelete: [{path, exists, sizeBytes, sizeMB}]}
ステップ2 - 確定(confirmToken あり):
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
confirmToken | string | はい | プレビューステップで取得したトークン |
戻り値: {success, action: "deleted", deletedCount, totalMB, message, results: [{path, deleted}]}
# Step 1: Preview what will be deleted
preview = call_skill("cleaner_delete_assets",
paths=["Assets/Unused/mat1.mat", "Assets/Unused/mat2.mat"])
print(preview['message']) # Shows: "⚠️ PREVIEW ONLY - 2 assets will be deleted..."
print(preview['assetsToDelete']) # Full list with sizes
# Step 2: Confirm deletion using token (expires in 5 minutes)
if input("Proceed? (y/n): ") == 'y':
result = call_skill("cleaner_delete_assets",
confirmToken=preview['confirmToken'])
print(result['message']) # "Successfully deleted 2 assets"
cleaner_get_asset_usage
特定のアセットを参照しているオブジェクトを検索します。
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
assetPath | string | はい | アセットのパス |
limit | int | いいえ | 結果の最大数(デフォルトは 50) |
戻り値: {success, asset, usedByCount, usedBy: [{path, name, type}]}
# Check what uses a texture
result = call_skill("cleaner_get_asset_usage",
assetPath="Assets/Textures/player.png")
cleaner_find_empty_folders
プロジェクト内の空のフォルダーを検索します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
searchPath | string | いいえ | "Assets" | 検索パス |
戻り値: { success, count, folders }
# Find empty folders
result = call_skill("cleaner_find_empty_folders")
print(f"Found {result['count']} empty folders")
cleaner_find_large_assets
ファイルサイズが大きいアセットを検索します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
searchPath | string | いいえ | "Assets" | 検索パス |
limit | int | いいえ | 20 | 結果の最大数 |
minSizeBytes | long | いいえ | 0 | 最小ファイルサイズ(バイト) |
戻り値: { success, count, assets: [{ path, sizeBytes, sizeMB }] }
# Find top 10 largest assets over 1 MB
result = call_skill("cleaner_find_large_assets", limit=10, minSizeBytes=1048576)
for a in result['assets']:
print(f"{a['sizeMB']:.2f} MB - {a['path']}")
cleaner_delete_empty_folders
すべての空のフォルダーを削除します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
searchPath | string | いいえ | "Assets" | 検索パス |
戻り値: { success, deleted, total }
# Delete all empty folders
result = call_skill("cleaner_delete_empty_folders")
print(f"Deleted {result['deleted']} of {result['total']} empty folders")
cleaner_fix_missing_scripts
GameObject から、スクリプトが欠落しているコンポーネントを削除します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
includeInactive | bool | いいえ | true | 非アクティブなオブジェクトを含める |
戻り値: { success, removedComponents }
# Remove all missing script components
result = call_skill("cleaner_fix_missing_scripts")
print(f"Removed {result['removedComponents']} missing script components")
cleaner_get_dependency_tree
アセットの依存関係ツリーを取得します。
| パラメーター | 型 | 必須 | デフォルト | 説明 |
|---|---|---|---|---|
assetPath | string | はい | - | アセットパス |
recursive | bool | いいえ | true | 依存関係を再帰的に解決します |
戻り値: { success, assetPath, dependencyCount, dependencies: [{ path, type }] }
# Get full dependency tree for a prefab
result = call_skill("cleaner_get_dependency_tree",
assetPath="Assets/Prefabs/Player.prefab")
print(f"Dependencies: {result['dependencyCount']}")
ワークフローの例:プロジェクトをクリーンアップする
import unity_skills
# 1. Find all missing references and fix them
missing = unity_skills.call_skill("cleaner_find_missing_references")
for issue in missing['issues']:
if issue['type'] == 'MissingScript':
print(f"⚠️ Missing script on: {issue['path']}")
# 2. Find duplicate textures
dupes = unity_skills.call_skill("cleaner_find_duplicates", assetType="Texture2D")
if dupes['totalWastedMB'] > 10:
print(f"🗑️ {dupes['totalWastedMB']:.1f} MB wasted on duplicates")
# 3. Find unused materials
unused = unity_skills.call_skill("cleaner_find_unused_assets", assetType="Material")
print(f"📦 {unused['potentiallyUnusedCount']} potentially unused materials")
# 4. Preview cleanup
paths_to_delete = [a['path'] for a in unused['assets'][:5]]
preview = unity_skills.call_skill("cleaner_delete_assets",
paths=paths_to_delete)
print(f"Would free: {preview['totalMB']:.2f} MB")
# To actually delete, call again with preview['confirmToken'] within 5 minutes.
正確なシグネチャ
正確な名前、パラメーター、デフォルト値、戻り値は、このファイルではなく、GET /skills/schema または unity_skills.get_skill_schema() で定義されています。