NS-23: Skip move_and_slide when idle on floor (stop rest jitter)

Zero-velocity move_and_slide each physics tick still reapplies floor snap and
collision, which often reads as vibration. If there is no walk goal (or we
just arrived), velocity is zero, and is_on_floor(), return early.
pull/23/head
VinPropane 2026-04-05 02:06:06 -04:00
parent 6c73557c3b
commit 39b4760270
1 changed files with 11 additions and 0 deletions

View File

@ -7,6 +7,9 @@ extends CharacterBody3D
## distance, bounds) is server MoveCommand only — not reimplemented here.
##
## Nav detours except when goal Y is below us: then xz toward goal (waypoints sit under bump rims).
##
## Idle: skip `move_and_slide()` when on floor and velocity is zero — repeated slide + floor snap
## causes visible micro-vibration at rest.
const MOVE_SPEED: float = 5.0
const ARRIVE_EPS: float = 0.35
@ -54,9 +57,15 @@ func _set_horizontal_velocity_toward(point: Vector3) -> void:
velocity.y = 0.0
func _skip_move_when_idle_on_floor() -> bool:
return is_on_floor() and velocity.length_squared() < 1e-12
func _physics_process(_delta: float) -> void:
if not _has_walk_goal:
velocity = Vector3.ZERO
if _skip_move_when_idle_on_floor():
return
move_and_slide()
return
@ -67,6 +76,8 @@ func _physics_process(_delta: float) -> void:
velocity = Vector3.ZERO
_has_walk_goal = false
_nav_agent.set_target_position(global_position)
if _skip_move_when_idle_on_floor():
return
move_and_slide()
return