TowerDefenseGame/Assets/Scripts/Runtime/AI/EnemyManager/GoblerStateManager.cs
Nico 4fe5fb18e8 Recreate enemy management
Remove separate states
Will contain all states in one type of enemy management script
Will use enemy manager to update states of each enemy and spawning
2025-07-09 09:54:28 -07:00

180 lines
3.9 KiB
C#

using AI.Base;
using NUnit.Framework.Internal.Execution;
using System;
using System.Collections.Generic;
using System.Xml.Linq;
using UnityEngine;
public class GoblerStateManager {
[Header("Mechanics Attributes")]
[SerializeField] public float ChaseDistance = 10f;
[SerializeField] public float ChaseDistanceBuffer = 1f;
[SerializeField] public float AttackDistance = 1f;
[SerializeField] public float AttackMaskDiameter = 1f;
[Header("Enemy Attributes")]
[SerializeField] public float Attack = 10f;
[SerializeField] public float Speed = 10f;
[SerializeField] public float Health = 10f;
[SerializeField] public float Energy = 10f;
private Player Player { get { return Player.Instance; } }
private Transform PlayerTransform { get { return Player.transform; } }
private Vector2 PlayerPos { get { return PlayerTransform.position; } }
private GameObject Owner;
private Transform MyTransform { get { return Owner.transform; } }
private Vector2 MyPos { get { return MyTransform.position; } set { MyTransform.position = value; } }
public GoblerStateManager(GameObject owner) {
Owner = owner;
EnemySpawnerManager.UpdateTick += Update;
EnemySpawnerManager.GizmoTick += OnDrawGizmos;
}
public float DistFromPlayer { get; private set; }
public float DistFromCrystal { get; private set; }
public State CurrentState;
public enum State {
None,
GoToCrystal,
AttackCrystal,
ChasePlayer,
AttackPlayer,
Damaged,
Die
}
protected void SetPriorityState() {
if (CurrentState == State.ChasePlayer) return;
if (CurrentState == State.Damaged) return;
if (CurrentState == State.Die) return;
if (DistFromPlayer > ChaseDistance) return;
SetState(State.ChasePlayer);
}
private bool IsUpdating;
protected void Update() {
if (Owner == null) return;
if (IsUpdating) return;
IsUpdating = true;
DistFromPlayer = Vector2.Distance(MyPos, PlayerPos);
SetPriorityState();
switch (CurrentState) {
case State.None:
break;
case State.GoToCrystal:
break;
case State.AttackCrystal:
break;
case State.ChasePlayer:
MyPos += (PlayerPos - MyPos).normalized * Speed * Time.deltaTime;
if (DistFromPlayer >= ChaseDistance + ChaseDistanceBuffer)
SetState(State.AttackCrystal);
else if (DistFromPlayer < 1)
SetState(State.Die);
break;
case State.AttackPlayer:
break;
case State.Damaged:
break;
case State.Die:
EnemySpawnerManager.RemoveGobler(this);
SetState(State.None);
break;
}
IsUpdating = false;
}
protected void SetState(State newState) {
CurrentState = newState;
switch (CurrentState) {
case State.None:
break;
case State.GoToCrystal:
break;
case State.AttackCrystal:
break;
case State.ChasePlayer:
break;
case State.AttackPlayer:
break;
case State.Damaged:
break;
case State.Die:
break;
}
}
protected void OnDrawGizmos() {
if (Owner == null) return;
DrawChaseDistance();
DrawAttackDistance();
DrawAttackReach();
}
private void DrawChaseDistance() {
Gizmos.color = Color.green;
Vector2 center = MyPos;
Gizmos.DrawWireSphere(center, ChaseDistance);
}
private void DrawAttackDistance() {
//Gizmos.color = CurrentState == (IState)AttackState ? Color.red : Color.green;
//Vector2 center = this.transform.position;
//Gizmos.DrawWireSphere(center, AttackDistance);
}
private void DrawAttackReach() {
//if (CurrentState != (IState)AttackState) return;
Gizmos.color = Color.red;
Vector2 direction2D = (PlayerPos - MyPos).normalized;
Vector2 point2D = MyPos + direction2D * AttackDistance;
Gizmos.DrawWireSphere(point2D, AttackMaskDiameter);
}
}