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 PatrolState : State {
private Vector3 targetPosition;
private float patrolRadius = 10f;
private float moveSpeed = 3f;
private float closeEnoughDistance = 1f;
public PatrolState(Enemy enemy, Transform player) : base(enemy, player) {
// 设置初始巡逻目标点
targetPosition = getRandomLocation(patrolRadius);
}
public override void Enter() {
Debug.Log("Entering Patrol State");
enemy.SetColor(Color.green); // 假设Enemy有改变颜色的方法
}
public override void DoAction() {
// 向目标点移动
enemy.transform.position = Vector3.MoveTowards(
enemy.transform.position,
targetPosition,
moveSpeed * Time.deltaTime);
// 如果到达目标点,获取新的巡逻点
if (Vector3.Distance(enemy.transform.position, targetPosition) < closeEnoughDistance) {
targetPosition = getRandomLocation(patrolRadius);
}
}
public override State HandleInput() {
// 如果玩家进入警戒范围,切换到追击状态
if (Vector3.Distance(enemy.transform.position, player.position) < enemy.alertRange) {
return new ChaseState(enemy, player);
}
// 如果敌人生命值低,切换到逃跑状态
if (enemy.health < enemy.lowHealthThreshold) {
return new FleeState(enemy, player);
}
// 否则保持当前状态
return this;
}
public override void Exit() {
Debug.Log("Exiting Patrol State");
}
}
// 示例状态实现 - 追击状态
public class ChaseState : State {
private float chaseSpeed = 5f;
private float attackRange = 2f;
public ChaseState(Enemy enemy, Transform player) : base(enemy, player) {}
public override void Enter() {
Debug.Log("Entering Chase State");
enemy.SetColor(Color.red);
}
public override void DoAction() {
// 向玩家移动
enemy.transform.position = Vector3.MoveTowards(
enemy.transform.position,
player.position,
chaseSpeed * Time.deltaTime);
// 面向玩家
enemy.transform.LookAt(player);
}
public override State HandleInput() {
// 如果玩家超出追击范围,返回巡逻状态
if (Vector3.Distance(enemy.transform.position, player.position) > enemy.chaseRange) {
return new PatrolState(enemy, player);
}
// 如果在攻击范围内,切换到攻击状态
if (Vector3.Distance(enemy.transform.position, player.position) < attackRange) {
return new AttackState(enemy, player);
}
// 如果生命值低,切换到逃跑状态
if (enemy.health < enemy.lowHealthThreshold) {
return new FleeState(enemy, player);
}
return this;
}
public override void Exit() {
Debug.Log("Exiting Chase State");
}
}
// 示例Enemy类框架
public class Enemy : MonoBehaviour {
public Transform player;
public float alertRange = 15f;
public float chaseRange = 20f;
public float lowHealthThreshold = 30f;
public float health = 100f;
private State currentState;
void Start() {
currentState = new PatrolState(this, player);
currentState.Enter();
}
void Update() {
// 处理状态转换
State newState = currentState.HandleInput();
if (newState != currentState) {
currentState.Exit();
currentState = newState;
currentState.Enter();
}
// 执行当前状态的行为
currentState.DoAction();
}
public void SetColor(Color color) {
// 实现改变颜色的逻辑
GetComponent<Renderer>().material.color = color;
}
}