feat: LMB-Kameraorbit ohne Einfluss auf Bewegungsrichtung

- _movement_yaw eingeführt: wird nur aktualisiert wenn LMB NICHT gedrückt ist
- dir3 und Souls-Rotation nutzen _movement_yaw statt camera_pivot.world_yaw direkt
- _do_roll nutzt ebenfalls _movement_yaw als Referenz im Souls-Modus
- Verhindert dass LMB-Kameraorbit die Laufrichtung oder Characterrotation ändert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Andre 2026-03-16 22:43:48 +01:00
parent 394b3a89b8
commit 752086bd1b

View file

@ -148,6 +148,10 @@ var is_rolling: bool = false
var roll_direction: Vector3 = Vector3.ZERO
var roll_cooldown: float = 0.0
const ROLL_COOLDOWN: float = 1.5
# Eingefrорener Kamerawinkel für Bewegungsberechnung:
# wird nur aktualisiert wenn LMB NICHT gedrückt ist, damit
# LMB-Kamerarotation die Laufrichtung nicht verändert
var _movement_yaw: float = 0.0
# ═══════════════════════════════════════════════════════════════
# NODE-REFERENZEN
@ -814,7 +818,7 @@ func _do_roll():
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_back")
var has_target = target != null and is_instance_valid(target)
if input_dir.length() > 0.1:
var ref_angle = rotation.y if (has_target or is_walking) else camera_pivot.world_yaw
var ref_angle = rotation.y if (has_target or is_walking) else _movement_yaw
roll_direction = Vector3(input_dir.x, 0, input_dir.y).rotated(Vector3.UP, ref_angle).normalized()
# Spieler in Roll-Richtung drehen, Kamera dabei kompensieren
var old_rot = rotation.y
@ -970,13 +974,18 @@ func _physics_process(delta):
# ── Bewegungsrichtung ────────────────────────────────────────────
# Souls: world_yaw (stabil, dreht sich nicht mit Spieler mit)
# Lock-On/Walk: rotation.y (Strafe relativ zur Spielerausrichtung)
var lmb = Input.is_mouse_button_pressed(MOUSE_BUTTON_LEFT)
# Bewegungs-Referenzwinkel einfrieren wenn LMB gedrückt
if not lmb:
_movement_yaw = camera_pivot.world_yaw
var dir3: Vector3
if has_target or is_walking:
dir3 = Vector3(input_dir.x, 0, input_dir.y).rotated(Vector3.UP, rotation.y)
else:
dir3 = Vector3(input_dir.x, 0, input_dir.y).rotated(Vector3.UP, camera_pivot.world_yaw)
dir3 = Vector3(input_dir.x, 0, input_dir.y).rotated(Vector3.UP, _movement_yaw)
# ── Souls-Rotation: Zielwinkel aus Kamera-world_yaw berechnen ───
# ── Souls-Rotation: Zielwinkel aus _movement_yaw berechnen ─────
# Nur vorwärts/diagonal (nicht S), nicht bei RMB, nicht Lock-On/Walk
if is_moving and not is_walking and not has_target and not is_rolling \
and input_dir.y < 0.1 and not Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):