93 lines
2.0 KiB
C#
93 lines
2.0 KiB
C#
using UnityEngine;
|
|
|
|
public class CharacterRotation : MonoBehaviour
|
|
{
|
|
[Header("Visual")]
|
|
[SerializeField]
|
|
private Transform visual;
|
|
|
|
[Header("Rotation")]
|
|
[SerializeField]
|
|
private float rotationSpeed = 540f;
|
|
|
|
[Tooltip("In welche lokale Richtung zeigt die Grafik standardm??ig?")]
|
|
[SerializeField]
|
|
private SpriteForwardDirection spriteForward =
|
|
SpriteForwardDirection.Up;
|
|
|
|
private IMovementDirection movement;
|
|
|
|
private enum SpriteForwardDirection
|
|
{
|
|
Up,
|
|
Right
|
|
}
|
|
|
|
private void Awake()
|
|
{
|
|
movement =
|
|
GetComponent<IMovementDirection>();
|
|
|
|
if (movement == null)
|
|
{
|
|
Debug.LogError(
|
|
"CharacterRotation ben?tigt eine Komponente, " +
|
|
"die IMovementDirection implementiert.",
|
|
this
|
|
);
|
|
}
|
|
|
|
if (visual == null)
|
|
{
|
|
Debug.LogError(
|
|
"CharacterRotation: Kein Visual zugewiesen.",
|
|
this
|
|
);
|
|
}
|
|
}
|
|
|
|
private void Update()
|
|
{
|
|
if (movement == null || visual == null)
|
|
return;
|
|
|
|
Vector2 direction =
|
|
movement.MovementDirection;
|
|
|
|
// Keine Bewegung -> aktuelle Rotation behalten.
|
|
if (direction.sqrMagnitude < 0.001f)
|
|
return;
|
|
|
|
RotateTowards(direction);
|
|
}
|
|
|
|
private void RotateTowards(Vector2 direction)
|
|
{
|
|
float targetAngle =
|
|
Mathf.Atan2(
|
|
direction.y,
|
|
direction.x
|
|
) * Mathf.Rad2Deg;
|
|
|
|
if (spriteForward ==
|
|
SpriteForwardDirection.Up)
|
|
{
|
|
targetAngle -= 90f;
|
|
}
|
|
|
|
Quaternion targetRotation =
|
|
Quaternion.Euler(
|
|
0f,
|
|
0f,
|
|
targetAngle
|
|
);
|
|
|
|
visual.rotation =
|
|
Quaternion.RotateTowards(
|
|
visual.rotation,
|
|
targetRotation,
|
|
rotationSpeed * Time.deltaTime
|
|
);
|
|
}
|
|
}
|