diff --git a/Assets/Scripts/Input/PlayerTouchController.cs b/Assets/Scripts/Input/PlayerTouchController.cs index 4a14c797..72b10696 100644 --- a/Assets/Scripts/Input/PlayerTouchController.cs +++ b/Assets/Scripts/Input/PlayerTouchController.cs @@ -23,6 +23,7 @@ namespace Input // Note: String-based property lookup is flagged as inefficient, but is common in Unity for dynamic children. private Animator animator; private Transform artTransform; + private SpriteRenderer spriteRenderer; // --- MoveToAndNotify State --- public delegate void ArrivedAtTargetHandler(); @@ -39,6 +40,11 @@ namespace Input animator = artTransform.GetComponent(); else animator = GetComponentInChildren(); + // Cache SpriteRenderer for flipping + if (artTransform != null) + spriteRenderer = artTransform.GetComponent(); + if (spriteRenderer == null) + spriteRenderer = GetComponentInChildren(); } void Start() @@ -169,16 +175,30 @@ namespace Input if (animator != null && aiPath != null) { float normalizedSpeed = 0f; + Vector3 velocity = Vector3.zero; if (isHolding && GameManager.Instance.DefaultHoldMovementMode == GameSettings.HoldMovementMode.Direct) { normalizedSpeed = directMoveVelocity.magnitude / aiPath.maxSpeed; + velocity = directMoveVelocity; } else if (aiPath.enabled) { normalizedSpeed = aiPath.velocity.magnitude / aiPath.maxSpeed; + velocity = aiPath.velocity; } - animator.SetFloat("Speed", Mathf.Clamp01(normalizedSpeed)); + SetSpriteFlip(velocity); + } + } + + private void SetSpriteFlip(Vector3 velocity) + { + if (spriteRenderer != null && velocity.sqrMagnitude > 0.001f) + { + if (velocity.x > 0.01f) + spriteRenderer.flipX = false; + else if (velocity.x < -0.01f) + spriteRenderer.flipX = true; } } diff --git a/Assets/Scripts/Movement/FollowerController.cs b/Assets/Scripts/Movement/FollowerController.cs index a0ba55e7..fc26d6c6 100644 --- a/Assets/Scripts/Movement/FollowerController.cs +++ b/Assets/Scripts/Movement/FollowerController.cs @@ -29,6 +29,7 @@ public class FollowerController : MonoBehaviour private float _currentSpeed = 0f; private Animator _animator; private Transform _artTransform; + private SpriteRenderer spriteRenderer; private PickupItemData _currentlyHeldItem; public PickupItemData CurrentlyHeldItem => _currentlyHeldItem; @@ -83,10 +84,12 @@ public class FollowerController : MonoBehaviour if (_artTransform != null) { _animator = _artTransform.GetComponent(); + spriteRenderer = _artTransform.GetComponent(); } else { _animator = GetComponentInChildren(); // fallback + spriteRenderer = GetComponentInChildren(); } } @@ -181,6 +184,14 @@ public class FollowerController : MonoBehaviour _currentSpeed = Mathf.Max(_currentSpeed, minSpeed); } Vector3 dir = (_targetPoint - transform.position).normalized; + // Sprite flipping based on movement direction + if (spriteRenderer != null && dir.sqrMagnitude > 0.001f) + { + if (dir.x > 0.01f) + spriteRenderer.flipX = false; + else if (dir.x < -0.01f) + spriteRenderer.flipX = true; + } transform.position += dir * _currentSpeed * Time.deltaTime; } else @@ -202,6 +213,14 @@ public class FollowerController : MonoBehaviour else if (_aiPath != null) { normalizedSpeed = _aiPath.velocity.magnitude / _followerMaxSpeed; + // Sprite flipping for pathfinding mode + if (spriteRenderer != null && _aiPath.velocity.sqrMagnitude > 0.001f) + { + if (_aiPath.velocity.x > 0.01f) + spriteRenderer.flipX = false; + else if (_aiPath.velocity.x < -0.01f) + spriteRenderer.flipX = true; + } } _animator.SetFloat("Speed", Mathf.Clamp01(normalizedSpeed)); } @@ -438,3 +457,5 @@ public class FollowerController : MonoBehaviour } } } + +