{"id":49813803,"url":"https://github.com/youngwoocho02/unity-scanner","last_synced_at":"2026-05-16T06:01:31.690Z","repository":{"id":356874694,"uuid":"1234406300","full_name":"youngwoocho02/unity-scanner","owner":"youngwoocho02","description":"Token-saving Unity asset scanner for AI agent workflows","archived":false,"fork":false,"pushed_at":"2026-05-14T07:05:38.000Z","size":216,"stargazers_count":19,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-05-15T05:51:59.898Z","etag":null,"topics":["ai-tools","cli","llm","unity","unity3d"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/youngwoocho02.png","metadata":{"files":{"readme":"README.ja.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2026-05-10T06:22:15.000Z","updated_at":"2026-05-14T23:43:06.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/youngwoocho02/unity-scanner","commit_stats":null,"previous_names":["youngwoocho02/unity-scanner"],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/youngwoocho02/unity-scanner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwoocho02%2Funity-scanner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwoocho02%2Funity-scanner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwoocho02%2Funity-scanner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwoocho02%2Funity-scanner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/youngwoocho02","download_url":"https://codeload.github.com/youngwoocho02/unity-scanner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/youngwoocho02%2Funity-scanner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33092434,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-tools","cli","llm","unity","unity3d"],"created_at":"2026-05-13T03:03:41.132Z","updated_at":"2026-05-16T06:01:31.639Z","avatar_url":"https://github.com/youngwoocho02.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# unity-scanner\n\n[英語](README.md) | [韓国語](README.ko.md)\n\n## 主な例\n\n- path と拡張子を削る: `Assets/Examples/Characters/Enemy_01.prefab` -\u003e `Characters [prefab] Enemy_01`\n- `.meta` file を省く: `Hero.prefab + Hero.prefab.meta` -\u003e `Hero`\n- 連番名を畳む: `Enemy_01, Enemy_02, Enemy_03` -\u003e `Enemy_01..03`\n- YAML object を階層に変える: `GameObject + Transform + MeshRenderer` -\u003e `TREE [0] HeroRoot c1`\n- 繰り返し component set をコード化: `Transform, MeshFilter, MeshRenderer` x 40 -\u003e `CMP c2 ...` + `... c2`\n- 同じ render object をまとめる: `SampleMesh_01 ... SampleMesh_08` -\u003e `[2..9] SampleMesh_01..08 c2 (8)`\n- 必要な field だけ抜く: `MeshRenderer {40 fields}` -\u003e `m_CastShadows, m_ReceiveShadows, more fields: 35 hidden`\n- GUID を path に解決する: `{guid: 222...}` -\u003e `Assets/Examples/Data/SampleReference.asset`\n- 一致理由を構造化する: `SamplePanel.prefab:12 m_Name: SamplePanel` -\u003e `[prefab] UI / SamplePanel / object: SamplePanel`\n- GUID ref を要約する: `guid: 333...` x 30 -\u003e `[asset] . :: SampleConfig`\n- 省略数を出す: `hidden rows` -\u003e `more: 41 hidden by depth/limit`\n- 広い検索を並列化する: `name search 1500ms` -\u003e `600ms`\n\n## なぜ作ったか\n\n1. トークンコストを減らす。RTK と同じく、モデルに入る前に Unity の繰り返し path、拡張子、`.meta`、GUID、YAML field を圧縮する。\n\n2. Unity YAML の raw dump を構造化出力に変える。`GameObject`、`Transform`、component、fileID、GUID を別々に追わせず、階層、component set、参照関係をまとめて表示する。\n\n## 設計\n\n- 現在のファイルだけ読む。cache なし、Editor state 依存なし\n- Unity 構造を使う。階層、コンポーネントグループ、GUID、パスグループ\n- デフォルト出力は圧縮優先。繰り返し情報は一度だけ宣言し、省略数は表示\n- 大きな scan はファイル単位で並列処理\n- 単純な pipeline を優先。出力削減や Unity 構造の解釈に直接効かない wrapper、fallback、機能は追加しない\n\n下の例のトークン数は正確なトークナイザー結果ではなく、`文字数 / 4` の概算。実際のトークン数はモデルによって変わる。\n\n## インストール\n\n### macOS / Linux\n\n```bash\ncurl -fsSL https://raw.githubusercontent.com/youngwoocho02/unity-scanner/master/install.sh | sh\n```\n\n### Windows PowerShell\n\n```powershell\nirm https://raw.githubusercontent.com/youngwoocho02/unity-scanner/master/install.ps1 | iex\n```\n\ninstaller は latest release binary を download し、install directory を `PATH` に追加する。install 後の command は `unity-scanner ...` で実行する。\n\n### update\n\n```bash\nunity-scanner update\nunity-scanner update --check\n```\n\nupdate 確認は `unity-scanner update` または `unity-scanner update --check` を実行した時だけ行う。\n\n## コマンド\n\n```bash\nunity-scanner list   -p \u003cproject\u003e [path]\nunity-scanner read   -p \u003cproject\u003e \u003casset\u003e\nunity-scanner search -p \u003cproject\u003e [path] [filters]\nunity-scanner refs   -p \u003cproject\u003e \u003casset-or-guid\u003e [scan-path]\nunity-scanner update [--check]\nunity-scanner help [command]\nunity-scanner version\n```\n\nルート option:\n\n```text\n-h, --help             ヘルプを表示\n-v, --version          バージョンを表示\n```\n\nプロジェクトコマンドのオプション:\n\n```text\n-p, --project \u003cpath\u003e   Unity プロジェクトのパス\n--line-width \u003cn\u003e       出力 1 行の最大幅。既定 1200、0 で切り詰め無効\n```\n\nコマンド別名: `ls` = `list`, `cat` = `read`, `find` = `search`\n\n## list\n\nUnity asset 用の圧縮 `ls`\n\nこのツールなしの場合:\n\n```bash\nfind Assets/Examples -type f\n```\n\n```text\nAssets/Examples/Characters/Hero.prefab\nAssets/Examples/Characters/Hero.prefab.meta\nAssets/Examples/Characters/Enemy_01.prefab\nAssets/Examples/Characters/Enemy_01.prefab.meta\nAssets/Examples/Data/HeroConfig.asset\nAssets/Examples/Scenes/Demo.unity\nAssets/Examples/Scripts/InventoryService.cs\nAssets/Examples/UI/InventoryPanel.prefab\n...\n```\n\n`unity-scanner` の場合:\n\n```bash\nunity-scanner list -p /projects/SampleProject Assets/Examples --depth 2 --limit 8\n```\n\n```text\nEXT\n  asset      .asset\n  cs         .cs\n  mat        .mat\n  prefab     .prefab\n  scene      .unity\n\nDIRS\n  Characters/ mat 2, prefab 5\n  Data/       asset 4\n  Scenes/     scene 2\n  Scripts/    cs 3\n  UI/         prefab 5\n\nGROUPS\n  Characters  [mat]\n    HeroBody, HeroFace\n  Characters  [prefab]\n    Enemy_01..03, Hero, Villager\n  Data  [asset]\n    BalanceConfig, EnemyConfig, HeroConfig, ItemCatalog\n  Scenes  [scene]\n    Demo, Menu\n  Scripts  [cs]\n    CharacterController, InventoryService, UIHudController\n  UI  [prefab]\n    InventoryPanel, Tooltip, UI_Button_01..03\n```\n\n差:\n\n```text\n通常のファイル一覧:   約 180行, 8400文字, 約 2100トークン\nunity-scanner list: 約  28行,  900文字, 約  225トークン\n削減:               文字数で約 89%\n```\n\nproject と root path はすでに command にあるため、出力では繰り返さない。長い `Assets/...` prefix は group にまとめ、`.meta` は要求されない限り省き、拡張子は `EXT` で一度だけ宣言する。\n\n## read\n\nUnity YAML asset を model context 向けの構造に要約する。対象は `.prefab`, `.unity`, `.asset`\n\nこのツールなしの場合:\n\n```bash\ncat Assets/Examples/Prefabs/SamplePrefab.prefab\n```\n\n```text\n--- !u!1 \u0026100001\nGameObject:\n  m_Name: SampleRoot\n  m_Component:\n  - component: {fileID: 400001}\n  - component: {fileID: 230001}\n--- !u!4 \u0026400001\nTransform:\n  m_GameObject: {fileID: 100001}\n  m_Father: {fileID: 0}\n--- !u!23 \u0026230001\nMeshRenderer:\n  m_GameObject: {fileID: 100001}\n  m_CastShadows: 1\n...\n```\n\n`unity-scanner` の場合:\n\n```bash\nunity-scanner read -p /projects/SampleProject Assets/Examples/Prefabs/SamplePrefab.prefab --depth 2 --limit 30\n```\n\n```text\nASSET       prefab\nPATH        Assets/Examples/Prefabs/SamplePrefab.prefab\nGUID        0123456789abcdef0123456789abcdef\nOBJECTS     64\nCOMPONENTS  138\nDEPTH       2\n\nCMP\n  c1 Transform\n  c2 Transform, MeshFilter, MeshRenderer\n\nTREE\n[0] SampleRoot  c1\n[1] SampleMeshRoot  c1\n  [2..9] SampleMesh, SampleMesh_01..07  c2  (8)\n[10] SampleLogicRoot  c1\n[11] SampleChild  c1\n\nmore: 41 hidden by depth/limit\ncollapsed render-only: 18\nhint: use --depth N, --path NAME, --component NAME, or --full-tree\n```\n\nrender-only 行をすべて見たい場合は `--full-tree` を使う。\n\n差:\n\n```text\n未加工 Unity YAML:   約 6000行, 200000文字, 約 50000トークン\nunity-scanner read: 約   30行,    900文字, 約   225トークン\n削減:               文字数で約 99%\n```\n\n未加工の object block は GameObject tree に変わる。繰り返しの component set は `CMP` で一度だけ宣言する。render-only の繰り返しは折り畳み、隠した行数は表示する。\n\n### Component Drilldown\n\n```bash\nunity-scanner read -p /projects/SampleProject Assets/Examples/Prefabs/SamplePrefab.prefab --component MeshRenderer --path SampleMeshRoot --field-limit 3 --limit 3\n```\n\n出力形:\n\n```text\nASSET       prefab\nPATH        Assets/Examples/Prefabs/SamplePrefab.prefab\nGUID        0123456789abcdef0123456789abcdef\nOBJECTS     64\nCOMPONENTS  138\n\nCOMPONENT  MeshRenderer\nOBJECT     SampleRoot/SampleMeshRoot/SampleMesh\nfields:\n  m_CastShadows            1\n  m_ReceiveShadows         1\n  m_DynamicOccludee        1\nmore fields: 35 hidden by --field-limit\n\nmore components: 5 hidden by --limit\n```\n\n### ScriptableObject Asset\n\n```bash\nunity-scanner read -p /projects/SampleProject Assets/Examples/Data/SampleConfig.asset --field-limit 4\n```\n\n```text\nASSET       asset\nPATH        Assets/Examples/Data/SampleConfig.asset\nGUID        11111111111111111111111111111111\nYAML_OBJECTS 1\n\n[0] SampleConfig  name: SampleConfig\n    script: Assets/Examples/Scripts/SampleConfig.cs\n    startingLevel            1\n    reference                {fileID: 11400000, guid: 22222222222222222222222222222222, type: 2} -\u003e Assets/Examples/Data/SampleReference.asset\n```\n\n## search\n\nfile name, GameObject, Component, GUID reference を構造的に検索する。\n\nこのツールなしの場合:\n\n```bash\ngrep -R -n -E \"Sample|guid:\" Assets/Examples/Prefabs\n```\n\n```text\nAssets/Examples/Prefabs/Common/SamplePrefab.prefab:12:  m_Name: SampleRoot\nAssets/Examples/Prefabs/Common/SamplePrefab.prefab:80:  m_Script: {fileID: 11500000, guid: 33333333333333333333333333333333, type: 3}\nAssets/Examples/Prefabs/Common/SampleVariant.prefab:12:  m_Name: SampleRoot\nAssets/Examples/Prefabs/UI/SamplePanel.prefab:12:  m_Name: SamplePanel\n...\n```\n\n`unity-scanner` の場合:\n\n```bash\nunity-scanner search -p /projects/SampleProject Assets/Examples/Prefabs --name Sample --type prefab --limit 5\n```\n\n```text\nEXT\n  prefab     .prefab\n\nMATCHES  3\n\n[prefab] Common\n  SamplePrefab\n    file-name\n  SampleVariant\n    file-name\n[prefab] UI\n  SamplePanel\n    file-name\n```\n\n差:\n\n```text\n通常の grep/find:      約 40行, 2600文字, 約 650トークン\nunity-scanner search: 約 11行,  320文字, 約 80トークン\n削減:                 文字数で約 80%\n```\n\npath と拡張子の繰り返しは group で減らす。file name が name-only search に一致した場合、YAML 内部は展開せず `file-name` だけを表示する。一致理由は `file-name`, `object`, `components`, GUID reference のように構造化して表示する。\n\n広い範囲の検索では効果がある場合に file 単位で並列処理する。\n\n```text\nname search:      約 1500ms -\u003e 600ms\nguid search:      約 1600ms -\u003e 1000ms\ncomponent search: 約 2000ms -\u003e 1100ms\n```\n\n## refs\n\n特定アセットまたは未加工 GUID がどこで参照されているかを探す。\n\nこのツールなしの場合:\n\n```bash\ngrep -R -n \"33333333333333333333333333333333\" Assets/Examples/Data\n```\n\n```text\nAssets/Examples/Data/SampleConfig.asset:18:  m_Script: {fileID: 11500000, guid: 33333333333333333333333333333333, type: 3}\nAssets/Examples/Data/SamplePreset.asset:44:  source: {fileID: 11400000, guid: 33333333333333333333333333333333, type: 2}\n...\n```\n\n`unity-scanner` の場合:\n\n```bash\nunity-scanner refs -p /projects/SampleProject Assets/Examples/Scripts/SampleConfig.cs Assets/Examples/Data --limit 5\n```\n\n```text\nREF     Assets/Examples/Scripts/SampleConfig.cs\nGUID    33333333333333333333333333333333\n\nEXT\n  asset      .asset\n\nMATCHES  1\n\n[asset]\n  . :: SampleConfig\n```\n\n`refs` はアセットパスまたは 32 文字の未加工 GUID を受け取る。\n\n差:\n\n```text\n通常の GUID grep:   約 30行, 2400文字, 約 600トークン\nunity-scanner refs: 約 10行,  260文字, 約  65トークン\n削減:               文字数で約 89%\n```\n\n対象アセットパスは一度だけ解決する。結果は未加工 YAML 参照行の繰り返しではなく、アセット種別とフォルダーでまとまる。\n\n## オプション\n\n### list\n\n```text\n--depth \u003cn\u003e       ディレクトリ要約の深さ。既定は無制限\n--kind \u003clist\u003e     カンマ区切りの種類: prefab,scene,asset,cs,mat\n--meta            本文に .meta ファイルを含める\n--flat            ディレクトリ要約を省略\n--limit \u003cn\u003e       最大グループ数。既定は無制限\n```\n\n### read\n\n```text\n--depth \u003cn\u003e          階層の深さ。既定は無制限\n--path \u003cname/path\u003e   一致するオブジェクトのブランチだけを表示\n--component \u003cname\u003e   一致するコンポーネントのフィールドを表示\n--field-limit \u003cn\u003e    コンポーネントごとの最大フィールド数。既定は無制限\n--limit \u003cn\u003e          最大 GameObject/コンポーネント一致数。既定は無制限\n--full-tree          レンダリング専用の折り畳みなしで表示可能なツリー行をすべて表示\n```\n\n### search\n\n```text\n--name \u003ctext\u003e        ファイル名または GameObject 名を検索\n--component \u003ctext\u003e   コンポーネント/スクリプト名を検索\n--script-path \u003cpath\u003e 指定したアセットパス配下の MonoBehaviour スクリプトを検索\n--guid \u003cguid\u003e        未加工の Unity GUID 参照を検索\n--ref \u003cguid\u003e         --guid の別名\n--type \u003clist\u003e        prefab,scene,asset,cs,mat\n--compact            1 行のグループ結果を出力\n--warnings \u003cmode\u003e    警告出力方式: summary または detail。既定は summary\n--limit \u003cn\u003e          最大結果ファイル数。既定は無制限\n```\n\n### refs\n\n```text\n--type \u003clist\u003e        prefab,scene,asset,mat,controller\n--detail             圧縮グループではなく詳細一致を出力\n--warnings \u003cmode\u003e    警告出力方式: summary または detail。既定は summary\n--limit \u003cn\u003e          最大結果ファイル数。既定は無制限\n```\n\n### update\n\n```text\n--check              インストールせず更新だけ確認\n```\n\n## 設計上の選択\n\n### キャッシュなし\n\ncache は繰り返し scan を速くできるが、invalidation と stale result の問題が出る。この tool は単純に保つ。command を受け取り、現在の file を読み、compact な結果を出す。\n\n### Editor 接続なし\n\nUnity Editor に接続すればより豊富な type 情報を得られる。しかし open project、connector、Editor state に依存する。`unity-scanner` は意図的に offline tool として作る。\n\n### 完全な dump より圧縮された map\n\nagent workflow では最初の答えは raw dump より map の方が役に立つ。`list` や `search` で候補を絞り、`read --component` や `refs --detail` で深く見る。\n\n## 開発検証\n\n```bash\ngofmt -w .\ngo test ./...\ngo build -o unity-scanner .\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungwoocho02%2Funity-scanner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyoungwoocho02%2Funity-scanner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyoungwoocho02%2Funity-scanner/lists"}