classDiagram
M_Test *-- GM_Test
M_Test *-- BP_Camera
M_Test *-- BP_Character
GM_Test o-- BP_Character
GM_Test o-- BP_BasicCamera
BP_BasicCamera *-- BP_StaticDistanceDeadZoneComponent
BP_BasicCamera *-- BP_BasicFixedPlaneDeadZoneComponent
BP_BasicCamera *-- BP_RayTraceFixedPlaneDeadZoneComponent
BP_CameraComponent <|-- BP_StaticDistanceDeadZoneComponent : Extends
BP_CameraComponent <|-- BP_FixedPlaneDeadZoneComponent : Extends
class E_CameraMode {
<<enumeration>>
StaticDistanceDeadZone
BasicFixedPlaneDeadZone
RayTraceFixedPlaneDeadZone
}
class GM_Test{
%% +RegisterPlayer(Player: int, Character: BP_Character)
%% +RegisterCamera(Mode: E_CameraMode, Camera, BP_Camera)
}
I created a simple GM_Test in the project to keep track of everything happening in this camera test setup. I’ve also set this Game Mode as my override for the map.

Each moveable character will call register player when they are spawned into the world. This allows us to keep track of all character that is on screen. For the Static Distance setup, we only care about player 1.

The camera blue print will register with the GM when it spawns in. If the camera supports multiple mode, it can register it self multiple times with the GM.

We keep the character very simple to keep our focus on the camera. Basic actor with a cylinder attached to it. We also set this as our default possessed pawn in GM_Test.
The initialization process is straightforward—it tracks the character and sets up input controls. Input initialization occurs during the Possessed event, ensuring it only applies to the character under player control.

Player registration happens at begin play, making character information immediately available to the camera through the GM.
Input handling for this character is very basic and gives us the ability to control the character.
