Files
DepthsOfGreed/Assets/Scripts/Enemy.cs
T
2026-10-07 14:40:02 +02:00

137 lines
2.8 KiB
C#

using UnityEngine;
public class Enemy : MonoBehaviour, IMovementDirection
{
[Header("Movement")]
[SerializeField]
private float moveSpeed = 2f;
[SerializeField]
private float targetReachedDistance = 0.1f;
private EnemyTargetManager targetManager;
private Transform currentTarget;
// Wird von CharacterRotation verwendet.
public Vector2 MovementDirection { get; private set; }
private void Awake()
{
targetManager =
FindFirstObjectByType<EnemyTargetManager>();
if (targetManager == null)
{
Debug.LogError(
"Enemy: Kein EnemyTargetManager gefunden!",
this
);
}
}
private void OnEnable()
{
if (targetManager != null)
{
targetManager.OnTargetsChanged +=
SelectClosestTarget;
}
}
private void OnDisable()
{
if (targetManager != null)
{
targetManager.OnTargetsChanged -=
SelectClosestTarget;
}
}
private void Start()
{
if (targetManager == null)
return;
SelectClosestTarget();
}
private void Update()
{
if (targetManager == null)
return;
// Kein aktuelles Ziel vorhanden.
if (currentTarget == null)
{
MovementDirection = Vector2.zero;
SelectClosestTarget();
return;
}
// Das aktuelle Ziel wurde deaktiviert.
if (!currentTarget.gameObject.activeInHierarchy)
{
SelectClosestTarget();
return;
}
MoveTowardsTarget();
// Ziel erreicht.
if (HasReachedTarget())
{
SelectClosestTarget();
}
}
private void SelectClosestTarget()
{
if (targetManager == null)
return;
currentTarget =
targetManager.GetClosestActiveTarget(
transform.position
);
if (currentTarget == null)
{
MovementDirection = Vector2.zero;
}
}
private void MoveTowardsTarget()
{
if (currentTarget == null)
return;
Vector3 direction =
currentTarget.position - transform.position;
MovementDirection = new Vector2(
direction.x,
direction.y
).normalized;
transform.position = Vector3.MoveTowards(
transform.position,
currentTarget.position,
moveSpeed * Time.deltaTime
);
}
private bool HasReachedTarget()
{
if (currentTarget == null)
return false;
return Vector3.Distance(
transform.position,
currentTarget.position
) <= targetReachedDistance;
}
}