Unity 2D RPG项目---敌人状态机框架

文章目录

概要

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();
    }
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值