unity怪物的状态机

这篇博客详细介绍了如何在Unity中实现怪物的行为状态机,包括FollowState(跟随状态)、AttackState(攻击状态)、PartrolState(巡逻状态)和DeathState(死亡状态)。状态机类FSM管理各个状态的注册、移除、切换和更新,使得怪物能够根据不同的场景条件智能地改变行为。同时,展示了状态的进入、退出和更新逻辑,以及在不同状态之间的切换条件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public enum StateType:byte
{
    Follow, //追踪
    Attack,  //攻击
    Partrol,//巡逻
    Death //死亡
}


/// <summary>
/// 所有的具体状态都实现这个接口
/// </summary>
public interface IState
{
    FSM fsm { get; set; } //所属的状态机

    StateType stateType { get; }  /// 状态类型。

    void EnterState(); //状态进入

    void StateUpdate(float deltaTime); ///状态更新

    void StateLateUpdate(float deltaTime);

    void ExitState(); //状态退出
}

**************************************************************************************************************



using System;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 状态机类,管理各个状态实例。
/// 作用
/// 1.把能够切换管理的各个状态注册到状态机里。
///  2.移除状态
/// 3.在各个状态间切换的逻辑
/// 4.不断的更新当前状态
///
///
///
///  通俗点讲,
///  1.有限状态机是:将对象的状态(攻击、闲置、晕眩)的实现代码,提取出来,封装成状态。
///    由状态机负责在各个状态之间调度。
//   2 .对象(AI对象)持有状态管理类(状态机)的引用,与具体的状态解耦
/// </summary>

public class FSM
{
    private Dictionary<StateType, IState> stateDic;

    //当前状态
    private IState currentState;

    private GameObject role;  //关联一个游戏兑现(AI对象)
    public GameObject Role
    {
        get { return role; }
    }

    public FSM(GameObject role)
    {
        this.role = role;
        stateDic = new Dictionary<StateType, IState>();
    }



    //注册状态
    /// <summary>
    /// 只有注册过的状态才可以被切换
    /// </summary>
    /// <param name="state"></param>
    public void registerState(IState state)
    {
        IState s;
        stateDic.TryGetValue(state.stateType, out s);
        if (s == null)
        {
            state.fsm = this;
            stateDic.Add(state.stateType, state);
        }
        else
        {
            Debug.Log("已经有" + state.stateType + "了,不可以重复注册");
        }

    }
    /// <summary>
    ///
    /// </summary>
    /// <param name="stateType"></param>
    public void removeState(StateType stateType)
    {
        if (currentState.stateType != stateType)
        {
            IState s;
            stateDic.Tr

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值