feat: sdk collision layer for main player + corrections - #8865
Conversation
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
…t/collision-layer-main-player
This comment has been minimized.
This comment has been minimized.
|
PR #8865, run #27433993442 Builds: Windows change, Windows baseline, macOS change, macOS baseline How to read this table
Framework 13 i7
Exception breakdown
|
|
Claude finished @mikhail-dcl's task in 1m 3s —— View job Security-Focused Dependency & Prompt Review (re-synced — head
|
| File | Finding | Risk |
|---|---|---|
Plugins/DclNativeExitStopwatch.meta |
Deleted — orphaned .meta (guid only, no associated binary). Removing a dangling meta. |
🟢 Low |
Character Camera.prefab |
Unity prefab (collision-layer config for the feature). Not a native/managed binary. | 🟢 Low |
PhysicsLayers.Tests.asmref (added) |
References an in-repo assembly by GUID (da80994a…) — test-only. No precompiled/external assembly reference. |
🟢 Low |
DynamicsManager.asset, TagManager.asset |
Project-settings (new SDKAvatarHit layer + collision matrix). Feature config, no executable surface. |
🟢 Low |
No .dll/.so/.dylib/.bundle, no install/build hooks, no assembly-visibility escalation.
3. Prompt-file changes — 🟢 PASS
.claude/agents/dcl-sdk-feature-implementation/{dcl-sdk-specialist,dcl-test-scene-specialist}.md are Claude Code subagent definitions — not under .github/workflows/ or .github/prompts/, so they never execute with workflow secrets (W.1–W.10 don't apply).
dcl-sdk-specialist.md(+11): adds a ColliderLayer mask semantics reference section — pure domain documentation (mask qualification rules,SDKAvatarHitrouting). No tool/allowlist escalation, no network/filesystem directives.dcl-test-scene-specialist.md(+43/-9): adds a{x},{y}-{scene-name}folder-naming convention and a completion gate. Shell snippets (cp -r,ls,grep,mv,npm run build/check-parcels) are scoped to local test-scene authoring — no destructive GitHub ops, no secret reads, no exfil primitives, no untrusted-input interpolation.
No prompt-injection or privilege-escalation surface.
Verdict
No dependency, lockfile, manifest, asmdef, or native-binary surface relative to origin/dev; the deleted .meta is an orphaned no-binary file; the prompt-file changes are benign subagent documentation outside the secret-bearing workflow surface. No HIGH or MEDIUM findings.
DEPENDENCY_REVIEW: PASS
• feat/collision-layer-main-player @ 4968f764
Adds the
CL_MAIN_PLAYERcollider layer (replaces the unusedCL_RESERVED2) and unifies howRaycastandTriggerAreatreatColliderLayermasks for the local player avatar.What changed
CL_MAIN_PLAYER(value8) — targets the local player avatar specifically.CL_PLAYERandCL_MAIN_PLAYER; remote avatars carry onlyCL_PLAYER.RaycastandTriggerAreanow use the same constantPLAYER_QUALIFYING_BITS = CL_PLAYER | CL_MAIN_PLAYER.CL_PHYSICS,CL_POINTER,CL_CUSTOM*, andCL_NONEno longer hit / fire on the local player.MeshCollider/GltfContainer— masks containingCL_PLAYERorCL_MAIN_PLAYER(withoutCL_PHYSICS) now route to a new dedicated Unity layerSDKAvatarHit: raycast- and trigger-detectable, but the player capsule walks through (previously the collider was silently disabled). Mixing inCL_PHYSICSkeeps the mesh solid against the player.CL_MAIN_PLAYER-only trigger now skips remote-avatar overlaps inside the MonoBehaviour via the existingTargetTransformearly-out.AllAvatars→SDKAvatarTriggerArea— the layer slot (18) is unchanged, only the name changes. The old name was misleading (no avatars actually live on that layer; it hosts the avatar-targeting TriggerArea collider). Pairs cleanly with the existingSDKEntityTriggerAreaname. C# constant renamedPhysicsLayers.ALL_AVATARS→PhysicsLayers.SDK_AVATAR_TRIGGER_AREA.Behaviour comparison
BEFORE
CL_PLAYERCL_PHYSICSCL_POINTERaloneCL_CUSTOM*aloneCL_NONEThe two systems disagreed on every mask except
CL_PLAYER. (CL_MAIN_PLAYERdid not exist.)AFTER
CL_PLAYERCL_MAIN_PLAYERCL_PLAYER | CL_MAIN_PLAYERCL_PHYSICSCL_POINTERaloneCL_CUSTOM*aloneCL_NONEThe two systems now agree on every mask.
Migration note
Scenes that previously relied on
CL_PHYSICSraycasts to detect the local player must nowORCL_MAIN_PLAYER(orCL_PLAYER) into their mask. Walls-and-floors physics checks that do not target the player are unchanged.Related PRs
QA TEST INSTRUCTIONS
The test scene requires using 2 instances of the Explorer, however you have to focus on the outcome only looking at the behaviours in 1 of the 2 explorers. The other explorer is only used to move the "other avatar" around the test scene.
SETUP
Download the build from this PR and open it connected to the SEPOLIA (Switch MetaMask to the SEPOLIA network, not mainnet)
sdk7testscenes.dcl.ethworld and to position5,5:Windows
"C:\Users\[YOUR-USER]\Downloads\Decentraland_windows64\Decentraland.exe" --realm sdk7testscenes.dcl.eth --dclenv zone --position 5,5 --skip-version-check true --multi-instancemacOS
open -n Decentraland.app --args --realm sdk7testscenes.dcl.eth --dclenv zone --position 5,5 --skip-version-check true --multi-instance(Generic instructions to connect a custom build with app params at: https://github.com/decentraland/unity-explorer/blob/dev/docs/how-to-connect-to-a-local-scene.md)
OTHER-PLAYER AVATAR TEST
TRIGGER AREAS
RAYCAST
CL_PLAYERlayer and confirm that the other player avatar is detected by the raycastCL_PHYSICSlayer should be hitting the cube, not the other player avatar)MAIN-PLAYER AVATAR TEST
TRIGGER AREAS
RAYCAST
CL_PLAYERlayer and confirm that the main player avatar is detected by the raycast.CL_MAIN_PLAYERraycastCL_PHYSICSlayer should be hitting the cube, not the other player avatar)RAYCAST LAYERS TEST
When you click the raycast sphere, it will rotate to target a different cube.
Run a full round of different raycast layers for EACH cube confirming that the cubes are only detected when they contain the layer that the raycast is targetting.
DEMO VIDEO
Screen.Recording.2026-06-08.at.10.39.03.PM.mp4