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.