Blueprint pitfalls and death traps

Well, if we’re going to necro this one, I might as well make a new note…

My current principles are these: Every single base class is C++. All interfaces are defined in C++. Everything that isn’t completely trivial is C++.

Blueprints are, when used, strictly positioned as the final leaf node on the end of every branch, twig or sprout of the game code, and if anything even remotely complicated has to happen inside them, then that logic is swiftly packaged into a BP-callable native method. As soon as more than three wires are crossed in a graph, native code is written to replace that part of the graph. This has proved a reliable way to go about it so far, and it provides a crystal-clear demarcation between cosmetic/visual (BP) and everything else (C++).