What is the correct way to access instanced objects?

Hello,

I have been having trouble understanding how to work with the UE4 base classes when they are so tightly formed.

For example, when inheriting from a class such as the GameMode and defining my own functions I’m left wandering around looking for some other built in function that references something like the PlayerController or GameState to call my custom function and pass the instanced PlayerController or PlayerState.

In a multiplayer game where each individual PlayerState or PlayerController matters, how would I go about grabbing the PlayerState or PlayerController I need? I can of course make a giant list with all the PlayerControllers or some other goofy method of doing it, but I want to know what the correct way to do this in order to mesh with the Unreal Engine without having to form my own mess of a pattern within the code base.

For a more generalized question, how do I properly pass the objects such as PlayerController, PlayerState, or whatever else to functions I create? What is the proper design pattern for this in such a massive codebase like UE4 where many things are already defined for you?