Input best practices within Unreal's game framework

Hey folks. I’m new to Unreal and trying to understand the game framework and best practices. I wouldn’t say it’s exactly clear in the documentation, tutorials, or samples (they all seem to approach it in different ways).

I’ve put together something that, in my opinion, fits the paradigm (Pawn ↔ Controller), and I’d like to sense-check it with you all.

I’ve created three input actions, Move, Look, and Jump, and an input mapping context:

I’ve then defined a Blueprint Interface that any Pawn in my game can implement if they can/will be moved by the player (or perhaps some other system).

In my Player Controller, I’ve set up the Input Mapping Context and hooked up the various Input Action events to call the Interface methods on the currently possessed Pawn (I haven’t shown all code here for the sake of brevity):

The Pawn then implements the required interface methods and defines its behaviour for each command:

The result is a clear separation of concerns and an extensible system:

  1. The player controller looks after input and any other logic related to controlling pawns.
  2. The Pawn defines its behaviour and is decoupled from the raw input events.
  3. The player can now possess any pawn in the game with the movement interface and control it.
  4. Pawns respond to commands, meaning that they can be controlled easily by any system (not limited to player controllers, think: AI).

I’d love to hear your thoughts, especially since I’m new to Unreal and may be overlooking something significant here, or misunderstanding the intended relationship of Player Controllers and Pawns.