[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KG3BRTQBY6GZDF8EC14YMB":3,"skill-same:01M6KG3BRTQBY6GZDF8EC14YMB":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":37,"linkOnly":38,"markdownContent":39,"markdownBody":40,"frontMatter":41,"refName":46,"commitSha":47,"skillDirectory":48,"forksCount":49,"repositoryHtmlUrl":50,"repositoryHomepageUrl":6,"ownerHtmlUrl":51,"ownerBlogUrl":6,"ownerDescription":52,"updatedAt":53,"install":54,"resources":66},"01M6KG3BRTQBY6GZDF8EC14YMB","direct-entity-manager-structural-changes",null,"Use EntityManager directly for structural changes outside of any active query iteration — appropriate for one-shot initialisation, infrequent config-driven respawns, and batch operations on the mai...","dyCuong03\u002Funity-agent-team","dyCuong03","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F137050365?v=4","01M6KFXC85HQHXZJC2VC1KY6EZ","CuongND","01M6KFXCCHP6CD5MTA8NECJC36",8,"MIT","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Funity-dots\u002Fdirect-entity-manager-structural-changes\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36],"structural","direct entity manager structural changes","changes","entity","manager","direct","use","query","active","iteration","change","driven","true","operations","for","batch","structural-change","config","2026-11-10 10:12:30",false,"﻿---\nname: direct-entity-manager-structural-changes\ndescription: Use EntityManager directly for structural changes outside of any active query iteration — appropriate for one-shot initialisation, infrequent config-driven respawns, and batch operations on the mai...\ntags: [structural-change]\nmetadata:\n  internal-only: true\n  tier: 3\n---\n\n# Direct EntityManager Structural Changes\n\n## Intent\nUse EntityManager directly for structural changes outside of any active query iteration — appropriate for one-shot initialisation, infrequent config-driven respawns, and batch operations on the main thread.\n\n## Use When\nOne-shot init systems (state.Enabled = false after first run). Mass respawn triggered by config change. Any structural change that happens once at startup or once on a significant event, not per-frame.\n\n## Avoid When\nInside a SystemAPI.Query foreach — iterator is invalidated. Inside a scheduled job — EntityManager is not accessible from jobs. In per-frame simulation hot paths — use ECB for deferred execution.\n\n## Senior Pattern\n- Disable the system after first run: `state.Enabled = false;` at the start of OnUpdate (set before any work so even exceptions during work don't leave the system enabled for next frame).\n- Use batch overloads exclusively:\n  - `state.EntityManager.Instantiate(prefab, count, Allocator.Temp)` — spawns N entities in one archetype operation.\n  - `state.EntityManager.AddComponent\u003CT>(query)` — adds T to all matching entities in one pass.\n  - `state.EntityManager.RemoveComponent\u003CT>(query)` — removes T from all matching in one pass.\n  - `state.EntityManager.DestroyEntity(query)` — destroys all matching in one pass.\n- Use `state.EntityManager.AddBuffer\u003CT>(entity)` for per-entity buffer initialisation after batch spawn.\n\n## Code Template\n```csharp\n[BurstCompile]\npublic partial struct WorldSetupSystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n        => state.RequireForUpdate\u003CWorldConfig>();\n\n    public void OnUpdate(ref SystemState state)\n    {\n        state.Enabled = false;  \u002F\u002F one-shot — set before work begins\n\n        var config = SystemAPI.GetSingleton\u003CWorldConfig>();\n\n        \u002F\u002F Batch spawn — single archetype operation for all N entities\n        var enemies = state.EntityManager.Instantiate(\n            config.EnemyPrefab, config.EnemyCount, Allocator.Temp);\n\n        \u002F\u002F Per-entity init using the spawned array\n        for (int i = 0; i \u003C enemies.Length; i++)\n        {\n            state.EntityManager.SetComponentData(enemies[i],\n                LocalTransform.FromPosition(new float3(i * 2f, 0, 0)));\n        }\n\n        \u002F\u002F Batch tag all spawned enemies\n        var enemyQuery = SystemAPI.QueryBuilder()\n            .WithAll\u003CEnemyData>().WithNone\u003CEnemyReady>().Build();\n        state.EntityManager.AddComponent\u003CEnemyReady>(enemyQuery);\n    }\n}\n```\n\n## Anti-Patterns\n- Calling `state.EntityManager.Instantiate(prefab)` (single-entity overload) in a loop — N archetype operations instead of 1.\n- Calling structural changes inside SystemAPI.Query foreach — iterator invalidation, safety exception.\n- Forgetting `state.Enabled = false` on a one-shot init system — repeated spawning every frame.\n- Calling `state.EntityManager.CompleteAllTrackedJobs()` to \"enable\" structural changes instead of properly scheduling them — blocks all worker threads.\n\n## Runtime Risks\n- Structural change inside foreach: access exception or silent data corruption.\n- Missing state.Enabled = false: duplicate entity spawning every frame.\n- Loop of single Instantiate: O(N) archetype operations cause visible frame spikes at large N.\n\n## Performance Notes\n- `Instantiate(prefab, count, Alloc)`: O(1) archetype operations + O(count) data copies. Dominates single-entity loop by orders of magnitude at count > 100.\n- `AddComponent(query)`: single structural change pass over all matching chunks. Same cost regardless of entity count.\n- `DestroyEntity(query)`: single pass, optimal for mass destruction.\n\n## Architecture Guidance\nDirect EntityManager = privileged main-thread batch API. Reserve for world setup and explicit event-driven mass operations. For all simulation-phase structural changes, ECB is the correct tool.\n\n## Related Skills\n[[entity-command-buffer]], [[batch-structural-change-on-query]]\n","# Direct EntityManager Structural Changes\n\n## Intent\nUse EntityManager directly for structural changes outside of any active query iteration — appropriate for one-shot initialisation, infrequent config-driven respawns, and batch operations on the main thread.\n\n## Use When\nOne-shot init systems (state.Enabled = false after first run). Mass respawn triggered by config change. Any structural change that happens once at startup or once on a significant event, not per-frame.\n\n## Avoid When\nInside a SystemAPI.Query foreach — iterator is invalidated. Inside a scheduled job — EntityManager is not accessible from jobs. In per-frame simulation hot paths — use ECB for deferred execution.\n\n## Senior Pattern\n- Disable the system after first run: `state.Enabled = false;` at the start of OnUpdate (set before any work so even exceptions during work don't leave the system enabled for next frame).\n- Use batch overloads exclusively:\n  - `state.EntityManager.Instantiate(prefab, count, Allocator.Temp)` — spawns N entities in one archetype operation.\n  - `state.EntityManager.AddComponent\u003CT>(query)` — adds T to all matching entities in one pass.\n  - `state.EntityManager.RemoveComponent\u003CT>(query)` — removes T from all matching in one pass.\n  - `state.EntityManager.DestroyEntity(query)` — destroys all matching in one pass.\n- Use `state.EntityManager.AddBuffer\u003CT>(entity)` for per-entity buffer initialisation after batch spawn.\n\n## Code Template\n```csharp\n[BurstCompile]\npublic partial struct WorldSetupSystem : ISystem\n{\n    public void OnCreate(ref SystemState state)\n        => state.RequireForUpdate\u003CWorldConfig>();\n\n    public void OnUpdate(ref SystemState state)\n    {\n        state.Enabled = false;  \u002F\u002F one-shot — set before work begins\n\n        var config = SystemAPI.GetSingleton\u003CWorldConfig>();\n\n        \u002F\u002F Batch spawn — single archetype operation for all N entities\n        var enemies = state.EntityManager.Instantiate(\n            config.EnemyPrefab, config.EnemyCount, Allocator.Temp);\n\n        \u002F\u002F Per-entity init using the spawned array\n        for (int i = 0; i \u003C enemies.Length; i++)\n        {\n            state.EntityManager.SetComponentData(enemies[i],\n                LocalTransform.FromPosition(new float3(i * 2f, 0, 0)));\n        }\n\n        \u002F\u002F Batch tag all spawned enemies\n        var enemyQuery = SystemAPI.QueryBuilder()\n            .WithAll\u003CEnemyData>().WithNone\u003CEnemyReady>().Build();\n        state.EntityManager.AddComponent\u003CEnemyReady>(enemyQuery);\n    }\n}\n```\n\n## Anti-Patterns\n- Calling `state.EntityManager.Instantiate(prefab)` (single-entity overload) in a loop — N archetype operations instead of 1.\n- Calling structural changes inside SystemAPI.Query foreach — iterator invalidation, safety exception.\n- Forgetting `state.Enabled = false` on a one-shot init system — repeated spawning every frame.\n- Calling `state.EntityManager.CompleteAllTrackedJobs()` to \"enable\" structural changes instead of properly scheduling them — blocks all worker threads.\n\n## Runtime Risks\n- Structural change inside foreach: access exception or silent data corruption.\n- Missing state.Enabled = false: duplicate entity spawning every frame.\n- Loop of single Instantiate: O(N) archetype operations cause visible frame spikes at large N.\n\n## Performance Notes\n- `Instantiate(prefab, count, Alloc)`: O(1) archetype operations + O(count) data copies. Dominates single-entity loop by orders of magnitude at count > 100.\n- `AddComponent(query)`: single structural change pass over all matching chunks. Same cost regardless of entity count.\n- `DestroyEntity(query)`: single pass, optimal for mass destruction.\n\n## Architecture Guidance\nDirect EntityManager = privileged main-thread batch API. Reserve for world setup and explicit event-driven mass operations. For all simulation-phase structural changes, ECB is the correct tool.\n\n## Related Skills\n[[entity-command-buffer]], [[batch-structural-change-on-query]]\n",{"name":5,"tags":42,"metadata":43,"description":7},[35],{"tier":44,"internal-only":45},3,true,"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2",".claude\u002Fskills\u002Funity-dots\u002Fdirect-entity-manager-structural-changes",0,"https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team","https:\u002F\u002Fgithub.com\u002FdyCuong03","Game developer","2026-07-25 22:22:25",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":45},[56,59,62],{"tool":57,"command":58},"npx","npx skills add dyCuong03\u002Funity-agent-team --skill direct-entity-manager-structural-changes",{"tool":60,"command":61},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill direct-entity-manager-structural-changes",{"tool":63,"command":64},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill direct-entity-manager-structural-changes","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Funity-dots\u002Fdirect-entity-manager-structural-changes\u002FSKILL.md",[],[68,92,116,140,159,177],{"skillNo":69,"name":70,"nameZh":6,"description":71,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":72,"categories":73,"keywords":74,"publishedAt":37},"01M6KH55FFS00ET877QSMRYGX4","dots-update-groups","How to choose the right ECS system group and ordering so per-frame and per-fixed-step work is deterministic and never races its own readers. Covers InitializationSystemGroup \u002F SimulationSystemGroup \u002F PresentationSystemGroup \u002F FixedStepSimulationSystemGroup \u002F VariableRateSimulationSystemGroup, UpdateBefore \u002F UpdateAfter peer ordering, OrderFirst \u002F OrderLast group-boundary placement, RateManager, and the cross-group ordering trap. Use when adding an ISystem, fixing \"value visible one frame late\" bugs, or coupling simulation to a fixed timestep.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-update-groups\u002FSKILL.md",[],[75,76,77,78,79,80,81,82,25,83,84,85,86,87,88,89,90,91],"update","dots update groups","boundary","simulation","how","system","choose","work","never","peer","deterministic","how to","coupling","ecs","bugs","frame","value",{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":98,"publishedAt":37},"01M6KH50PWYEFQDCGYBZ0326F1","dots-transform-patterns","The Entities 1.x transform model — LocalTransform (writable input) vs LocalToWorld (system-owned matrix), Parent\u002FChild hierarchy, reparenting cost, uniform vs non-uniform scale (PostTransformMatrix), and when to opt out with custom transform systems. Use when designing parent\u002Fchild hierarchies, runtime reparenting (mount\u002Fdismount\u002Fsocket), or choosing transform components at the Baker boundary.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-transform-patterns\u002FSKILL.md",[],[99,100,101,102,77,80,103,104,25,105,106,107,108,109,110,111,112,113,114,115],"patterns","transform","dots transform patterns","components","mount","model","cost","runtime","systems","input","with","matrix","socket","at","child","custom","hierarchy",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":127,"publishedAt":37},"01M6KH4VW4MA14DQW4KQYPFT0S","dots-singleton-patterns","Model cross-system shared configuration and game state as a single-entity component with a strict single-writer contract. Covers RequireForUpdate gating, SystemAPI.GetSingleton \u002F GetSingletonRW \u002F HasSingleton \u002F TryGetSingleton, bake-time vs runtime-created vs ECB-system singletons, the \"exactly one entity\" runtime invariant, and the single-writer rule. Use when designing frame-stable global config, shared mutable state, or any component intended to exist on exactly one entity.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-singleton-patterns\u002FSKILL.md",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":125,"taxonomyTypeDesc":126},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[99,128,129,130,36,131,132,80,104,25,133,134,135,106,136,137,109,90,138,139],"singleton","dots singleton patterns","component","state","game","writer","time","shared","contract","as","ecb","gating",{"skillNo":141,"name":142,"nameZh":6,"description":143,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":144,"categories":145,"keywords":146,"publishedAt":37},"01M6KH4PR076AYNDZHD63HHWX6","dots-hybrid-bridge","The one-way bridge between DOTS-owned runtime state and Unity-owned presentation. Covers UnityObjectRef for managed asset refs in components, the DOTS-writes \u002F Unity-reads ownership rule, when to use managed IComponentData vs UnityObjectRef vs CompanionComponent, baker-bridge vs runtime-bridge, and SubScene boundary rules. Use when an entity must reference Unity assets (Mesh, Material, AudioClip, ScriptableObject), a MonoBehaviour view must read entity state, or input\u002FUI must trigger ECS work.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-hybrid-bridge\u002FSKILL.md",[],[147,148,149,150,102,131,77,151,152,82,153,154,25,106,155,156,108,157,33,158],"bridge","hybrid","dots hybrid bridge","mesh","assets","Rules","read","view","trigger","unity","material","managed",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":163,"categories":164,"keywords":165,"publishedAt":37},"01M6KH4FGRQ9AP2ND5H5HX4D83","dots-event-driven-ecs","Model one-frame events and external requests in ECS without dual ownership, polling, or persistent state leaks. Covers request-tag pattern with ECB, enableable command components (no structural change), event buffers (IBufferElementData), explicit consumer ownership, one-frame latency rules, and the banned C# event \u002F UnityEvent \u002F static bus anti-patterns. Use when input\u002FUI\u002Fnetwork must trigger ECS work, when a one-frame signal fans out to N consumers (damage, hit, collision), or when state changes must be processed exactly once.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Fworkspace\u002Fdots-program\u002Fscratch\u002Fwave-2-orchestrator-drafts\u002Fdots-event-driven-ecs\u002FSKILL.md",[],[166,30,88,167,168,102,29,169,170,104,82,171,172,99,173,19,108,174,175,176],"event driven","event","dots event driven ecs","ui","network","command","anti-patterns","pattern","events","static","request",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":194,"publishedAt":37},"01M6KH4BWRGCEBJ8PKCKCSGT33","valid_skill","A complete, well-formed test fixture skill for SkillHub validation testing. Covers basic task routing and code review for Unity projects.","https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fvalid_skill\u002FSKILL.md",[183,188,191],{"categoryNo":184,"categoryName":185,"taxonomyType":186,"taxonomyTypeDesc":187},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":189,"categoryName":190,"taxonomyType":186,"taxonomyTypeDesc":187},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":192,"categoryName":193,"taxonomyType":186,"taxonomyTypeDesc":187},"01JBSEEDCAT000000000000023","Skill与智能体开发",[195,196,197,198,199,200,201,202,203,204,205,206,207,208,156,209,33],"valid skill","valid","code review","testing","review","test","routing","code","validation","projects","fixture skill","task","fixture","basic","complete"]