Hi! I recently started working on a 3D game. Key concept is that every character (player or enemy) is a robot and their bodies consist of several different "parts" which are connected to each other. Different part types inherit from PartBase class, which inherits from RigidBody3D. Every part object has a mesh, a collision shape and 0 or more AttachmentPoints. AttachmentPoint is a class which inherits from Node3D and is used to determine child part's position relative to parent part. This allows to connect parts into a tree-like structure, with 1 root part at its base. Finally, the root part is a child of a class I named PartAssembly, which will be used to move and control the whole structure. So, an example of a character's body structure in my game can be represented with this graph:

As you can see here, this structure consists of 5 parts. Part1 is a root part and is a direct child of PartAssembly, it also has 3 AttachmentPoints as its children. Parts 2 and 3 are children of Part1's AttachmentPoints 1 and 3 respectively. Parts 4 and 5 don't have AttachmentPoints.
This system worked great for me and I was able to build big part trees from my code.
However, I ran into several problems when deciding which class should PartAssembly inherit from. I wanted to make it so a character moves around but stops when it hits a wall. I tried two things:
- PartAssembly inherits from Node3D. In this case I move it by manually adding a Vector3 to PartAssembly's position during _process(). It moves, but it ignores all obstacles on its path (goes straight through walls). This behavior is expected, since Node3D doesn't care about physics.
- PartAssembly inherits from RigidBody3D. In this case, as soon as I play the scene, it falls straight through the floor (even if Freeze option of PartAssembly is turned on, which is weird). I suspect it happens because PartAssembly itself doesn't have any collision, only its children (direct and indirect) do, but Godot doesn't recognize this.
So my question is: How do I make a RigidBody3D recognize and use colliders which are not its direct children? Is it possible to make it so PartAssembly's collision is comprised of all the parts' collisions which are in the tree? Or is my approach just inherently wrong and I should do something else for movement, like casting a ray in front of a character and checking if it intersects a wall? I'm new to game development, so any help is greatly appreciated.