在Unity中创建有限状态机

您所在的位置:网站首页 unity怎么创建动作 在Unity中创建有限状态机

在Unity中创建有限状态机

2023-01-02 02:51| 来源: 网络整理| 查看: 265

有限状态机(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)是更好的选择。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3