ThirdPersonControllerComponent class Gameplay kit
High-level 3rd-person character movement component with ground raycast snapping, slope sliding, coyote time, and turn smoothing.
For physical character navigation against 3D colliders and capsules with autostep,
see KinematicCharacterController in package:flutter_scene/physics.dart.
Note on raycasting: raycastNode performs a hierarchical bounding-box early-out followed by per-triangle intersection tests on static render meshes at rest pose.
Constructors
- ThirdPersonControllerComponent({double walkSpeed = 4.5, double runMultiplier = 1.8, double turnSpeed = 12.0, bool rotatesToMovement = true, double jumpVelocity = 6.5, double gravity = 18.0, double maxSlopeAngleDegrees = 45.0, double coyoteTimeWindow = 0.12, double jumpBufferWindow = 0.15, double landingJumpDelay = 0.20, int groundLayerMask = 0xFFFFFFFF, double? groundPlaneHeight, double footOffset = 0.0, double obstacleRadius = 0.85, double obstacleHeight = 1.8})
Properties
- coyoteTimeWindow ↔ double
-
Time window (in seconds) after leaving a ledge during which a jump is still allowed.
getter/setter pair
- enabled ↔ bool
-
Whether this component's update hook runs each frame.
getter/setter pairinherited
- footOffset ↔ double
-
Vertical offset from the node origin down to the character's feet.
getter/setter pair
- gravity ↔ double
-
Downward gravitational acceleration.
getter/setter pair
- groundLayerMask ↔ int
-
Layer mask used for raycasting against static floor/ground geometry.
getter/setter pair
- groundNormal ↔ Vector3
-
Ground surface normal beneath the character.
getter/setter pair
- groundPlaneHeight ↔ double?
-
Optional fallback infinite planar floor height.
getter/setter pair
- hashCode → int
-
The hash code for this object.
no setterinherited
- isAttached → bool
-
Whether this component is currently attached to a node.
no setterinherited
- isGrounded ↔ bool
-
Whether the character is currently touching the ground.
getter/setter pair
- isLoaded → bool
-
Whether onLoad has completed.
no setterinherited
- isMounted → bool
-
Whether the owning node is part of a live scene graph.
no setterinherited
- jumpBufferWindow ↔ double
-
Time window (in seconds) during which a jump pressed before landing still fires.
getter/setter pair
- jumpVelocity ↔ double
-
Upward velocity impulse applied on jump.
getter/setter pair
- landingJumpDelay ↔ double
-
Delay after landing before another jump can be initiated (in seconds).
getter/setter pair
- maxSlopeAngleDegrees ↔ double
-
Maximum slope angle (in degrees) that can be walked up without sliding.
getter/setter pair
- node → Node
-
The node this component is attached to.
no setterinherited
- obstacleHeight ↔ double
-
Total capsule height for vertical obstacle collision scanning.
getter/setter pair
- obstacleRadius ↔ double
-
Capsule/cylinder radius for horizontal obstacle collision. Set to 0 to disable.
getter/setter pair
- rotatesToMovement ↔ bool
-
Whether the node is turned to face the movement direction. When false
the node keeps whatever rotation it has and only its position moves,
while yaw still tracks the heading for driving a child mesh or animation.
getter/setter pair
- runMultiplier ↔ double
-
Multiplier applied when sprinting.
getter/setter pair
- runtimeType → Type
-
A representation of the runtime type of the object.
no setterinherited
- turnSpeed ↔ double
-
Speed at which the character turns to face the movement direction (rad/s).
getter/setter pair
- velocity ↔ Vector3
-
Current linear velocity vector in world space.
getter/setter pair
- walkSpeed ↔ double
-
Base walking speed in world units per second.
getter/setter pair
- yaw → double
-
The smoothed heading, in radians about +Y, the character is turning
toward. Seeded from the node's rotation on the first step.
no setter
Methods
-
cloneFor(
Node cloneOwner) → Component? -
Returns a copy of this component for
cloneOwner, the Node.clone counterpart of the owning node, or null to not carry the component to clones (the default).override -
fixedUpdate(
double fixedDt) → void -
Called once per fixed physics step while the component is mounted,
enabled, and loaded.
fixedDtis the fixed timestep of the surrounding PhysicsWorld, not the frame interval.override -
jump(
) → void - Triggers a jump request (buffered if in mid-air).
-
noSuchMethod(
Invocation invocation) → dynamic -
Invoked when a nonexistent method or property is accessed.
inherited
-
onAttach(
) → void -
Called when this component is added to a node.
inherited
-
onDetach(
) → void -
Called when this component is removed from a node.
inherited
-
onLoad(
) → Future< void> -
Optional asynchronous setup, such as loading an asset.
inherited
-
onMount(
) → void -
Called when the owning node enters a live scene graph.
inherited
-
onUnmount(
) → void -
Called when the owning node leaves a live scene graph.
inherited
-
setMoveInput(
Vector2 input, {bool isRunning = false, double? cameraHeadingYaw}) → void -
Feeds planar movement input vector (-1.0 to 1.0 on X/Y, where +Y is forward)
and optional
cameraHeadingYawangle (in radians) so movement is relative to camera view. -
toString(
) → String -
A string representation of this object.
inherited
-
update(
double deltaSeconds) → void -
Called once per frame while the component is mounted, enabled, and
loaded.
deltaSecondsis the elapsed time since the previous tick. A traversal visits each component at most once. Removing this component or an earlier sibling is safe. A component inserted before the current traversal position starts on the next frame. Reordering component or child lists during traversal is unsupported.override
Operators
-
operator ==(
Object other) → bool -
The equality operator.
inherited