Mask collision individually on CollisionShape3D children?

Godot Version

Godot 4.1.4.rc (compiled with Voxel tools addition): Releases · Zylann/godot_voxel · GitHub

Question

I have a Player(a CharacterBody3D) , with a Hitbox(a CollisionShape3D->BoxShape3D), and a auto-step-up for stepping single blocks in my blocky terrain named StepUpRay(a CollisionShape3D->SeparationRayShape3D) as children. Like so:

image

I have an issue with the Hitbox colliding with the terrain when stepping up, which gave me the thought that if I only let the StepUpRay collide with terrain I should get the smooth-er movement I want.

The issue is that I cannot use the collision mask on the CollisionShape3Ds, only the CharacterBody3D. As according to the documentation, ok.

But I expected the CollisionShape3Ds to have this masking property though, since they are the specific colliding elements, no?

I feel a bit lost now, should I create Area3D nodes or something similar for each of the CollisionShape3Ds so I can mask the Area3D nodes separately? Like this?:

image

But the Player is now missing its hitbox child!

I feel I completely misunderstand the collision mask… But what else is it used for if not for masking different types of collisions? Why are they not a property of the CollisionShape3D object instead? How should I implement what I want properly?

Help is appreciated!

The “Hitbox” should be a direct child of the Player the feet “StepUpRay” can be inside the Area3D “TerrainCollisionMask”. Your character will be the shape of “Hitbox” and the feet will only be a detection Area and can have a different mask from “Player”.

1 Like

Thanks for the help, I’m still not quite getting it to work…

It seems the TerrainCollisionMask is not detecting collisions at all regardless of collision layers & masking.

Current node setup:

image

I will read up on the proper node to use for masking the collision, but currently I don’t see why I should use anything but Area3D?

EDIT: I probably should show the properties of the TerrainCollisionMask as well:

What code are you using to detect the collision?

1 Like

This is pretty much all I have:

image

I just realized: is_on_floor() is decided by the Hitbox node. What I really want is for it to be the StepUpRay (I believe).

So this is how I’m thinking:

image

I think I won’t regret it in the future, hopefully… The hitbox should only be used for detecting being hit by stuff so this is an ok setup for me. I just have to rename the StepUpRay to something better since it represents the terrain-collision detection and not just detecting steps.

The Player can run around and not stumble on itself now at least!

Thanks for the help!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.