概要
C#敌人状态机是一种基于状态的编程模式,用于管理敌人在游戏中的各种状态和行为。状态机通常被分为几个状态,例如待机、追逐、攻击和逃跑等。每个状态都具有特定的条件和动作,用于确定该状态下的敌人行为。状态机可以通过条件转换实现状态之间的转移,例如在追逐状态下,如果敌人距离玩家太远,则转换到待机状态。状态机可以帮助游戏开发者更好地掌控敌人行为,提高游戏逼真度和游戏体验。
整体架构流程
我们首先创建三个c#脚本
<EnemyStateMachine > <EnemyState> <Enemy>
Enemy 开始状态机
三个脚本中只有Enemy继承MonoBehaviour,在其中定义我们所需要的组件并持续更新整个状态机并传给游戏。
这里只设置可读属性:public Rigidbody2D rb { get; private set; }
受保护的组件可以避免我们在unity前端更改属性,造成前后端数据不一致的问题。
using UnityEngine;
public class Enemy : MonoBehaviour
{
//定义受保护得组件
public Rigidbody2D rb { get; private set; }
public Animator anim { get; private set; }
public EnemyStateMachine stateMachine{ get;private set; }
//唤醒控制器
private void Awake()
{
stateMachine=new EnemyStateMachine();
}
private void Update()
{
//持续更新敌人配置
stateMachine.currentState.Update();
}
}
EnemyState 状态配置参数
在这里我们定义三种状态Update(更新)Enter(进入) Exit(退出),将传来的参数进行处理并传给 Enemy 。定于状态行为,确定状态之间的转换条件,根据上一步确定的转换条件,实现状态转换的逻辑。可以使用状态机或者条件判断等方式实现。
using System.Collections;
using UnityEngine;
public class EnemyState
{
//状态机
protected EnemyStateMachine stateMachine;
//敌人
protected Enemy enemy;
//触发器
protected bool triggerCalled;
//定时器
protected float stateTimer;
//动画
private string animBoolName;
public EnemyState(Enemy _enemy,EnemyStateMachine _stateMachine,string _animBoolName)
{
this.enemy = _enemy;
this.stateMachine = _stateMachine;
this.animBoolName = _animBoolName;
}
//更新状态
public virtual void Update()
{
stateTimer-=Time.deltaTime;
}
//进入状态
public virtual void Enter() {
triggerCalled = false;
enemy.anim.SetBool(animBoolName, true);
}
//退出状态
public virtual void Exit()
{
enemy.anim.SetBool(animBoolName,false);
}
}
EnemyStateMachine 定义状态
using UnityEngine;
public class EnemyStateMachine
{
//敌人配置
public EnemyState currentState { get; private set; }
//初始化状态
public void Initialize(EnemyState _statrtState)
{
currentState = _statrtState;
currentState.Enter();
}
//改变状态
public void ChangeState(EnemyState _newState)
{
currentState.Exit();
currentState= _newState;
currentState.Enter();
}
}