[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KG46AV91SHC4F8TFVTKTJZ":3,"skill-same:01M6KG46AV91SHC4F8TFVTKTJZ":64},{"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":35,"linkOnly":36,"markdownContent":37,"markdownBody":38,"frontMatter":39,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":46,"repositoryHtmlUrl":47,"repositoryHomepageUrl":6,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":49,"updatedAt":50,"install":51,"resources":63},"01M6KG46AV91SHC4F8TFVTKTJZ","dots-spawning-patterns",null,"Senior-level entity spawning — batched Instantiate from prefab Entity, ECB.Instantiate from jobs, deterministic Random with CreateFromIndex, RequireForUpdate gating, and Allocator.Temp lifecycle. Use when implementing spawners, enemy waves, projectile fire, particle-like ECS entities, or any \"create N entities per frame\" code.","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\u002Fdots-spawning-patterns\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34],"patterns","dots spawning patterns","create","code","lifecycle","use","jobs","deterministic","ecs","with","random","true","entity","implementing","frame","ecb","2026-11-10 10:12:30",false,"---\nname: dots-spawning-patterns\ndescription: Senior-level entity spawning — batched Instantiate from prefab Entity, ECB.Instantiate from jobs, deterministic Random with CreateFromIndex, RequireForUpdate gating, and Allocator.Temp lifecycle. Use when implementing spawners, enemy waves, projectile fire, particle-like ECS entities, or any \"create N entities per frame\" code.\nmetadata:\n  internal-only: true\n  tier: 3\n---\n\n# Spawning Patterns — Senior Patterns\n\nSpawning N entities efficiently is the difference between a 60fps shooter and a 6fps slideshow. The correct pattern is batched `Instantiate` from a baked prefab Entity, recorded into an ECB when called from a job, with a deterministic seed.\n\n## Intent\n\nCreate entities in bulk, deterministically, without main-thread cost in hot paths.\n\n## Senior pattern — main-thread spawner (one batch per trigger)\n\n```csharp\npublic partial struct SpawnSystem : ISystem\n{\n    uint m_UpdateCounter;\n\n    [BurstCompile]\n    public void OnCreate(ref SystemState state)\n    {\n        \u002F\u002F Don't run until a Spawner singleton exists (set by baking).\n        state.RequireForUpdate\u003CSpawner>();\n    }\n\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        var spinningCubesQuery = SystemAPI.QueryBuilder().WithAll\u003CRotationSpeed>().Build();\n\n        \u002F\u002F Only spawn when none exist — bursty, not per-frame.\n        if (!spinningCubesQuery.IsEmpty) return;\n\n        var prefab = SystemAPI.GetSingleton\u003CSpawner>().Prefab;\n\n        \u002F\u002F Batched: instantiate 500 in one call, return a temp NativeArray of entities.\n        var instances = state.EntityManager.Instantiate(prefab, 500, Allocator.Temp);\n\n        \u002F\u002F Deterministic random: CreateFromIndex hashes the seed so consecutive\n        \u002F\u002F seeds don't produce visually-similar results.\n        var rng = Random.CreateFromIndex(m_UpdateCounter++);\n\n        foreach (var entity in instances)\n        {\n            var transform = SystemAPI.GetComponentRW\u003CLocalTransform>(entity);\n            transform.ValueRW.Position = (rng.NextFloat3() - new float3(0.5f, 0, 0.5f)) * 20f;\n        }\n        \u002F\u002F Allocator.Temp auto-frees at end of frame. No manual Dispose.\n    }\n}\n```\n\n## Senior pattern — spawn from inside a parallel job\n\nWhen spawn cadence depends on per-entity state (e.g. each turret fires when its cooldown expires):\n\n```csharp\npublic partial struct TurretFireSystem : ISystem\n{\n    [BurstCompile]\n    public void OnCreate(ref SystemState state) {\n        state.RequireForUpdate\u003CSpawner>();\n        state.RequireForUpdate\u003CBeginSimulationEntityCommandBufferSystem.Singleton>();\n    }\n\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        var prefab = SystemAPI.GetSingleton\u003CSpawner>().BulletPrefab;\n        var ecb = SystemAPI.GetSingleton\u003CBeginSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged)\n                           .AsParallelWriter();\n\n        new FireJob {\n            Ecb = ecb,\n            Prefab = prefab,\n            Dt = SystemAPI.Time.DeltaTime,\n        }.ScheduleParallel();\n    }\n}\n\n[BurstCompile]\npartial struct FireJob : IJobEntity\n{\n    public EntityCommandBuffer.ParallelWriter Ecb;\n    public Entity Prefab;\n    public float Dt;\n\n    void Execute([ChunkIndexInQuery] int chunkIndex,\n                 ref TurretCooldown cd,\n                 in LocalTransform t)\n    {\n        cd.TimeLeft -= Dt;\n        if (cd.TimeLeft > 0) return;\n        cd.TimeLeft = cd.Interval;\n\n        \u002F\u002F Record the spawn; ECB plays back next frame.\n        var bullet = Ecb.Instantiate(chunkIndex, Prefab);\n        Ecb.SetComponent(chunkIndex, bullet, LocalTransform.FromPosition(t.Position));\n    }\n}\n```\n\n## Deterministic randomness\n\n```csharp\n\u002F\u002F Per-frame seed; the same frame number gives the same sequence — replay-safe.\nvar rng = Random.CreateFromIndex(updateCounter);\n\n\u002F\u002F Per-entity seed (so two entities created on the same frame diverge):\nvar rng = Random.CreateFromIndex((uint)entity.Index ^ updateCounter);\n```\n\n**Banned:**\n- `UnityEngine.Random` — managed, not Burst-compatible, not deterministic across runs\n- `new Random()` without seed — non-deterministic\n- `Random.CreateFromIndex(0)` — `CreateFromIndex` rejects 0; will throw\n\n## Anti-patterns\n\n- ❌ `state.EntityManager.Instantiate(prefab)` called in a loop. Always use the batched overload that takes a count or a destination array.\n- ❌ Spawning from a job using `state.EntityManager.Instantiate` directly. Must go through `Ecb.Instantiate` with `[ChunkIndexInQuery]`.\n- ❌ Loading the prefab via `Resources.Load` or `Addressables` in `OnUpdate`. The prefab Entity is baked at conversion — fetch it once from a singleton.\n- ❌ Spawning N entities per frame \"just in case\". Gate with `RequireForUpdate\u003CT>` and intent components; spawn bursty, not continuous.\n- ❌ Using `Allocator.Persistent` for the temp entity array from `Instantiate`. `Allocator.Temp` is right — it auto-frees at frame end.\n- ❌ Forgetting `RequireForUpdate\u003CSpawner>()` in `OnCreate`. Without it, `GetSingleton\u003CSpawner>()` throws if no spawner exists.\n\n## Failure modes\n\n| Symptom | Likely cause |\n|---|---|\n| Spawn cost spikes in the profiler | Per-entity `Instantiate` instead of batched |\n| \"InvalidOperationException: Singleton does not exist\" | Missing `RequireForUpdate\u003CSpawner>` |\n| Spawn position is always (0,0,0) | Forgot to set `LocalTransform` after `Instantiate`; prefab's transform applies but per-entity position not written |\n| Replays diverge | `UnityEngine.Random` or unseeded `Random` |\n| Crash on `Random.CreateFromIndex(0)` | Seed must be non-zero; use `(updateCounter | 1)` or `++updateCounter` |\n| Bullets spawn one frame late | Expected — ECB playback. If you need same-frame visibility, the reader must run after the ECB phase you recorded into |\n\n## Runtime verification\n\n- **Static:** every `Instantiate(prefab)` call should use the batched overload or be wrapped in `Ecb.Instantiate`. Grep for `EntityManager.Instantiate(` with no second argument inside `OnUpdate`.\n- **Runtime:** spawn N entities, assert query count rises by exactly N within the expected number of frames (1 for main-thread, 2 for ECB-deferred). Run twice with the same seed; assert positions are bit-identical.\n\n## Performance notes\n\n- Batched `Instantiate(prefab, 500, Allocator.Temp)` is roughly the cost of one structural change, not 500. Always batch.\n- The baked prefab Entity has all components fully constructed; spawn copies them. Minimize prefab archetype size if spawning thousands per frame — every byte multiplies.\n- Spawning a million entities at once is feasible; spawning ten per frame for a hundred thousand frames is not. Pick burst spawn over sustained drip.\n\n## Compile \u002F editor safety\n\n- The prefab Entity reference is produced by a Baker (see `dots-baking-patterns`). Don't try to load it at runtime.\n- `Random` here is `Unity.Mathematics.Random` (`using Unity.Mathematics;`) — Burst-friendly value type. `UnityEngine.Random` looks similar but is managed and banned in hot paths.\n\n## Entities version notes (1.4.x)\n\n- `state.EntityManager.Instantiate(prefab, count, allocator)` is the current batched overload.\n- `Random.CreateFromIndex(seed)` is current. Old code used `new Random((uint)Time.frameCount)` — non-deterministic across builds, refuse it.\n- `Allocator.Temp` for per-system, single-frame arrays. `Allocator.TempJob` only when an array is passed into a job that may outlive the calling method.\n\n## See also\n- `dots-baking-patterns` — how the prefab Entity ref gets made\n- `dots-ecb-orchestration` — phase selection for in-job spawn\n- `dots-entity-lifecycle` — destruction is the matching half\n","# Spawning Patterns — Senior Patterns\n\nSpawning N entities efficiently is the difference between a 60fps shooter and a 6fps slideshow. The correct pattern is batched `Instantiate` from a baked prefab Entity, recorded into an ECB when called from a job, with a deterministic seed.\n\n## Intent\n\nCreate entities in bulk, deterministically, without main-thread cost in hot paths.\n\n## Senior pattern — main-thread spawner (one batch per trigger)\n\n```csharp\npublic partial struct SpawnSystem : ISystem\n{\n    uint m_UpdateCounter;\n\n    [BurstCompile]\n    public void OnCreate(ref SystemState state)\n    {\n        \u002F\u002F Don't run until a Spawner singleton exists (set by baking).\n        state.RequireForUpdate\u003CSpawner>();\n    }\n\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        var spinningCubesQuery = SystemAPI.QueryBuilder().WithAll\u003CRotationSpeed>().Build();\n\n        \u002F\u002F Only spawn when none exist — bursty, not per-frame.\n        if (!spinningCubesQuery.IsEmpty) return;\n\n        var prefab = SystemAPI.GetSingleton\u003CSpawner>().Prefab;\n\n        \u002F\u002F Batched: instantiate 500 in one call, return a temp NativeArray of entities.\n        var instances = state.EntityManager.Instantiate(prefab, 500, Allocator.Temp);\n\n        \u002F\u002F Deterministic random: CreateFromIndex hashes the seed so consecutive\n        \u002F\u002F seeds don't produce visually-similar results.\n        var rng = Random.CreateFromIndex(m_UpdateCounter++);\n\n        foreach (var entity in instances)\n        {\n            var transform = SystemAPI.GetComponentRW\u003CLocalTransform>(entity);\n            transform.ValueRW.Position = (rng.NextFloat3() - new float3(0.5f, 0, 0.5f)) * 20f;\n        }\n        \u002F\u002F Allocator.Temp auto-frees at end of frame. No manual Dispose.\n    }\n}\n```\n\n## Senior pattern — spawn from inside a parallel job\n\nWhen spawn cadence depends on per-entity state (e.g. each turret fires when its cooldown expires):\n\n```csharp\npublic partial struct TurretFireSystem : ISystem\n{\n    [BurstCompile]\n    public void OnCreate(ref SystemState state) {\n        state.RequireForUpdate\u003CSpawner>();\n        state.RequireForUpdate\u003CBeginSimulationEntityCommandBufferSystem.Singleton>();\n    }\n\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        var prefab = SystemAPI.GetSingleton\u003CSpawner>().BulletPrefab;\n        var ecb = SystemAPI.GetSingleton\u003CBeginSimulationEntityCommandBufferSystem.Singleton>()\n                           .CreateCommandBuffer(state.WorldUnmanaged)\n                           .AsParallelWriter();\n\n        new FireJob {\n            Ecb = ecb,\n            Prefab = prefab,\n            Dt = SystemAPI.Time.DeltaTime,\n        }.ScheduleParallel();\n    }\n}\n\n[BurstCompile]\npartial struct FireJob : IJobEntity\n{\n    public EntityCommandBuffer.ParallelWriter Ecb;\n    public Entity Prefab;\n    public float Dt;\n\n    void Execute([ChunkIndexInQuery] int chunkIndex,\n                 ref TurretCooldown cd,\n                 in LocalTransform t)\n    {\n        cd.TimeLeft -= Dt;\n        if (cd.TimeLeft > 0) return;\n        cd.TimeLeft = cd.Interval;\n\n        \u002F\u002F Record the spawn; ECB plays back next frame.\n        var bullet = Ecb.Instantiate(chunkIndex, Prefab);\n        Ecb.SetComponent(chunkIndex, bullet, LocalTransform.FromPosition(t.Position));\n    }\n}\n```\n\n## Deterministic randomness\n\n```csharp\n\u002F\u002F Per-frame seed; the same frame number gives the same sequence — replay-safe.\nvar rng = Random.CreateFromIndex(updateCounter);\n\n\u002F\u002F Per-entity seed (so two entities created on the same frame diverge):\nvar rng = Random.CreateFromIndex((uint)entity.Index ^ updateCounter);\n```\n\n**Banned:**\n- `UnityEngine.Random` — managed, not Burst-compatible, not deterministic across runs\n- `new Random()` without seed — non-deterministic\n- `Random.CreateFromIndex(0)` — `CreateFromIndex` rejects 0; will throw\n\n## Anti-patterns\n\n- ❌ `state.EntityManager.Instantiate(prefab)` called in a loop. Always use the batched overload that takes a count or a destination array.\n- ❌ Spawning from a job using `state.EntityManager.Instantiate` directly. Must go through `Ecb.Instantiate` with `[ChunkIndexInQuery]`.\n- ❌ Loading the prefab via `Resources.Load` or `Addressables` in `OnUpdate`. The prefab Entity is baked at conversion — fetch it once from a singleton.\n- ❌ Spawning N entities per frame \"just in case\". Gate with `RequireForUpdate\u003CT>` and intent components; spawn bursty, not continuous.\n- ❌ Using `Allocator.Persistent` for the temp entity array from `Instantiate`. `Allocator.Temp` is right — it auto-frees at frame end.\n- ❌ Forgetting `RequireForUpdate\u003CSpawner>()` in `OnCreate`. Without it, `GetSingleton\u003CSpawner>()` throws if no spawner exists.\n\n## Failure modes\n\n| Symptom | Likely cause |\n|---|---|\n| Spawn cost spikes in the profiler | Per-entity `Instantiate` instead of batched |\n| \"InvalidOperationException: Singleton does not exist\" | Missing `RequireForUpdate\u003CSpawner>` |\n| Spawn position is always (0,0,0) | Forgot to set `LocalTransform` after `Instantiate`; prefab's transform applies but per-entity position not written |\n| Replays diverge | `UnityEngine.Random` or unseeded `Random` |\n| Crash on `Random.CreateFromIndex(0)` | Seed must be non-zero; use `(updateCounter | 1)` or `++updateCounter` |\n| Bullets spawn one frame late | Expected — ECB playback. If you need same-frame visibility, the reader must run after the ECB phase you recorded into |\n\n## Runtime verification\n\n- **Static:** every `Instantiate(prefab)` call should use the batched overload or be wrapped in `Ecb.Instantiate`. Grep for `EntityManager.Instantiate(` with no second argument inside `OnUpdate`.\n- **Runtime:** spawn N entities, assert query count rises by exactly N within the expected number of frames (1 for main-thread, 2 for ECB-deferred). Run twice with the same seed; assert positions are bit-identical.\n\n## Performance notes\n\n- Batched `Instantiate(prefab, 500, Allocator.Temp)` is roughly the cost of one structural change, not 500. Always batch.\n- The baked prefab Entity has all components fully constructed; spawn copies them. Minimize prefab archetype size if spawning thousands per frame — every byte multiplies.\n- Spawning a million entities at once is feasible; spawning ten per frame for a hundred thousand frames is not. Pick burst spawn over sustained drip.\n\n## Compile \u002F editor safety\n\n- The prefab Entity reference is produced by a Baker (see `dots-baking-patterns`). Don't try to load it at runtime.\n- `Random` here is `Unity.Mathematics.Random` (`using Unity.Mathematics;`) — Burst-friendly value type. `UnityEngine.Random` looks similar but is managed and banned in hot paths.\n\n## Entities version notes (1.4.x)\n\n- `state.EntityManager.Instantiate(prefab, count, allocator)` is the current batched overload.\n- `Random.CreateFromIndex(seed)` is current. Old code used `new Random((uint)Time.frameCount)` — non-deterministic across builds, refuse it.\n- `Allocator.Temp` for per-system, single-frame arrays. `Allocator.TempJob` only when an array is passed into a job that may outlive the calling method.\n\n## See also\n- `dots-baking-patterns` — how the prefab Entity ref gets made\n- `dots-ecb-orchestration` — phase selection for in-job spawn\n- `dots-entity-lifecycle` — destruction is the matching half\n",{"name":5,"metadata":40,"description":7},{"tier":41,"internal-only":42},3,true,"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2",".claude\u002Fskills\u002Funity-dots\u002Fdots-spawning-patterns",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":52,"prompt":62,"zipAvailable":42},[53,56,59],{"tool":54,"command":55},"npx","npx skills add dyCuong03\u002Funity-agent-team --skill dots-spawning-patterns",{"tool":57,"command":58},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill dots-spawning-patterns",{"tool":60,"command":61},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill dots-spawning-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Funity-dots\u002Fdots-spawning-patterns\u002FSKILL.md",[],[65,86,108,132,152,173],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":71,"publishedAt":35},"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",[],[72,73,74,75,76,77,78,79,24,80,81,26,82,83,27,84,33,85],"update","dots update groups","boundary","simulation","how","system","choose","work","never","peer","how to","coupling","bugs","value",{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":92,"publishedAt":35},"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",[],[19,93,94,95,74,77,96,97,24,98,99,100,101,28,102,103,104,105,106,107],"transform","dots transform patterns","components","mount","model","cost","runtime","systems","input","matrix","socket","at","child","custom","hierarchy",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":119,"publishedAt":35},"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",[114],{"categoryNo":115,"categoryName":116,"taxonomyType":117,"taxonomyTypeDesc":118},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[19,120,121,122,123,124,125,77,97,24,126,127,128,99,129,130,28,33,34,131],"singleton","dots singleton patterns","component","config","state","game","writer","time","shared","contract","as","gating",{"skillNo":133,"name":134,"nameZh":6,"description":135,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":35},"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",[],[139,140,141,142,95,124,74,143,144,79,145,146,24,99,147,148,101,149,150,151],"bridge","hybrid","dots hybrid bridge","mesh","assets","Rules","read","view","trigger","unity","material","for","managed",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":158,"publishedAt":35},"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",[],[159,160,27,161,162,95,163,164,165,97,79,166,167,19,168,169,101,170,171,172],"event driven","driven","event","dots event driven ecs","change","ui","network","command","anti-patterns","pattern","structural","events","static","request",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":190,"publishedAt":35},"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",[179,184,187],{"categoryNo":180,"categoryName":181,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":185,"categoryName":186,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":188,"categoryName":189,"taxonomyType":182,"taxonomyTypeDesc":183},"01JBSEEDCAT000000000000023","Skill与智能体开发",[191,192,193,194,195,196,197,22,198,199,200,201,202,203,148,204,150],"valid skill","valid","code review","testing","review","test","routing","validation","projects","fixture skill","task","fixture","basic","complete"]