首页 > 其他分享 >在Unity中创建有限状态机

在Unity中创建有限状态机

时间:2022-12-31 12:02:28浏览次数:32  
标签:状态 run 创建 void idle Update 状态机 Unity public

有限状态机(FSM)拥有有限数量的状态,每个状态可以根据输入决定迁移到哪个状态。

在Unity中的你可以创建有限状态机来做一些事情,比如动画转换,简单的敌人AI,更好控制角色等。

一个简单的例子:一个角色有2种状态:待机,奔跑。

角色处在待机状态,当你按下移动键它会从待机状态迁移到奔跑状态。当你松开移动键它会从奔跑状态迁移到待机状态。

简单的代码:

///委托
public delegate void RoleEnter();
public delegate void RoleUpdate();
///状态父类
public class FSMState
{
public event RoleEnter Enter;//进入状态调用一次
public event RoleUpdate Update;//状态中时时调用
public void OnEnter()
{
Enter?.Invoke();
}
public void OnUpdate()
{
Update?.Invoke();
}
}

//待机状态
public class IdleState:FSMState
{

}
//奔跑状态
public class RunState:FSMState
{

}State

每个状态拥有两个事件,Enter事件:当状态迁移时作为入口调用一次;

Update事件:在Unity中是每帧调用;

让我建立一个Role脚本来使用这些状态:

public class Role:Monobehaivor
{
FSMState current;
IdleState idle;
RunState run;
void start(){
idle = new IdleState();
run = new RunState();

idle+=Idle_Enter;
idle+=Idle_Update;
run+=Run_Enter;
run+=Run_Update;

current = idle;
current.OnEnter();
}

void Update()
{
current.OnUpdate();
}

private void Idle_Enter()
{
this.current = idle;///进入状态,当前状态变为此状态
Debug.log("进入idle");
}
private void Idle_Update()
{
if(Input.GetKeyDown("d"))//在idle状态,按下d键进入run状态
{
run.OnEnter();
}
}

private void Run_Enter()
{
this.current = run;
Debug.log("进入run");
}

private void Run_Update()
{
if(!Input.GetKeyDown("d"))//在run状态,松开d键进入idle状态
{
idle.OnEnter();
}
}
}

如果增加一些状态,就继承FSMState,在Role脚本里实例化一次并绑定方法。凡事有利有弊,如果一个角色拥有太多的状态,使用状态机会导致:但凡增加一个新状态,就可能得修改所有状态的转换条件。对于这种情况,行为树(BehaviorTree)是更好的选择。

标签:状态,run,创建,void,idle,Update,状态机,Unity,public
From: https://blog.51cto.com/u_15926980/5982076

相关文章

  • 【小5聊】ElementUI-Vue3-TS项目简单创建
    vue2升级到vue3,不管任何框架,升级总有它改进的地方和原因,否则升级就毫无意义,技术变化日新月异,必须保持与时俱进,否则就很容易在技术的浪潮中被淘汰!vue3相比以前版本,最大一个变......
  • 创建angular项目
    1.说明本项目使用的angular,nodejs,npm,cnpm版本如下$ngversionAngularCLI:13.2.6Node:14.17.1PackageManager:npm6.14.13OS:win32x64Angular:13.2......
  • 基于FPGA状态机设计实现EtherCAT从站
    0引言EtherCAT是由BECKHOFF提出的在工业控制领域获得广泛应用的现场总线之一,该总线具备全双工工作模式,可基于主站(Master)和从站(Slave)连接的模式实现数据传递,且具有低延时、......
  • python创建config.xml文件,调用Jenkins API接口创建带参数的Job
    文章目录​​一、要求​​​​二、pipeline模板xml的内容可以通过如下方式获取​​​​三、代码​​​​四、效果​​​​五、参考文章​​一、要求将hudson.model.StringPa......
  • Vue 组件的创建、使用
    Vue组件(Vuecomponent)Vue组件的位置在Vue项目中可以看到一类新的文件后缀.vue用来表示Vue文件。需要区分在项目目录src下的App.vue和src\components的......
  • 创建菜单与游戏界面
    今天学习完成构建蛇与蛇的移动自己的vscode没有自动导入Snake,下次记得手动导入接下来,实现蛇的连贯移动思路:设置一个虚拟的头部。每次移动只有头和尾巴移动回合制游戏......
  • 3任务的创建-列表项的删除&遍历
     1、列表项的删除:从列表中删除指定的列表项,通过uxListRemove()函数来完成pxItemToRemove:要删除的列表项uxListRemove:剩余列表项的数目步骤:获取列表项所在的列表地址将......
  • 03创建Vue项目并实现全球化
    03创建Vue项目并实现全球化创建Vue项目vuecreateclient-vue使用Vuex作为状态管理,用于保存从后台获取的应用程序配置ApplicationConfigurationDto,该对象包含本地化的......
  • git学习四:常用命令总结,包括创建基本命令,分支操作,合并命令,压缩命令,回溯历史命令,拉取命
    文章目录​​前言​​​​git仓库讲解​​​​一、初始化git配置​​​​二、基本提交命令​​​​1.命令​​​​2.注意的点​​​​3.深度理解gitcommit提交​​​......
  • Python__18--函数的定义与创建
    1函数的定义执行特定任务以完成特定功能的一段代码特点:复用代码隐藏细节提高可维护性提高可读性便于调试2函数的创建def函数名([输入参数]):函数体return......