当前位置: 首页 > news >正文

【Unity】有限状态机和抽象类多态

一、介绍

有限状态机是一个用来进行对象状态管理的计算模型。它由一组状态、一个或者多个触发事件以及状态之间的转换条件所组成。

对于任意一个游戏对象,我们可以为其编写一个或者多个状态机,使其能够在不同状态下有不同的决策和运作机制。

核心思想主要是:

  1. 拥有多种状态
  2. 仅处于多种状态的其中之一
  3. 状态之间能够互相切换

 

二、有限状态机的基本制作步骤

  1. 创建一个类作为状态的基类(一般是抽象类)
  2. 在状态基类中编写方法(建议是抽象方法,比如OnEnter、OnMove、OnExit等,你也可以根据开发需求来自行定义 )
  3. 创建状态的子类(也就是要继承状态的基类),这时候你就需要实现对应的抽象方法。在这里,你可以创建多个子类(比如敌人高于50%的血量的时候的状态,敌人低于50%的血量的时候的状态......)
  4. 创建状态子类的实例(一个或者多个),并定义一个状态基类对象(不需要实例化)
  5. 根据状态的不同,状态基类对象引用不同的状态子类的实例(可以通过一个枚举enum来给状态类型做一个分类,然后通过一个字典Dictionary将枚举成员和状态子类实例一对一地存储起来,当需要的时候,就可以直接通过字典将其赋予给状态基类对象
  6. 通过状态基类对象来调用自身的方法,从而实现有限状态机。

三、代码示例

下面这段代码演示了一个基本的有限状态机写法。

using System;
namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//定义基类对象MyAction myAction;//定义并实例化子类对象AngryAction angryAction = new AngryAction();NormalAction normalAction = new NormalAction();//引用 angryAction 对象myAction = normalAction;myAction.Speak();myAction.Run();//引用 normalAction 对象myAction = angryAction;myAction.Speak();myAction.Run();Console.ReadKey();}}//行为基类public abstract class MyAction{public abstract void Speak();public abstract void Run();}//子类:生气时候的行为public class AngryAction : MyAction{public override void Run(){Console.WriteLine("很生气地跑");}public override void Speak(){Console.WriteLine("很生气地说话");}}//子类:平常时候的行为public class NormalAction : MyAction{public override void Run(){Console.WriteLine("很平常地跑");}public override void Speak(){Console.WriteLine("很平常地说话");}}}

四、个人的一些理解

我个人理解的有限状态机的思想,就是“调用的是同一个方法,最终执行效果却有所不同”。在上述的代码当中,我只是给基类对象切换了对子类对象的引用,但是调用“相同”的方法,结果不一样。这就方便我们在游戏开发当中对某个游戏对象的状态管理和控制。

http://www.lryc.cn/news/425346.html

相关文章:

  • KETTLE调用http传输中文参数的问题
  • Gaussian Splatting 在 Ubuntu22.04 下部署
  • ppt中添加页码(幻灯片编号)及问题解决方案
  • Flutter 初识:对话框和弹出层
  • 启程与远征Ⅳ--人工智能革命尚未发生
  • Python教程(十五):IO 编程
  • Qt窗口交互场景、子窗口数据获取
  • 【C++学习笔记 18】C++中的隐式构造函数
  • 单元训练01:LED指示灯的基本控制
  • Sanic 和 Go Echo 对比
  • 内部排序(插入、交换、选择)
  • Vue3的多种组件通信方式
  • 【C++语言】list的构造函数与迭代器
  • Python 安装 PyTorch详细教程
  • html页面缩放自适应
  • 024.自定义chormium-修改屏幕尺寸
  • 测试环境搭建整套大数据系统(十九:kafka3.6.0单节点做 sasl+acl)
  • 小白零基础学数学建模应用系列(五):任务分配问题优化与求解
  • 怎么防止源代码泄露?十种方法杜绝源代码泄密风险
  • uniapp left right 的左右模态框
  • Docker Compose与私有仓库部署
  • Layout 布局组件快速搭建
  • 北京城市图书馆-非遗文献馆:OLED透明拼接屏的璀璨应用
  • OpenCV图像滤波(12)图像金字塔处理函数pyrDown()的使用
  • css如何使一个盒子水平垂直居中
  • 机器人等方向学习和研究的目标
  • 封装一个细粒度的限流器
  • 【Spring Boot - 注解】@ResponseBody 注解:处理 JSON 响应
  • 无人机航拍与ArcGIS融合实战:从地表观测到空间数据可视化的全方位指南!无人机图像拼接数据处理与分析、可视化与制图
  • 日期转时间濯