Hiya. I've been following Godot's development for a while now, and thought it was about time to pick it up and have a play with it. On paper I like the design philosophy of OO node trees, but in practice I'm struggling to work out how to actually structure anything larger than the demo projects. I've read through the documentation and searched around, but it's not clicking. I have been working primarily with UE4 and C++ for a number of years now, so I think my brain is having difficulties adapting.
So take, for example, character movement. In UE4, a simple character actor would have a root component, normally the physics body, which would handle purely physics behaviour, and then another component which handles purely movement behaviour. The movement component then queries its owner for its root component, and supplies it with force/velocity/position updates accordingly. Movement is encapsulated nicely, and doesn't need to know what the actual physics body is doing (for the most part). Then you can reuse that movement component on any number of actors, which could have entirely different components and component layouts.
In Godot, it seems as though the movement logic would have to belong to a script attached to the root node in order to move the current scene tree correctly, or else you would have to have the movement node reference the relative position of the tree's physics node by path, which feels horrible, and would also break completely if the node was added to a scene with a different structure. Likewise, moving all of the logic that requires access to other nodes to the top of the tree seems like a real easy way to end up with a blob class. Looking at the demos (which I appreciate are written to showcase certain features as simply as possible, so aren't exactly structural guidelines), this seems to be the case - mega controller scripts that handle input, movement, animation, everything.
So really what my question boils down to is: how do you effectively encapsulate logic and communication between nodes within the same scene for anything larger than a demo project? Firing signals off for mundane tasks like informing our owning node that we need to move doesn't seem like the answer, but neither does referencing nodes by relative path or moving all logic to the root node. Is there some key design philosophy here that I'm missing? Am I too far gone in UE4 land to save?
Thanks for reading my ramblings all! I hope someone can unfuddle my brain, 'cause I really want to like Godot!
tl;dr How should you approach logic encapsulation in Godot while avoiding a blob root script and referencing nodes by path?