using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public abstract class State {
protected Enemy enemy;
protected Transform player;
public State(Enemy enemy, Transform player) {
this.enemy = enemy;
this.player = player;
}
protected Vector3 getRandomLocation(float radius) {
return enemy.transform.position + new Vector3(
Random.Range(radius * -1f, radius * 1f),
0f,
Random.Range(radius * -1f, radius * 1f));
}
public abstract State HandleInput();
public abstract void DoAction();
public virtual void Enter() {}
public virtual void Exit() {}
}
// 示例子类实现
public class ChaseState : State {
private float chaseSpeed = 5f;
private float chaseDistanceThreshold = 10f;
public ChaseState(Enemy enemy, Transform player) : base(enemy, player) {}
public override void Enter() {
Debug.Log("Entering Chase State");
enemy.SetColor(Color.red); // 假设Enemy有这个方法
}
public override void DoAction() {
// 向玩家移动
Vector3 direction = (player.position - enemy.transform.position).normalized;
enemy.transform.position += direction * chaseSpeed * Time.deltaTime;
// 旋转面向玩家
enemy.transform.LookAt(player);
}
public override State HandleInput() {
// 如果玩家距离超过阈值,切换到巡逻状态
if(Vector3.Distance(enemy.transform.position, player.position) > chaseDistanceThreshold) {
return new PatrolState(enemy, player);
}
// 如果玩家在攻击范围内,切换到攻击状态
if(Vector3.Distance(enemy.transform.position, player.position) < 2f) {
return new AttackState(enemy, player);
}
return this;
}
public override void Exit() {
Debug.Log("Exiting Chase State");
}
}
public class PatrolState : State {
private float patrolSpeed = 2f;
private float patrolRadius = 5f;
private Vector3 patrolTarget;
public PatrolState(Enemy enemy, Transform player) : base(enemy, player) {
patrolTarget = getRandomLocation(patrolRadius);
}
public override void Enter() {
Debug.Log("Entering Patrol State");
enemy.SetColor(Color.green);
}
public override void DoAction() {
// 向巡逻目标移动
Vector3 direction = (patrolTarget - enemy.transform.position).normalized;
enemy.transform.position += direction * patrolSpeed * Time.deltaTime;
// 如果到达目标点,获取新的巡逻点
if(Vector3.Distance(enemy.transform.position, patrolTarget) < 0.5f) {
patrolTarget = getRandomLocation(patrolRadius);
}
}
public override State HandleInput() {
// 如果玩家进入视野,切换到追逐状态
if(Vector3.Distance(enemy.transform.position, player.position) < 5f) {
return new ChaseState(enemy, player);
}
return this;
}
public override void Exit() {
Debug.Log("Exiting Patrol State");
}
}
public class AttackState : State {
private float attackCooldown = 1f;
private float lastAttackTime;
public AttackState(Enemy enemy, Transform player) : base(enemy, player) {
lastAttackTime = Time.time;
}
public override void Enter() {
Debug.Log("Entering Attack State");
enemy.SetColor(Color.yellow);
}
public override void DoAction() {
// 攻击逻辑
if(Time.time - lastAttackTime >= attackCooldown) {
Debug.Log("Attacking Player!");
lastAttackTime = Time.time;
}
}
public override State HandleInput() {
// 如果玩家距离过远,切换到追逐状态
if(Vector3.Distance(enemy.transform.position, player.position) > 2f) {
return new ChaseState(enemy, player);
}
return this;
}
public override void Exit() {
Debug.Log("Exiting Attack State");
}
}