---
title: Platforms & pawns
product: Advanced Framework Pro
version: 1.0
engine: Unreal Engine 5.8
updated: 2026-10-05
canonical: https://docs.human-codeable.com/concepts/platforms.html
---

# Platforms & pawns

The framework ships three pawn families — VR, desktop and mobile — each in a plain `Pawn` and a `Character` variant. Which one spawns is decided by the level's `PDA_Level` data asset, not by the level itself:

- **Dynamic** checks for a head-mounted display, then for an iOS or Android platform, then falls back to desktop.
- **Force VR / Force Mobile / Force Desktop** override the check, which is what you want when testing a specific target in the editor.

Because the decision lives in the level data asset and interactable actors talk to the player only through `ST_SourceInfo` and `BPI_PawnInfo`, the same level and the same content run on all three targets. What differs is which abilities each pawn carries.

The VR pawn spawns its motion controllers as actors attached to a `CameraHandle` that is separate from the actor root. That separation is what lets the capsule be recentred under the player's head (`Interface_RecenterCapsule`) and its height follow the player's real height (`AutoAdjustCapsuleHeight`) without dragging the tracked camera around. With no HMD present the controllers are still spawned but pinned to fixed offsets, so VR code paths stay exercised in a flat editor session.

Hand tracking is handled in C++. `UAFSHandTrackingSubsystem` exposes bone transforms, finger curl, bone distance and bone angle. `UAFSHandGestureDefinition` describes a gesture as a set of curl, distance and angle rules plus a hold time and a priority. When a gesture is recognised the framework **injects a synthetic input key** — `AFS_LeftHand_Pinch`, `AFS_RightHand_Fist` and so on — so gestures bind in Enhanced Input exactly like any other key, and no ability needs gesture-specific code. Mobile does the same with `Mobile_Tap`, `Mobile_Swipe` and friends.

![How PDA_Level resolves which pawn to spawn](../images/diagram_pawn_selection.svg?v=1d209611)

How PDA_Level resolves which pawn to spawn

![The VR pawn hierarchy and why CameraHandle is separate from the root](../images/diagram_vr_pawn_hierarchy.svg?v=b2b2a07e)

The VR pawn hierarchy and why CameraHandle is separate from the root
