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

news2024/11/23 2:38:57

文章目录

  • Unity进阶--fsm状态机的使用笔记
    • 第一种用基础的`if+播放实现动画控制
    • switch--case实现状态机
    • 使用状态机

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【JAVA】云HIS系统功能菜单知识(二)

随着医疗信息化和互联网技术的不断发展&#xff0c;云HIS在大数据管理和应用的优势日益凸显。对于医疗机构而言&#xff0c;云HIS平台可以帮助其实现更高效的医疗服务管理&#xff0c;并提高医疗服务的整体水平和效率。 一、系统管理 1.医院信息 基本信息、法人代表、主要负责…

IntelliJ IDEA2023中利用maven-archetype-quickstart模板创建项目无src文件夹及maven插件下载过慢问题的解决

目录 介绍问题之解决问题2的解决问题1的解决 介绍 昨天下载并安装了IntelliJ IDEA 2023的最新版&#xff08;以下简称为IDEA 2023&#xff09;&#xff0c;学习利用该IDE编写Java项目及将其与maven结合构建项目。我所安装的maven是去年暑假安装的&#xff0c;版本为Apache Mav…

【架构基础】架构概念

软件架构产生的背景 1972年图灵奖获得者、荷兰计算机科学家Edsger Wybe Dijkstra早在20世纪60年代就开始涉及软件架构概念了。 20世纪60年代第一次软件危机引出了结构化编程&#xff0c;创造了模块的概念。 20世纪80年代第二次软件危机引出了面向对象编程&#xff0c;创造了…

Flask的send file和send_from_directory的区别

可以自行查看flask 文档。 send file高效&#xff1b; send from directory安全&#xff0c;且适用于静态资源交互。 都是实现相同的功能的。 send_file send_from_directory

所有docker命令无效,解决办法

目录 ■前言 今天使用docker时&#xff0c;所有命令无效 ■解决办法如下 1.停止docker服务 2.查看状态 3.删除之前的docker相关的文件 4.再次查看状态 5.使用相关命令 &#xff08;好用了&#xff09; 6.重新下载镜像 ■前言 今天使用docker时&#xff0c;所有命令无…

MySQL 8.0 OCP (1Z0-908) 考点精析-备份与恢复考点1:MySQL Enterprise Backup概要

文章目录 MySQL 8.0 OCP (1Z0-908) 考点精析-备份与恢复考点1&#xff1a;MySQL Enterprise Backup概要MySQL Enterprise Backup下载与安装MySQL Enterprise Backup的备份过程MySQL Enterprise Backup的优势mysqlbackup 客户端例题例题1 &#xff1a; MySQL Enterprise Backup概…

idea的插件FastRequest,比postman更好用

1.安装插件Restful Fast Request 在插件plugin中直接搜索Restful Fast Request,然后点击install安装 2.使用插件 插件位置在右面&#xff0c;点开后呈现以下页面 配置项目名和环境 选择配置好的项目名和环境 启动项目后可以看到接口的小火箭&#xff0c;点击小火箭 3.…

【配置环境】Windows下 VS Code 远程连接虚拟机Ubuntu

一&#xff0c;环境 Windows 11 家庭中文版VMware Workstation 16 Pro &#xff08;版本&#xff1a;16.1.2 build-17966106&#xff09;ubuntu-22.04.2-desktop-amd64 二&#xff0c;关键步骤 Windows下安装OpenSSHVS Code安装Remote - SSH插件 三&#xff0c;详细步骤 在Ubun…

sentinel深入讲解流量控制/熔断降级

文章目录 sentinelsentinel介绍重要的核心概念引入依赖限流的规则熔断规则yaml 项目配置使用注解 SentinelResource讲解类的静态方法 sentinel sentinel介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构…

STM32中PWM概述

STM32F103C8T6 PWM资源&#xff1a; 高级定时器(TIM1):7路 通用定时器(TIM2~TIM4):各4路 PWM输出模式&#xff1a; *PWM模式1&#xff1a;在向上计数时&#xff0c;一旦CNT<CCRx时输出为有效电平&#xff0c;否则为无效电平 *PWM模式2&#xff1a;在向上计数时&#xf…

vue实现仿手写稿样式,可导出成png图片

文章目录 环境实现效果代码 环境 安装html2canvas&#xff0c;用于将指定标签下的全部子节点转换为图片 npm install html2canvas实现 <template><div class"handwrite"><div id"left" class"left"><div id"backImg…

【Mycat2】关于序列功能的一个 Bug

创建序列前 Mycat 的 sequences/ 目录情况&#xff1a; 创建一个 MySQL 生成方式的序列。 /* mycat:setSequence{"name":"sharding_db_not_tb111","clazz":"io.mycat.plug.sequence.SequenceMySQLGenerator"} */;因为没有官方文档支…

字符函数和字符串函数下篇(详解)

❤️ 作者简介 &#xff1a;RO-BERRY 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识&#xff0c;对纯音乐有独特的喜爱 &#x1f4d7; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;如果你也感兴趣的话欢迎关注博主&#xff0c;期待更新 字符函数和字符串函数2 1…

DevOps自动化平台开发之 Shell脚本执行的封装

基础知识 基于如下技术栈开发DevOps平台 Spring Boot Shell Ansible Git Gitlab Docker K8S Vue 1、spring boot starter的封装使用 2、Shell脚本的编写 3、Ansible 脚本的编写 4、Docker 的使用与封装设计 本篇介绍如何使用Java封装Linux命令和Shell脚本的使用 将其设计成…

【Datawhale夏令营】任务一学习笔记

目录 一&#xff1a;anaconda的环境配置 二&#xff1a;赛题任务解读 2.1 任务要求 2.2 数据集介绍 2.3 评估指标 三&#xff1a;机器学习之 LightGBM 一&#xff1a;anaconda的环境配置 下载Anaconda&#xff1a;访问Anaconda官方网站&#xff08;https://www.anaconda.…

SQL篇-04_SQL进阶挑战-01_增删改操作

插入记录 SQL110 插入记录&#xff08;一&#xff09; 描述 牛客后台会记录每个用户的试卷作答记录到exam_record表&#xff0c;现在有两个用户的作答记录详情如下&#xff1a;用户1001在2021年9月1日晚上10点11分12秒开始作答试卷9001&#xff0c;并在50分钟后提交&#xff…

【算法基础:数学知识】4.3 欧拉函数

文章目录 欧拉函数定义性质 例题列表873. 欧拉函数&#xff08;使用质因数分解求一个数的欧拉函数&#xff09;原理讲解&#xff08;公式推导&#xff09;⭐解法代码 874. 筛法求欧拉函数&#xff08;求 1 ~ n 中所有数字的欧拉函数&#xff09;⭐ 欧拉函数 https://oi-wiki.o…

安装及配置zabbix_agent代理端(监控FTP服务器)

监控agent的linux主机我们在之前的文章里已经做好了 现在直接安装ftp服务即可 [rootagent ~]# yum install -y vsftpd[rootagent ~]# systemctl start vsftpd #启动ftp服务[rootagent ~]# systemctl enable vsftpd #设置ftp服务开机自启 Created symlink fro…

codec2play流程总结

Codec2.0(C2)是android系统为vendor提供的用于实现video/audio/filter模块的的HAL层接口API&#xff0c;vendor可用这个API实现他们自己的HAL层&#xff0c;Codec2.0是用于替换现有的OMX-IL。 数据流程 C2LinearBlock创建share ptr类型block&#xff0c;fetchLinearBlock对blo…

【每日一题Day274】LC42接雨水 | 单调栈

接雨水【LC42】[面试常见] 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 按列求贡献&#xff1a;枚举 首先确定按行计算雨水&#xff0c;还是按列确定雨水 按行计算&#xff1a; 按列计算&#xff1…