Unity进阶--fsm状态机的使用笔记

2023-11-12

Unity进阶–fsm状态机的使用笔记

第一种用基础的`if+播放实现动画控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yMi6hizN-1689928187185)(QQ%E6%88%AA%E5%9B%BE20230721104017.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vPPZXF2p-1689928187186)(QQ%E6%88%AA%E5%9B%BE20230721104429.png)]

朴实无华,简单易懂,但是耦合性太差。

switch–case实现状态机

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eC0QGMwr-1689928187187)(QQ%E6%88%AA%E5%9B%BE20230721112119.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZckiCoY6-1689928187187)(QQ%E6%88%AA%E5%9B%BE20230721113102.png[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lw462qf8-1689928187417)(QQ%E6%88%AA%E5%9B%BE20230721105058.png)]]

写对应的状态函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W5WKaPi9-1689928187188)(QQ%E6%88%AA%E5%9B%BE20230721105520.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1gOBr8KL-1689928187188)(QQ%E6%88%AA%E5%9B%BE20230721105831.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFChp4VD-1689928187189)(QQ%E6%88%AA%E5%9B%BE20230721105958.png)]

再调用他们,合理,但存在调用问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IiVtnGFI-1689928187190)(QQ%E6%88%AA%E5%9B%BE20230721105140.png)]

使用状态机

  • 编写状态基类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhC0DwX5-1689928187191)(QQ%E6%88%AA%E5%9B%BE20230721111443.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public abstract class FSMState
    {
        public int StateID;
        public MonoBehaviour Mono;
        public FSMManager FSMManager;
    
        public FSMState(int stateID, MonoBehaviour mono, FSMManager manager){
            StateID = stateID;
            Mono = mono;
            FSMManager = manager;
        }
        
        public abstract void OnEnter();
    
        public abstract void OnUpdate();
    }
    
    
  • 编写状态机基类

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iWtDGkY3-1689928187191)(QQ%E6%88%AA%E5%9B%BE20230721112301.png)]

    using System.Collections;
    using System.Collections.Generic;
    
    public class FSMManager
    {
       public List<FSMState> StateList = new List<FSMState>();
       public int CurrentIndex = -1;
    
       public void ChangeState(int StateID){
          CurrentIndex = StateID;
          StateList[CurrentIndex].OnEnter(); 
       }
    
       public void Update() {
          if (CurrentIndex != -1){
            StateList[CurrentIndex].OnUpdate();
          }
       }
    }
    
    
  • 编写状态枚举

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4pLOXoXx-1689928187192)(QQ%E6%88%AA%E5%9B%BE20230721112119.png)]

    public enum PlayState
    {
        idle,
        run,
        wave   
    }
    
    
  • 编写几个状态

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mjlj2KBL-1689928187192)(QQ%E6%88%AA%E5%9B%BE20230721113412.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class RunState : FSMState
    {
        public RunState(int stateID, MonoBehaviour mono, FSMManager manager) : base(stateID, mono, manager)
        {
        }
    
        public override void OnEnter()
        {
            Mono.GetComponent<Animator>().SetFloat("Speed",5);
        }
    
        public override void OnUpdate()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            Vector3 dir = new Vector3(horizontal, 0, vertical);
            if (dir != Vector3.zero){
               Mono.transform.rotation = Quaternion.LookRotation(dir);
               Mono.transform.Translate(Vector3.forward * 5 * Time.deltaTime);
            }
            else {
                FSMManager.ChangeState((int)PlayState.idle);
            }
        }
    }
    
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GVXdl8Lg-1689928187192)(../AppData/Roaming/Typora/typora-user-images/image-20230721135226133.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class IdleState : FSMState
    {
        public IdleState(int stateID, MonoBehaviour mono, FSMManager manager) : base(stateID, mono, manager)
        {
        }
    
        public override void OnEnter()
        {
            Mono.GetComponent<Animator>().SetFloat("Speed",0);
        }
    
        public override void OnUpdate()
        {
            float horizontal = Input.GetAxis("Horizontal");
            float vertical = Input.GetAxis("Vertical");
            Vector3 dir = new Vector3(horizontal, 0, vertical);
            if (dir != Vector3.zero){
               FSMManager.ChangeState((int)PlayState.run);
            }
    
            if (Input.GetKeyDown(KeyCode.Space)){
                Debug.Log("按下空格");
                FSMManager.ChangeState((int)PlayState.wave);
            }
        }
    }
    
    
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wbUcB6cR-1689928187193)(QQ%E6%88%AA%E5%9B%BE20230721113634.png)]

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class WaveState : FSMState
    {
        public WaveState(int stateID, MonoBehaviour mono, FSMManager manager) : base(stateID, mono, manager)
        {
        }
    
        public override void OnEnter()
        {
            Mono.GetComponent<Animator>().SetBool("Rest",true);
        }
    
        public override void OnUpdate()
        {
            if(!Mono.GetComponent<Animator>().GetCurrentAnimatorStateInfo(0).IsName("Rest")){
                FSMManager.ChangeState((int)PlayState.idle);
                Mono.GetComponent<Animator>().SetBool("Rest",false);
            }
        }
    }
    
    
    
    
    • 编写对应的角色控制状态机

      [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QxsjWa1V-1689928187193)(../AppData/Roaming/Typora/typora-user-images/image-20230721135328692.png)]

      using System.Collections;
      using System.Collections.Generic;
      using UnityEngine;
      
      public class PlayControl : MonoBehaviour
      {
          private FSMManager fSMManager;
          // Start is called before the first frame update
          void Start()
          {
              fSMManager = new FSMManager();
              IdleState idleState = new IdleState(0, this, fSMManager);
              RunState  runState  = new RunState(1, this, fSMManager);
              WaveState waveState = new WaveState(2, this, fSMManager);
      
              fSMManager.StateList.Add(idleState);
              fSMManager.StateList.Add(runState);
              fSMManager.StateList.Add(waveState);
              fSMManager.ChangeState((int)PlayState.idle);
          }
      
          // Update is called once per frame
          void Update()
          {
              fSMManager.Update();
          }
      }
      
      
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unity进阶--fsm状态机的使用笔记 的相关文章

  • 【资源】小程序项目源码、项目图片素材、全栈课程、项目效果图、小程序mpvue项目实例等资源大全

    1 微信小程序源码地址链接 https pan baidu com s 1P9ISKk9YjSHbFCIqfCM pQ 提取码 g8c3 2 130个微信小程序源码地址链接 https pan baidu com s 1Hiq 6IVvzD
  • CSDN竞赛第56期题解

    CSDN竞赛第56期题解 1 题目名称 因数 数字游戏 小Q的柠檬汁做完了 掏出了自己的数字卡牌 想要和别人做数字游戏 可是她又不想要输掉游戏 她制定好规则 每 次每个人只能把这个牌换成它的因子的某个牌 但是这个因子不能是1或者整数本身 现
  • win10更新后,wsappx占用高内存/资源管理器占用CPU高

    目录 问题记录 搜索与实践 最终解决办法 系统还原 新问题 设置搜索不能用 问题记录 2022 7 26晚 没注意点击了 关机并更新 有个intel驱动更新 不确定是否是驱动问题 第二天开机各种问题 wsappx占用大量内运存 电脑卡死 重
  • 利用SQLite数据库进行用户名、密码的注册和登录验证

    利用SQLite数据库进行存储用户名 密码等等其他信息 首先是activity main布局界面
  • Java线程池没用好,我不小心把系统搞崩了!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 背景介绍 线程池的基本工作原理 线程池高并发场景下问题剖析 线程池高并发场景下性能优化 总结 背景介绍 大家好 今天给大家讲一个比较偏硬核技术类的知识 就是 J
  • 怎么提高编程能力?逻辑思维能力?

    一 对于程序员的编程能力的提升 学习一门简单而且可用性强的语言 写点自动签到 自动下动漫之类的日常小程序 提高编程兴趣 比如 python 可以选择教材 Learn Python The Hard Way 学习常见的算法和数据结构 根据个人
  • AOF 复写

    AOF 复写 上一篇博客我们提到AOF持久化有一个缺点是 aof持久化的文件会越来越大 导致redis因为某个原因重启时需要加载的aof文件会非常大 加载的很缓慢 针对这一缺点就引入了AOF复写 什么时AOF复写 Redis 为了避免 AO
  • 基于java+springboot+mybatis+vue+elementui的高校学习用品购物平台

    项目介绍 近年来 随着信息技术的高速发展和现代网络技术的完善 电子商务日益受到人们的重视 发展成为一种新兴商务模式 高校学习用品购物平台是电子商务的一项重要内容 高校学习用品购物平台的出现 使得学生购物变得更轻松 快捷 方便 满足了广大师生
  • Linux快速安装MySQL

    文章目录 Linux上安装MySQL 1 安装MySQL 1 上传MySQL安装包以及MySQL驱动jar包 2 解压MySQL安装包 3 卸载系统自带的mariadb 4 安装MySQL依赖 5 安装mysql client 6 安装my

随机推荐

  • vulnhub靶场-SOCIAL NETWORK

    1 靶机信息 靶机名称 BOREDHACKERBLOG SOCIAL NETWORK 靶机难度 中等 虚拟机环境 此靶机推荐使用Virtualbox搭建 目标 获取到root 权限 靶机地址 BoredHackerBlog Social N
  • Dockerfile(5) - CMD 指令详解

    CMD 指定容器默认执行的命令 exec 形式 推荐 CMD executable param1 param2 CMD 可执行命令 参数1 参数2 作为ENTRYPOINT的默认参数 CMD param1 param2 shell CMD
  • JetBrains IDEA插件推荐

    主题 VSCode Dark vscode的蓝黑配色 长时间写代码不伤眼 毕竟是vsocde多年的累积 配合dark黑色主题看着非常舒服 SequenceDiagram 自动生成类的调用时序图 更直观的看到类的内部调用关系 Maven He
  • Vue3 入口文件createApp函数

    在2 x中 main js是vue项目的入口文件 引入构造函数Vue 然后new Vue传入配置项生成vm实例 如下 import Vue from vue import App from App vue import router fro
  • 【DASCTF2023】Misc mp3

    浅浅记录一道比较绕的misc题 有一道思路比较类似的题目 DASCTF7月赋能赛 Misc wp zysgmzb 博客园 题目 附件是一个mp3 查看了音频波形图之后发现没有什么收获 binwalk分析 发现是有一张图片 不过我用binwa
  • leetcode88.合并两个有序数组

    88 合并两个有序数组 题目叙述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2 另有两个整数 m 和 n 分别表示 nums1 和 nums2 中的元素数目 请你 合并 nums2 到 nums1 中 使合并后的数组同
  • Echars之雷达图的实现

    骑士李四记录 1 参数构造思路 参数 legend的data radar的indicator series的data 格式 series的data中的value要和radar的indicator的name一一对应 构造思路 构造series
  • Unity程序化地形教程 第二期 噪声图的完善和更多细节添加

    Unity程序化地形教程 第二期 噪声图的完善和更多细节添加 前言 完整的程序化地形教程在我的主页相关专栏中 目前正在持续更新 可以添加收藏 方便日后查找 零 学完本期能够实现的效果 书接上期 学完之后相比上期能够有更多的细节和优化 话不多
  • Win10+RTX2080深度学习环境搭建:tensorflow、mxnet、pytorch、caffe

    文章目录 准备工作 设置conda国内镜像源 conda 深度学习环境 tensorflow mxnet pytorch安装 tensorflow mxnet pytorch Caffe安装 配置文件修改 编译时常见错误 运行时错误 参考
  • Unity 刮刮卡拖动UI,随便擦除,转着圈擦,360度

  • 使用 acl 库编写高效的 C++ redis 客户端应用

    一 概述 可以直接略过此段 redis 最近做为 nosql 数据服务应用越来越广泛 其相对于 memcached 的最大优点是提供了更加丰富的数据结构 所以应用场景就更为广泛 redis 的出现可谓是广大网络应用开发者的福音 同时有大量的
  • C++游戏日志(六)A*寻路法,简单,详细注释

    一个游戏中最常见的寻路算法 每个点有四个属性 开始将起点存入开表 一 循环每次找出开表中F值 G H 最小的点存入闭表 并删除开表中的点 二 以此点为基础进行四方向寻路 也可以写八方向 三 五个判断一次进行 是否越界 是否碰墙 是否走到终点
  • 不要再使用 @Builder 注解了!

    一 前言 曾经 我在 千万不要再随便使用 lombok 的 Builder 了 一文中提到 Builder 注解的其中一个大坑会导致默认值失效 最近阅读了 Oh Stop using Builder 发现 Builder 的问题还不止一个
  • 1.CPU体系架构-RISC指令集和CISC指令集

    最近一直比较疑惑 RISC指令集以及CISC指令集区别在哪些方面呢 趁机也就补充了相关资料 进行了一些总结 目前CISC 复杂指令集 的代表为X86 CISC RISC 精简指令集 的代表为ARM MIPS RISC 还有新兴的RISCV指
  • 北航计算机录取最低分,2019年北京航空航天大学考研复试最低分数要求_北航各科目分数线-聚英北航考研网...

    据悉 北京航空航天大学2019年硕士研究生招生复试资格基本线及复试规定已发布 聚英北京航空航天大学考研网小编为大家整理如下 根据2019年我校硕士研究生招生初试成绩统计结果和各学科专业拟招生计划 经学校研究生招生工作领导小组讨论决定 北京航
  • git commit的时候卡在 “Locking pre-commit directory“上的解决办法

    删除 cache 的pre commit 文件夹即可 参考链接 https github com pre commit pre commit issues 675
  • k8s集群部署二进制(二)

    目录 7 1 前置环境和安装Docker 7 2 部署Master2 Node 192 168 31 74 7 3 部署Nginx负载均衡器 7 4 修改所有Worker Node连接LB VIP 七 高可用架构 扩容多Master架构 K
  • 普通视图和物化视图的区别

    物化视图是一种特殊的物理表 物化 Materialized 视图是相对普通视图而言的 普通视图是虚拟表 应用的局限性大 任何对视图的查询 Oracle都实际上转换为视图SQL语句的查询 这样对整体查询性能的提高 并没有实质上的好处 1 物化
  • Centos(Linux)升级git最新版本

    在Linux Centos服务器上 如果使用的git版本过低 使用的时候可能会由于低版本不支持遇到各种问题 比如Centos7系统自带的git版本一般是1 8 3 1的 比较旧 通常建议升级git后再使用 下面我们来说下如果升级git最新版
  • Unity进阶--fsm状态机的使用笔记

    文章目录 Unity进阶 fsm状态机的使用笔记 第一种用基础的 if 播放实现动画控制 switch case实现状态机 使用状态机 Unity进阶 fsm状态机的使用笔记 第一种用基础的 if 播放实现动画控制 朴实无华 简单易懂 但是