137 lines
2.8 KiB
C#
137 lines
2.8 KiB
C#
using UnityEngine;
|
|
|
|
public class Enemy : MonoBehaviour, IMovementDirection
|
|
{
|
|
[Header("Movement")]
|
|
[SerializeField]
|
|
private float moveSpeed = 0.5f;
|
|
|
|
[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;
|
|
}
|
|
}
|