When to use which has always been a matter of confusion and obviously there’s more than one way to skin a cat, but let me give you a quick rundown on how I’ve been approaching it and how, from what I could grasp from Robo Recall, Unreal Tournament and the few glimpses of Paragon, Epic Games does it.
In the simplest terms - do not put asset code in C++. That’s it.
To be more specific, let’s imagine you are making Super Mario Bros. You would make a BaseCharacter C++ class that would define walking and jumping. You would then subclass that into PlayerCharacter and implement input there, etc.
But when it comes to making the red and green turtles, you wouldn’t make RedTurtleCharacter (remember, no asset-specific code), but a BP for each, overriding the red turtle’s “OnReachEdge” function and telling it to turn around.
Obviously this is a silly example, and there are exceptions. As an example, on the last GDC you could see a screenshot from the editor with Paragon open, showing that each hero has a parent C++ class for their animation blueprints, but as a general rule of thumb, keep asset-specific stuff in BPs so that your assets are self-contained.
As for learning BP… since you’ve been coding already there are only 2 things that are kind of non-obvious pitfalls - and & or nodes do not short circuit, but evaluate everything even if they don’t have to; and if you have a pure function (which in BP means that it has no white execution line) and hook its output to more than 1 place, it will call the function once for each hook. It is better to store the result in a local var and hook that up to wherever you need it.