[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KGC68RW7HE7H0KFRZBVCN9":3,"skill-same:01M6KGC68RW7HE7H0KFRZBVCN9":61},{"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":31,"linkOnly":32,"markdownContent":33,"markdownBody":34,"frontMatter":35,"refName":40,"commitSha":41,"skillDirectory":42,"forksCount":43,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":46,"updatedAt":47,"install":48,"resources":60},"01M6KGC68RW7HE7H0KFRZBVCN9","wave5-physics-world-singleton-queries",null,"Perform runtime spatial queries (raycast, collider cast, distance, overlap) against the Unity Physics collision world using PhysicsWorldSingleton.","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\u002Fwave5-physics-world-singleton-queries\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30],"queries","world","physics","singleton","wave5 physics world singleton queries","Spatial","raycast","cast","query","runtime","unity","true","2026-11-10 10:12:30",false,"﻿---\nname: wave5-physics-world-singleton-queries\ndescription: Perform runtime spatial queries (raycast, collider cast, distance, overlap) against the Unity Physics collision world using PhysicsWorldSingleton.\ntags: [physics, query, singleton]\nmetadata:\n  internal-only: true\n  tier: 3\n---\n\n# PhysicsWorldSingleton Spatial Queries\n\n## Intent\nPerform runtime spatial queries (raycast, collider cast, distance, overlap) against the Unity Physics collision world using PhysicsWorldSingleton.\n\n## Use When\n- Line-of-sight checks, ground detection, projectile trajectory, AOE range detection\n- Spatial queries against current physics world state (after world build)\n\n## Avoid When\n- Queries inside FixedStepSimulationSystemGroup before PhysicsBuildWorldGroup — world not yet built\n- Per-entity collision response — use trigger\u002Fcollision event buffers instead\n\n## Senior Pattern\n```csharp\n[UpdateInGroup(typeof(SimulationSystemGroup))]\n[BurstCompile]\npublic partial struct RaycastSystem : ISystem\n{\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        \u002F\u002F Complete physics jobs before reading PhysicsWorldSingleton:\n        state.EntityManager.CompleteDependencyBeforeRO\u003CPhysicsWorldSingleton>();\n\n        var physicsWorld = SystemAPI.GetSingleton\u003CPhysicsWorldSingleton>().PhysicsWorld;\n\n        state.Dependency = new RaycastJob\n        {\n            World = physicsWorld.CollisionWorld,\n            Input = new RaycastInput\n            {\n                Start = float3.zero,       \u002F\u002F replace with actual origin\n                End = float3.zero + math.forward() * 100f,\n                Filter = new CollisionFilter\n                {\n                    BelongsTo = ~0u,\n                    CollidesWith = 1u \u003C\u003C 0,  \u002F\u002F target layer only\n                    GroupIndex = 0\n                }\n            },\n            Hits = new NativeList\u003CRaycastHit>(Allocator.TempJob)\n        }.Schedule(state.Dependency);\n    }\n}\n\n[BurstCompile]\npublic struct RaycastJob : IJob\n{\n    [ReadOnly] public CollisionWorld World;\n    public RaycastInput Input;\n    public NativeList\u003CRaycastHit> Hits;\n\n    public void Execute() { World.CastRay(Input, ref Hits); }\n}\n```\n\nAvailable query types:\n```csharp\n\u002F\u002F Single closest hit:\nworld.CollisionWorld.CastRay(input, out RaycastHit hit)\n\n\u002F\u002F All hits:\nworld.CollisionWorld.CastRay(input, ref NativeList\u003CRaycastHit> hits)\n\n\u002F\u002F Shape cast:\nworld.CollisionWorld.CastCollider(input, out ColliderCastHit hit)\n\n\u002F\u002F Nearest body to point:\nworld.CollisionWorld.CalculateDistance(input, out DistanceHit hit)\n\n\u002F\u002F Broad-phase AABB overlap:\nworld.CollisionWorld.OverlapAabb(input, ref NativeList\u003Cint> bodyIndices)\n```\n\n## Anti-Patterns\n- Forgetting CompleteDependencyBeforeRO\u003CPhysicsWorldSingleton>() — physics jobs may still be writing; safety error or silent corruption.\n- Using CollisionFilter.Default for all queries — hits every body; expensive in dense scenes.\n- Scheduling per-entity parallel raycasts via ScheduleParallel — CollisionWorld is shared read-only; batch into a single IJob.Schedule instead.\n- Querying inside FixedStepSimulationSystemGroup [UpdateBefore(PhysicsSystemGroup)] — world not yet built for this tick.\n\n## Runtime Risks\n- PhysicsWorldSingleton is valid only after PhysicsBuildWorldGroup completes — in SimulationSystemGroup it is always valid (physics runs in fixed step before simulation group).\n- ColliderCastInput contains an unsafe Collider pointer — requires [NativeDisableUnsafePtrRestriction] on the field in a job struct.\n- NativeList\u003CRaycastHit> allocated with Allocator.TempJob must be Disposed within 4 frames — or use WorldUpdateAllocator.\n\n## Performance Notes\n- Single raycast against well-built BVH: O(log N) — very fast.\n- Always use CollisionFilter to reduce candidates; batch multiple raycasts into one IJob.\n- For many queries per frame, pre-build a NativeArray\u003CRaycastInput> and process all in one IJobParallelFor.\n\n## Architecture Guidance\n- Place query systems in SimulationSystemGroup [UpdateAfter(TransformSystemGroup)] for up-to-date positions.\n- Always narrow CollisionFilter to minimum necessary layers — review with collision-filter-layer-masking skill.\n- Do not store PhysicsWorld reference across frames — rebuild from PhysicsWorldSingleton each OnUpdate.\n\n## Related Skills\n[[wave5-fixed-step-simulation-system-group]], [[wave5-collision-filter-layer-masking]], [[wave5-physics-velocity-force-application]], [[wave4-world-update-allocator-per-frame-native]]\n","# PhysicsWorldSingleton Spatial Queries\n\n## Intent\nPerform runtime spatial queries (raycast, collider cast, distance, overlap) against the Unity Physics collision world using PhysicsWorldSingleton.\n\n## Use When\n- Line-of-sight checks, ground detection, projectile trajectory, AOE range detection\n- Spatial queries against current physics world state (after world build)\n\n## Avoid When\n- Queries inside FixedStepSimulationSystemGroup before PhysicsBuildWorldGroup — world not yet built\n- Per-entity collision response — use trigger\u002Fcollision event buffers instead\n\n## Senior Pattern\n```csharp\n[UpdateInGroup(typeof(SimulationSystemGroup))]\n[BurstCompile]\npublic partial struct RaycastSystem : ISystem\n{\n    [BurstCompile]\n    public void OnUpdate(ref SystemState state)\n    {\n        \u002F\u002F Complete physics jobs before reading PhysicsWorldSingleton:\n        state.EntityManager.CompleteDependencyBeforeRO\u003CPhysicsWorldSingleton>();\n\n        var physicsWorld = SystemAPI.GetSingleton\u003CPhysicsWorldSingleton>().PhysicsWorld;\n\n        state.Dependency = new RaycastJob\n        {\n            World = physicsWorld.CollisionWorld,\n            Input = new RaycastInput\n            {\n                Start = float3.zero,       \u002F\u002F replace with actual origin\n                End = float3.zero + math.forward() * 100f,\n                Filter = new CollisionFilter\n                {\n                    BelongsTo = ~0u,\n                    CollidesWith = 1u \u003C\u003C 0,  \u002F\u002F target layer only\n                    GroupIndex = 0\n                }\n            },\n            Hits = new NativeList\u003CRaycastHit>(Allocator.TempJob)\n        }.Schedule(state.Dependency);\n    }\n}\n\n[BurstCompile]\npublic struct RaycastJob : IJob\n{\n    [ReadOnly] public CollisionWorld World;\n    public RaycastInput Input;\n    public NativeList\u003CRaycastHit> Hits;\n\n    public void Execute() { World.CastRay(Input, ref Hits); }\n}\n```\n\nAvailable query types:\n```csharp\n\u002F\u002F Single closest hit:\nworld.CollisionWorld.CastRay(input, out RaycastHit hit)\n\n\u002F\u002F All hits:\nworld.CollisionWorld.CastRay(input, ref NativeList\u003CRaycastHit> hits)\n\n\u002F\u002F Shape cast:\nworld.CollisionWorld.CastCollider(input, out ColliderCastHit hit)\n\n\u002F\u002F Nearest body to point:\nworld.CollisionWorld.CalculateDistance(input, out DistanceHit hit)\n\n\u002F\u002F Broad-phase AABB overlap:\nworld.CollisionWorld.OverlapAabb(input, ref NativeList\u003Cint> bodyIndices)\n```\n\n## Anti-Patterns\n- Forgetting CompleteDependencyBeforeRO\u003CPhysicsWorldSingleton>() — physics jobs may still be writing; safety error or silent corruption.\n- Using CollisionFilter.Default for all queries — hits every body; expensive in dense scenes.\n- Scheduling per-entity parallel raycasts via ScheduleParallel — CollisionWorld is shared read-only; batch into a single IJob.Schedule instead.\n- Querying inside FixedStepSimulationSystemGroup [UpdateBefore(PhysicsSystemGroup)] — world not yet built for this tick.\n\n## Runtime Risks\n- PhysicsWorldSingleton is valid only after PhysicsBuildWorldGroup completes — in SimulationSystemGroup it is always valid (physics runs in fixed step before simulation group).\n- ColliderCastInput contains an unsafe Collider pointer — requires [NativeDisableUnsafePtrRestriction] on the field in a job struct.\n- NativeList\u003CRaycastHit> allocated with Allocator.TempJob must be Disposed within 4 frames — or use WorldUpdateAllocator.\n\n## Performance Notes\n- Single raycast against well-built BVH: O(log N) — very fast.\n- Always use CollisionFilter to reduce candidates; batch multiple raycasts into one IJob.\n- For many queries per frame, pre-build a NativeArray\u003CRaycastInput> and process all in one IJobParallelFor.\n\n## Architecture Guidance\n- Place query systems in SimulationSystemGroup [UpdateAfter(TransformSystemGroup)] for up-to-date positions.\n- Always narrow CollisionFilter to minimum necessary layers — review with collision-filter-layer-masking skill.\n- Do not store PhysicsWorld reference across frames — rebuild from PhysicsWorldSingleton each OnUpdate.\n\n## Related Skills\n[[wave5-fixed-step-simulation-system-group]], [[wave5-collision-filter-layer-masking]], [[wave5-physics-velocity-force-application]], [[wave4-world-update-allocator-per-frame-native]]\n",{"name":5,"tags":36,"metadata":37,"description":7},[21,27,22],{"tier":38,"internal-only":39},3,true,"main","fe4746b9f07e6c7c2b6d3932002183af9b9f6fa2",".claude\u002Fskills\u002Funity-dots\u002Fwave5-physics-world-singleton-queries",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":49,"prompt":59,"zipAvailable":39},[50,53,56],{"tool":51,"command":52},"npx","npx skills add dyCuong03\u002Funity-agent-team --skill wave5-physics-world-singleton-queries",{"tool":54,"command":55},"bunx","bunx skills add dyCuong03\u002Funity-agent-team --skill wave5-physics-world-singleton-queries",{"tool":57,"command":58},"pnpm","pnpm dlx skills add dyCuong03\u002Funity-agent-team --skill wave5-physics-world-singleton-queries","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdyCuong03\u002Funity-agent-team\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Funity-dots\u002Fwave5-physics-world-singleton-queries\u002FSKILL.md",[],[62,87,110,134,153,174],{"skillNo":63,"name":64,"nameZh":6,"description":65,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":66,"categories":67,"keywords":68,"publishedAt":31},"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",[],[69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86],"update","dots update groups","boundary","simulation","how","system","choose","work","use","never","peer","deterministic","how to","coupling","ecs","bugs","frame","value",{"skillNo":88,"name":89,"nameZh":6,"description":90,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":91,"categories":92,"keywords":93,"publishedAt":31},"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",[],[94,95,96,97,71,74,98,99,77,100,28,101,102,103,104,105,106,107,108,109],"patterns","transform","dots transform patterns","components","mount","model","cost","systems","input","with","matrix","socket","at","child","custom","hierarchy",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":121,"publishedAt":31},"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",[116],{"categoryNo":117,"categoryName":118,"taxonomyType":119,"taxonomyTypeDesc":120},"01JBSEEDCAT000000000000037","律师与法务","PROFESSION","适用职业",[94,22,122,123,124,125,126,74,99,77,127,128,129,28,130,131,103,85,132,133],"dots singleton patterns","component","config","state","game","writer","time","shared","contract","as","ecb","gating",{"skillNo":135,"name":136,"nameZh":6,"description":137,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":138,"categories":139,"keywords":140,"publishedAt":31},"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",[],[141,142,143,144,97,125,71,145,146,76,147,148,77,28,149,29,102,150,151,152],"bridge","hybrid","dots hybrid bridge","mesh","assets","Rules","read","view","trigger","material","for","managed",{"skillNo":154,"name":155,"nameZh":6,"description":156,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":157,"categories":158,"keywords":159,"publishedAt":31},"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",[],[160,161,83,162,163,97,164,165,166,99,76,167,168,94,169,170,102,171,172,173],"event driven","driven","event","dots event driven ecs","change","ui","network","command","anti-patterns","pattern","structural","events","static","request",{"skillNo":175,"name":176,"nameZh":6,"description":177,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":178,"categories":179,"keywords":191,"publishedAt":31},"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",[180,185,188],{"categoryNo":181,"categoryName":182,"taxonomyType":183,"taxonomyTypeDesc":184},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":186,"categoryName":187,"taxonomyType":183,"taxonomyTypeDesc":184},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":189,"categoryName":190,"taxonomyType":183,"taxonomyTypeDesc":184},"01JBSEEDCAT000000000000023","Skill与智能体开发",[192,193,194,195,196,197,198,199,200,201,202,203,204,205,29,206,151],"valid skill","valid","code review","testing","review","test","routing","code","validation","projects","fixture skill","task","fixture","basic","complete"]