Unity2D - 状态机(State Machine)详解

1. 状态机概述

在角色的生成中,由于事件的不同,动作的不同,角色会处于不同的状态中。例如对战冒险游戏,面临Boss的攻击,角色会受到例如中毒,恐惧等Debuff效果,若单纯的在一个脚本中使用if等语句进行事件处理,往往会比较冗杂,程序出现bug后也无法及时排查出问题。

状态机此时就是一个很好解决上述问题的方式。例如在玩家移动过程中,此时的状态为移动状态。设定好不同状态之后。只需要相应的判定条件即可进入状态执行对应事件。

2. 初始化状态机

2.1. PlayerStateMachine

public class PlayerStateMachine : MonoBehavior
{
    public PlayerState currentState {get; privet set;} //申明一个状态
    
    public void Initialize(PlayerState _startState)
    {
        currentState = _startState; //初始化状态
        currentState.Enter(); //进入状态
    }

    public void ChangeState(PlayerState _newState)
    {
        currentState.Exit(); // 退出当前状态
        currentState = _newState;
        currentState.Enter();
    }
}

定义PlayerStateMachine类的作用类似于一个机器,将player的各个状态进行调配,例如状态机所含Initialize方法初始化状态,以及改变当前状态。

在改变当前状态时,先要执行状态中的Exit()方法,为后续动作增加了更大的可能性。

2.2. PlayerState

public class PlayerState
{
    protected PlayerStateMachine stateMachine;
    protected Player player; 
    protected string animatorName;

    public PlayerState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) //   构造函数,将上述变量传入
    {
        this.player = _player; //获取player,也可以调用player中的参数    
        this.stateMachine = _stateMachine;
        this.animatorName = _animBoolName; //动画参数的名字
    }

    public virtual void Enter()
    {
        rb = player.rb;
        player.anim.SetBool(animatorName,true);
    }

    public virtual void Update()
    {
        xInput = Input.GetAxisRaw("Horizontal"); //任意状态都可以持续调用
    }

    public virtual void Exit()
    {
        player.anim.SetBool(animatorName,false); //退出当前状态时,将动画参数设置为false
    }

}

与其说PlayerState是各个状态的模板,更不如说是各状态共有的特征。简化了代码,各状态所需要的初始化在PlayerState类中以及设定好了,在后续编写状态代码时只需简单的base.Update();即可。

在父类状态中想要一直持续调用的事件,在后续也可以传导给子类状态,例如想要一直获取角色在水平轴上的Input.GetAxisRaw。通过继承的方式,子类无论在何种状态,都在持续调用这段代码。

2.3. Player

public class Player: MonoBehaviour
{
    //声明组件以及所需要的状态
    public Rigidbody2D rb {get;private set;}
    public Animator anim {get;private set;}

    public PlayerStateMachine stateMachine {get;private set}
    public PlayerIdleState idleState {get;private set}

    private void Awake()   //初始化该player所拥有的状态与状态机,在实例化对象之前加载
    {
        stateMachine = new PlayerStateMachine();
        idleState = new PlayerIdleState(this,StateMachine,"Idle");
    }

    private void Start()
    {
        anim = GetComponentInChildren<Animator>();
        rb = GetComponent<Rigidbody2D>();
        StateMachine.Initialize(idleState); #初始化idle状态
    }

    private void Update()
    {
        StateMachine.currentState.Update(); //通过player的持续调用,持续调用当前状态的Update
    }
}

Player是应用的我们角色的脚本,实现为player声明好对应的状态机,更好的去初始化与改变当前状态。

通过Unity引擎自带的Update方法,进一步实现每个状态中我们所编写的Update方法。

3. 状态机的应用

3.1. Idle状态

public class PlayerIdleState : PlayerGroundedState
{
    public PlayerIdleState(Player _player, PlayerStateMachine _stateMachine, string _animBoolName) : base(_player, _stateMachine, _animBoolName)
    {
    }

    public override void Enter()
    {
        base.Enter();
    }

    public override void Exit()
    {
        base.Exit();
    }

    public override void Update() //持续调用
    {
        base.Update();
        if (xInput != 0)
        {
            stateMachine.ChangeState(player.moveState);
        }
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

中霖教育靠谱吗?在职备考一建好通过吗?

中霖教育靠谱吗?在职备考一建好通过吗? 课程设置&#xff1a;报名后会进行测评&#xff0c;了解学员的知识掌握情况、时间安排和记忆思维特点等&#xff0c;制定更适合的学习计划。 课程以考试通过为目标&#xff0c;去繁化简&#xff0c;只讲有用的干货&#xff0c;帮助快…

ASUS/华硕幻14 2023 GA402X系列 原厂Windows11-22H2系统

安装后恢复到您开箱的体验界面&#xff0c;带原机所有驱动和软件&#xff0c;包括myasus mcafee office 奥创等。 最适合您电脑的系统&#xff0c;经厂家手调试最佳状态&#xff0c;性能与功耗直接拉满&#xff0c;体验最原汁原味的系统。 原厂系统下载网址&#xff1a;http:…

python基础语法 004-1流程控制- 条件控制

1 条件控制 1.1 表达 条件表达式冒号缩进 1.1.1 单个条件&#xff1a;满足表达式 """ ############if的表示 if 条件表达式:(缩进)条件满足以后要运行的代码例子: #遇到冒号要缩进 #缩进&#xff1a;1个缩进用4个空格&#xff0c;整个篇幅缩进需要统一 #4个…

如何解决三菱软件提示 起动MELSOFT Mediative Server失败

前言&#xff1a; 注意&#xff0c;这篇文章仅针对如何解决 起动MELSOFT Mediative Server失败 的问题。对于其他相关的问题&#xff0c;请搜索其他相应的解决办法。 本人是在重装三菱GX Works软件时遇到此问题的。后来搜索发现无人能妥善的关闭这个提示。因此本文介绍如何关…

关于多媒体本地化准备的小清单

多媒体本地化需要翻译多媒体材料&#xff08;音频、视频、动画等&#xff09;&#xff0c;同时考虑到这些材料所针对的国家的文化特征。 多媒体材料能快速有效地将思想传达给目标受众。它们表达了人们的情感&#xff0c;比纯文本更令人难忘。然而&#xff0c;它们的影响取决于…

pdf怎么转换成jpg,本地转换还是在线转换?

PDF&#xff08;Portable Document Format&#xff09;和JPG&#xff08;Joint Photographic Experts Group&#xff09;这两种文件格式在我们的日常生活和工作中扮演着举足轻重的角色。PDF因其跨平台、保持原样性强的特点&#xff0c;被广泛应用于文件传输和存储&#xff1b;而…

优维“统一开放平台”:开放、开发、集成、客制化

基于丰富完善的产品体系&#xff0c;优维重磅推出了统一开放平台。这款由优维自主设计与研发&#xff0c;集数据开发、能力开放、能力集成、客制化为一体的统一开放平台&#xff0c;具备应用市场、应用开发、连接能力、采控平台、API集市、开发者工具等功能模块&#xff0c;可为…

办公效率新高度:利用办公软件实现文件夹编号批量复制与移动,轻松管理文件

在数字化时代&#xff0c;我们的工作和生活都围绕着海量的数据和文件展开。然而&#xff0c;随着数据量的不断增加&#xff0c;如何高效地管理这些数字资产成为了摆在我们面前的一大难题。今天&#xff0c;我要向您介绍一种革命性的方法——利用办公软件实现文件夹编号批量复制…

大数据之Hadoop部署

文章目录 服务器规划服务器环境准备1. 网络测试2. 安装额外软件包3. 安装基础工具4. 关闭防火墙5. 创建用户并配置权限6. 创建目录并设置权限7. 卸载JDK8. 修改主机名9. 配置hosts文件10. 重启服务器 配置免密登录安装Java安装Hadoop1. Hadoop部署2. 配置Hadoop3. 格式化Hadoop…

【自动驾驶汽车通讯协议】深入理解PCI Express(PCIe)技术

文章目录 0. 前言1. PCIe简介1.1 PCIe外观1.2 PCIe的技术迭代 2. PCIe的通道&#xff08;lane&#xff09;配置2.1 通道配置详解2.2 通道配置的影响 3. PCIe的架构3.1 架构层次3.2 核心组件 4. PCIe的特性5. PCIe在自动驾驶中的应用 0. 前言 按照国际惯例&#xff0c;首先声明&…

scatterlist的相关概念与实例分析

概念 scatterlist scatterlist用来描述一块内存&#xff0c;sg_table一般用于将物理不同大小的物理内存链接起来&#xff0c;一次性送给DMA控制器搬运 struct scatterlist {unsigned long page_link; //指示该内存块所在的页面unsigned int offset; //指示该内存块在页面中的…

java实现图片添加水印

文章目录 前言一、工具类WatermarkUtil二、工具类介绍2.1 图片来源类型2.2 水印类型2.3 读取本地图片2.4 读取网络图片2.5 水印处理2.6 添加水印 三、测试添加水印总结 前言 给图片添加水印是一个很常见的需求&#xff0c;一般是用来防盗用。比如我们csdn上面写的文章中&#…

【docker】2. 编排容器技术发展史(了解)

该篇文章介绍的主要是编排以及容器技术的发展史(了解即可)&#xff0c;如果想单纯学习docker命令操作可直接略过&#xff01;&#xff01;&#xff01; 容器技术发展史 Jail 时代 容器不是一个新概念或者新技术&#xff0c;很早就有了&#xff0c;只是近几年遇到了云计算&am…

API-节点操作

学习目标&#xff1a; 掌握节点操作 学习内容&#xff1a; DOM节点查找节点增加节点删除节点 DOM节点&#xff1a; DOM树里每一个内容都称之为节点。 节点类型 元素节点所有的标签比如body、div&#xff1b;html是根节点属性节点所有的属性&#xff0c;比如href文本节点所有…

前端git约定式规范化提交-commitizen

当使用commitizen进行代码提交时&#xff0c;commitizen会提示你在提交代码时填写所必填的提交字段信息内容。 1、全局安装commitizen npm install -g commitizen4.2.4 2、安装并配置 cz-customizeable 插件 2.1 使用 npm 下载 cz-customizeable npm i cz-customizeable6.…

TS_类型

目录 1.类型注解 2.类型检查 3.类型推断 4.类型断言 ①尖括号&#xff08;<>&#xff09;语法 ②as语法 5.数据类型 ①boolean ②number ③string ④undefined 和 null ⑤数组和元组 ⑥枚举 ⑦any 和void ⑧symbol ⑨Function ⑩Object 和 object 6.高…

精品UI知识付费系统源码网站EyouCMS模版源码

这是一款知识付费平台模板&#xff0c;后台可上传本地视频&#xff0c;批量上传视频连接&#xff0c; 视频后台可设计权限观看&#xff0c;免费试看时间时长&#xff0c;会员等级观看&#xff0c;付费观看等功能&#xff0c; 也带软件app权限下载&#xff0c;帮助知识教育和软件…

通讯录管理系统——删除联系人——检测联系人是否存在

功能描述&#xff1a;按照姓名删除指定联系人 删除联系人实现步骤&#xff1a; 1.封装检测联系人是否存在 2.封装删除联系人函数 3.测试删除联系人功能 一、封装检测联系人是否存在 设计思路&#xff1a; 删除联系人前&#xff0c;我们需要先判断用户输入的联系人是否存…

饮料添加剂光照试验太阳光模拟器试验箱

饮料添加剂光照试验是一种用来评估饮料在光照条件下稳定性的实验方法。这个过程通常包括以下几个步骤&#xff1a; 样品准备&#xff1a; 首先&#xff0c;将饮料密封在市售包装或近似市售包装中&#xff0c;确保包装的完整性和密封性。 光照条件设置&#xff1a; 将封装好的…

【云原生】深入理解Pod的使用进行管理

深入理解Pod 文章目录 深入理解Pod一、介绍Pod1.1、什么是Pod1.2、Pod的特点1.3、Pod的用途1.4、Pod网络1.5、Pod存储1.6、Pod的工作方式 二、创建Pod2.1、命令行创建Pod2.2、资源清单创建Pod2.2.1、镜像拉取策略2.2.2、Pod重启策略2.2.3、部署资源2.2.4、删除资源 三、静态Pod…