Skip to content

Possession vs seat occupation

DRW supports two distinct paths for a player to control a vessel. They serve different gameplay shapes; this page is the decision guide.

The player becomes the vessel. Their controller is moved from the human pawn onto the VesselPawn. The character disappears (the vessel is now “the player”). On exit, the controller transfers back.

Driven by: VesselPossessionComponent on the player pawn: call RequestPossessVessel(VesselPawn). The Drone pawn that ships with DRW uses this path.

Use possession when:

  • The boat is the gameplay (most racing / arcade boating games).
  • You don’t need a visible character on the boat.
  • Single-driver only: possession is one controller per vessel.

The player’s character pawn stays the active pawn. They walk to a VesselSeat and occupy it. The seat at type Helm relays the character’s input to the vessel; passenger seats are passive.

Driven by: SeatOccupantComponent on the character pawn: call RequestOccupySeat(Seat).

Use seats when:

  • You need a visible character on the boat (survival, MMO, sailing sim).
  • You want passengers, gunners, or crew positions distinct from the helm.
  • Multiple players on one vessel is a goal: multi-crew sailing, raiding parties, cooperative galleon combat.

Nothing stops you from doing both in the same project. A common pattern:

  • Small player-only craft (jet ski, dinghy) → possession.
  • Large multi-crew craft (galleon, container ship) → seats.

You can also offer both on the same vessel: possessing a runabout for solo play while still exposing seats for a friend who joins later. The vessel doesn’t care; the controller swap and seat occupation are independent paths into SetInput().

ADRW_DronePawn::GetDroneState() returns either Flying or ControllingVessel. The vessel itself doesn’t distinguish: it just receives input from whoever is currently driving.