Sprite flips depending on movement direction

This commit is contained in:
Michal Pikulski
2025-09-09 14:01:17 +02:00
parent ccdc80e89e
commit cfa3c32657
2 changed files with 42 additions and 1 deletions

View File

@@ -23,6 +23,7 @@ namespace Input
// Note: String-based property lookup is flagged as inefficient, but is common in Unity for dynamic children. // Note: String-based property lookup is flagged as inefficient, but is common in Unity for dynamic children.
private Animator animator; private Animator animator;
private Transform artTransform; private Transform artTransform;
private SpriteRenderer spriteRenderer;
// --- MoveToAndNotify State --- // --- MoveToAndNotify State ---
public delegate void ArrivedAtTargetHandler(); public delegate void ArrivedAtTargetHandler();
@@ -39,6 +40,11 @@ namespace Input
animator = artTransform.GetComponent<Animator>(); animator = artTransform.GetComponent<Animator>();
else else
animator = GetComponentInChildren<Animator>(); animator = GetComponentInChildren<Animator>();
// Cache SpriteRenderer for flipping
if (artTransform != null)
spriteRenderer = artTransform.GetComponent<SpriteRenderer>();
if (spriteRenderer == null)
spriteRenderer = GetComponentInChildren<SpriteRenderer>();
} }
void Start() void Start()
@@ -169,16 +175,30 @@ namespace Input
if (animator != null && aiPath != null) if (animator != null && aiPath != null)
{ {
float normalizedSpeed = 0f; float normalizedSpeed = 0f;
Vector3 velocity = Vector3.zero;
if (isHolding && GameManager.Instance.DefaultHoldMovementMode == GameSettings.HoldMovementMode.Direct) if (isHolding && GameManager.Instance.DefaultHoldMovementMode == GameSettings.HoldMovementMode.Direct)
{ {
normalizedSpeed = directMoveVelocity.magnitude / aiPath.maxSpeed; normalizedSpeed = directMoveVelocity.magnitude / aiPath.maxSpeed;
velocity = directMoveVelocity;
} }
else if (aiPath.enabled) else if (aiPath.enabled)
{ {
normalizedSpeed = aiPath.velocity.magnitude / aiPath.maxSpeed; normalizedSpeed = aiPath.velocity.magnitude / aiPath.maxSpeed;
velocity = aiPath.velocity;
} }
animator.SetFloat("Speed", Mathf.Clamp01(normalizedSpeed)); 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;
} }
} }

View File

@@ -29,6 +29,7 @@ public class FollowerController : MonoBehaviour
private float _currentSpeed = 0f; private float _currentSpeed = 0f;
private Animator _animator; private Animator _animator;
private Transform _artTransform; private Transform _artTransform;
private SpriteRenderer spriteRenderer;
private PickupItemData _currentlyHeldItem; private PickupItemData _currentlyHeldItem;
public PickupItemData CurrentlyHeldItem => _currentlyHeldItem; public PickupItemData CurrentlyHeldItem => _currentlyHeldItem;
@@ -83,10 +84,12 @@ public class FollowerController : MonoBehaviour
if (_artTransform != null) if (_artTransform != null)
{ {
_animator = _artTransform.GetComponent<Animator>(); _animator = _artTransform.GetComponent<Animator>();
spriteRenderer = _artTransform.GetComponent<SpriteRenderer>();
} }
else else
{ {
_animator = GetComponentInChildren<Animator>(); // fallback _animator = GetComponentInChildren<Animator>(); // fallback
spriteRenderer = GetComponentInChildren<SpriteRenderer>();
} }
} }
@@ -181,6 +184,14 @@ public class FollowerController : MonoBehaviour
_currentSpeed = Mathf.Max(_currentSpeed, minSpeed); _currentSpeed = Mathf.Max(_currentSpeed, minSpeed);
} }
Vector3 dir = (_targetPoint - transform.position).normalized; 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; transform.position += dir * _currentSpeed * Time.deltaTime;
} }
else else
@@ -202,6 +213,14 @@ public class FollowerController : MonoBehaviour
else if (_aiPath != null) else if (_aiPath != null)
{ {
normalizedSpeed = _aiPath.velocity.magnitude / _followerMaxSpeed; 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)); _animator.SetFloat("Speed", Mathf.Clamp01(normalizedSpeed));
} }
@@ -438,3 +457,5 @@ public class FollowerController : MonoBehaviour
} }
} }
} }