Unity状态机的实现方法一

server/2025/2/13 11:55:06/

Unity状态机知识点整理

1. 状态机基本概念

1.1 什么是状态机

Unity常见的状态机管理分为三种:

  1. 枚举状态机
  2. 通过实现接口的方式多态出的更加便于维护的状态机
  3. Unity Animator自带的StateMachineBehaviour

1.2 不同状态机实现方式的对比

自定义状态机(枚举/接口)特点:
  1. 控制灵活度

    • 完全自主控制状态转换逻辑
    • 可以方便地访问和修改游戏对象的任何组件
    • 能够实现复杂的状态嵌套和组合
  2. 性能优势

    • 代码执行效率高
    • 内存占用小
    • 可以精确控制状态检查的频率
  3. 调试便利性

    • 可以方便地添加调试信息
    • 状态切换逻辑清晰可见
    • 便于断点调试
  4. 使用场景

    • 适合复杂的游戏逻辑控制
    • 需要频繁状态切换的情况
    • 需要与其他系统紧密集成的情况
StateMachineBehaviour特点:
  1. 可视化优势

    • 在Animator窗口中可视化编辑
    • 状态转换条件直观显示
    • 便于美术和策划理解和配置
  2. 动画集成

    • 与动画系统紧密结合
    • 自动处理动画过渡
    • 内置动画事件支持
  3. 局限性

    • 状态逻辑需要通过特定的回调函数实现
    • 访问其他组件相对繁琐
    • 不适合处理复杂的游戏逻辑
  4. 使用场景

    • 主要用于动画状态控制
    • 简单的行为状态切换
    • 需要可视化编辑的情况

1.3 StateMachineBehaviour示例

public class PlayerRunBehavior : StateMachineBehaviour
{// 状态进入时调用override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){// 初始化逻辑}// 状态更新时调用override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){// 更新逻辑}// 状态退出时调用override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex){// 清理逻辑}
}

1.4 选择建议

  1. 使用自定义状态机当:

    • 需要处理复杂的游戏逻辑
    • 需要高性能和精确控制
    • 状态之间有复杂的数据传递
    • 需要与多个系统交互
  2. 使用StateMachineBehaviour当:

    • 主要处理动画相关的状态
    • 需要可视化编辑状态流程
    • 团队中有非程序人员需要配置状态
    • 状态逻辑相对简单

2. 脚本中的状态机实现分析

2.1 状态定义

protected enum State
{Normal,  // 普通状态Attack   // 攻击状态
}
protected State currentState;  // 当前状态

2.2 状态初始化

protected virtual void Awake()
{controller = GetComponent<CharacterController>();animator = GetComponent<Animator>();currentState = State.Normal;  // 初始化为普通状态
}

2.3 状态切换机制

protected void ChangeState(State state)
{// 退出当前状态switch(currentState){case State.Normal:break;case State.Attack:break;}// 进入新状态switch(state){case State.Normal:break;case State.Attack:animator.SetTrigger("Attack");  // 触发攻击动画break;}currentState = state;  // 更新当前状态
}

3. 枚举状态机的优势

3.1 代码组织优势

  • 结构清晰:每个状态的行为被清晰地划分
  • 易于维护:添加新状态只需扩展枚举和相应的处理逻辑
  • 代码复用:状态逻辑可以被多个角色类继承和复用

3.2 游戏逻辑优势

  • 状态隔离:不同状态的行为互不干扰
  • 转换控制:可以严格控制状态间的转换条件
  • 动画整合:便于与动画系统集成(如示例中的animator)

4. 使用流程

  1. 定义状态

    • 使用enum定义可能的状态
    • 声明当前状态变量
  2. 初始化

    • 在Awake或Start中设置初始状态
    • 获取必要的组件引用
  3. 状态切换

    • 实现状态切换方法
    • 处理退出当前状态的逻辑
    • 处理进入新状态的逻辑
    • 更新状态标记
  4. 状态更新

    • 在Update等生命周期方法中根据当前状态执行相应逻辑
    • 通过HandleMovement等抽象方法实现具体行为

5. 扩展建议

5.1 状态扩展示例

protected enum State
{Normal,Attack,Jump,    // 可添加跳跃状态Hurt     // 可添加受伤状态
}

5.2 功能扩展方向

  1. 状态参数

    • 可以为每个状态添加参数配置
    • 使用ScriptableObject存储状态配置
  2. 状态持续时间

    • 可以添加状态持续时间控制
    • 实现状态自动切换机制
  3. 状态嵌套

    • 可以实现状态的层级结构
    • 支持子状态机的实现

6. 注意事项

  1. 状态切换的原子性

    • 确保状态切换过程是完整的
    • 避免状态切换过程中的中断
  2. 性能考虑

    • 避免频繁的状态切换
    • 合理控制状态数量
  3. 代码维护

    • 保持状态逻辑的独立性
    • 做好状态切换的条件管理
    • 适当的注释和文档说明

以上是Unity两种状态机的实现方式,更便于维护的状态机是枚举状态机,此内容会在后续的投稿中更新!!!!!


http://www.ppmy.cn/server/167315.html

相关文章

TDengine 产品由哪些组件构成

目 录 背景产品生态taosdtaosctaosAdaptertaosKeepertaosExplorertaosXtaosX Agent应用程序或第三方工具 背景 了解一个产品&#xff0c;最好从了解产品包括哪些内容开始&#xff0c;我这里整理了一份儿 TDegnine 产品包括有哪些组件&#xff0c;每个组件作用是什么的说明&a…

【算法】动态规划专题⑪ —— 区间DP python

目录 引入进入正题回归经典总结 引入 区间动态规划&#xff08;区间DP&#xff09;适用于解决涉及区间最优化的经典问题&#xff0c;如石子合并、最长回文子序列等。 进入正题 石子合并 https://www.acwing.com/problem/content/284/ 有 N 堆石子排成一排&#xff0c;其编号为…

百度舆情优化:百度下拉框中的负面如何清除?

百度的下拉词、相关搜索、大家还在搜有负面词条&#xff0c;一直是企业公关经理头疼的问题&#xff0c;小马识途营销顾问深耕网络营销领域十几年&#xff0c;对百度SEO优化、百度下拉框、百度相关搜索、自媒体营销、短视频营销等等技巧方面积累了一定的方法和技巧。 对于百度下…

调用DeepSeek官方的API接口

效果 前端样式体验链接&#xff1a;https://livequeen.top/deepseekshow 准备工作 1、注册deepseek官网账号 地址&#xff1a;DeepSeek 点击进入右上角【API开放平台】&#xff0c;并进行账号注册。 2、注册完成后&#xff0c;依次点击【API keys】-【生成API key】&#x…

第六届MathorCup高校数学建模挑战赛-A题:淡水养殖池塘水华发生及池水自净化研究

目录 摘要 1 问题的重述 2 问题的分析 2.1 问题一的分析 2.2 问题二的分析 2.3 问题三的分析 2.4 问题四的分析 2.5 问题五的分析 3. 问题的假设 4. 符号说明 5. 模型的建立与求解 5.1 问题一的建模与求解 5.1.1 分析对象与指标的选取 5.1.2 折线图分析 5.1.3 相关性分析 5.1.4…

高效利用Python爬虫开发批量获取商品信息

在当今电商行业竞争激烈的环境下&#xff0c;精准且高效地获取商品信息对于商家和数据分析师来说至关重要。无论是进行市场调研、优化商品布局&#xff0c;还是制定竞争策略&#xff0c;商品信息的全面掌握都是关键。Python爬虫技术以其强大的功能和灵活性&#xff0c;成为批量…

深入浅出:Python 中的异步编程与协程

引言 大家好&#xff0c;今天我们来聊聊 异步编程 和 协程&#xff0c;这是近年来编程语言领域中的热点话题之一&#xff0c;尤其在 Python 中&#xff0c;它作为一种全新的编程模型&#xff0c;已经成为处理 IO密集型 任务的强力工具。尽管很多人对异步编程望而却步&#xff0…

Redis07 - Redis底层数据结构

Redis底层数据结构 文章目录 Redis底层数据结构一&#xff1a;对象机制详解二&#xff1a;SDS 简单动态字符串三&#xff1a;压缩列表zipList结构 四&#xff1a;跳表 一&#xff1a;对象机制详解 String类型 - 简单动态字符串SDSList类型 - 双向链表 & 压缩列表Set类型 - …