(I am a newbie and don’t have much idea yet)
We all were newbs at one time. You’ll learn as you go, just stick to it.
This is going to be a long post so bare with me.
UE is built on C++, so even though you are working with Blueprints you are still bound to the C++ paradigm. That being said you have to wrap your head around working with references, class inheritance etc.
If your controller class needs specific data about your character or wants to call an event on the class you need a reference. References are essentially pointers to the specific instance. Using Get Controlled Pawn
will give you some access, but not all. You will need to cast. If you’re casting to a actor a lot you should just create a reference variable and save some resources.
When our pawn is spawned in we should be “Polling” any and all components and classes that we will be referencing often. The same applies to the controller.
Polling is the process where the computer or controlling device waits for an external device to check for it’s readiness or state.
That’s a generalized C/C++ definition, yet it’s accurate enough.
Characters aren’t possessed by controllers instantaneously. The Game mode spawns the authoritative pawn in its sim and then possession takes place. Once replicated (spawned on our screen) we can then and only then reference them.
So for example if in the controller Begin Play we get controlled pawn, cast to character class, this will generally fail. Will definitely fail in a multiplayer setting. “Access None” errors every time we try to use the reference variable. Yet by adding a delay to the begin play we give replication (networking) time to get the pawn and spawn it. This is the general ‘wide use’ hack.
Polling is the proper way.

Begin Play → Poll References
If the reference cannot be set on the first call of the function it will init the Polling loop.
You can add a sequence node to the function and poll many different references in a single function.
When a player dies we should technically be re-using the pawn. Unpossess it, teleport it to the spawn location, reinitialize it, then possess and go.
Regardless the approach we should restart that polling process to ensure we have up to date and accurate references.
On Death functionality should nullify the reference variable after the destroy actor node is called. Or at least have an event in the controller and elsewhere that clears them.
Simply “setting” a variable with no input will clear them.

Hope this was helpful.