有限状态机(FSM)

这篇具有很好参考价值的文章主要介绍了有限状态机(FSM)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、什么是有限状态机

二、如何实现

1、简述原理

2、 具体实现


一、什么是有限状态机

有限状态机就是一种用来描述对象不同状态之间如何相互转换的模型,这里最简单的例子就是动画状态机 animator 我们每一次都只能处于一个状态,每一个状态又可以通过一定的条件相互转换。

二、如何实现

1、简述原理

这次我们使用的是ScriptableObject,实现的思路就是从一个状态过度到另外一个状态,我们首先可以想到的就是将状态和条件单独声明出来然后 将两者进行关联。

有限状态机(FSM)

2、 具体实现

①准备工作:首先创建好如下文件夹

有限状态机(FSM)

 ②具体实现 : 在base下创建如下四个Script

有限状态机(FSM)

using UnityEngine;

public abstract class ContionOS : ScriptableObject
{
    /// <summary>
    /// 判断条件是否成立
    /// </summary>
    /// <returns>bool</returns>
    public abstract bool SetUP();
}
using UnityEngine;

public class stateMachine : MonoBehaviour
{
    public StateOS currentstate;
    public trasitionOS trasitionos;

    private void Awake()
    {
        trasitionos.Init(this);
    }

    private void Update()
    {
        currentstate?.OnUpdate();
        trasitionos.TryGetEnableCondition();//每一帧都查看是否成立
    }

}
using UnityEngine;

public abstract class StateOS : ScriptableObject
{
    public virtual void OnEnter() { }// 新状态进入 虚方法 子类可实现可不实现
    public abstract void OnUpdate(); // 状态更新 抽象方法子类必须实现该方法 不然会报错
    public virtual void OnExit() { } // 状态退出
    
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;

[CreateAssetMenu(fileName ="tranlsationos",menuName ="statemachine/create/tranlasition")]
public class trasitionOS : ScriptableObject
{
    //一个状态转变为其他状态可以有很多个条件 stateOS 状态  ContionOS 条件
    private Dictionary<StateOS, List<ContionOS>> _transition = new Dictionary<StateOS, List<ContionOS>>();

    // 转换列表:用来存储状态和条件的装欢关系
    [SerializeField] private List<translationState> currentState = new List<translationState>();

    //状态机 控制状态的更新
    private stateMachine statemachine; 

    public void Init(stateMachine statemachine)
    {
        this.statemachine = statemachine;
        AddTransition();
    }

    // 当前 状态的条件是否成立
    public void TryGetEnableCondition() 
    {
        if (_transition.ContainsKey(statemachine.currentstate)) 
        {
            foreach (var item in _transition[statemachine.currentstate])
            {
                if (item.SetUP()) 
                {
                    translatinon(item);
                }
            }
        }
    }
    /// <summary>
    /// 切换状态
    /// </summary>
    /// <param name="condition">当前状态的条件</param>
    public void translatinon(ContionOS condition) 
    {
        statemachine.currentstate?.OnExit();
        statemachine.currentstate = GetNextstate(condition);
        statemachine.currentstate?.OnEnter();
    }

    public StateOS GetNextstate(ContionOS condition) 
    {
        foreach (var item in currentState)
        {
            if (item.condition == condition && statemachine.currentstate == item.fromState) 
            {
                return item.toState;
            }
        }
        return null;
    }

    /// <summary>
    /// 将状态和条件加入到装欢列表
    /// </summary>
    public void AddTransition() 
    {
        if (currentState.Count != 0) 
        {
            foreach (var item in currentState)
            {
                if (!_transition.ContainsKey(item.fromState))
                {
                    _transition.Add(item.fromState, new List<ContionOS>());
                    _transition[item.fromState].Add(item.condition);
                    Debug.Log("创建并添加");
                }
                else 
                {
                    if (_transition[item.fromState].Contains(item.condition)) 
                    {
                        _transition[item.fromState].Add(item.condition);
                        Debug.Log("存在并再次添加条件");
                    }
                }
            }
        }

    }

    [Serializable]
    private class translationState
    {
        public StateOS fromState;
        public StateOS toState;
        public ContionOS condition;

        private  translationState(StateOS fromState, StateOS toState, ContionOS condition) 
        {
            this.fromState = fromState;
            this.toState = toState;
            this.condition = condition;
        }
        
    }
}

③测试:将stateMachine脚本挂在物体上,并创建如下脚本并根据该脚本创ScriptableObject

实例 以及tranlsasitions实例

 有限状态机(FSM)


[CreateAssetMenu(fileName = "condition_idel", menuName = "statemachine/create/Condition/condition_idel")]
public class condition_idel: ContionOS
{
    public override bool SetUP()
    {
        return true;
    }
}
[CreateAssetMenu(fileName = "condition_walk", menuName = "statemachine/create/Condition/condition_walk")]
public class condition_walk : ContionOS
{
    public override bool SetUP()
    {
        return Input.GetKeyDown(KeyCode.W);
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "idel", menuName = "statemachine/create/stateos/idel")]
public class idel : StateOS
{
    public override void OnUpdate()
    {
        Debug.Log("正处于idel");
    }
    public override void OnEnter()
    {
        Debug.Log("进入idel");
    }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

[CreateAssetMenu(fileName = "walk", menuName = "statemachine/create/stateos/walk")]
public class walk : StateOS
{
    public override void OnUpdate()
    {
        Debug.Log("正处于walk");
    }
    public override void OnEnter()
    {
        Debug.Log("进入walk");
    }
}

根据路径创建相应的实例,将创建好的实例进行如下操作

有限状态机(FSM)

 有限状态机(FSM)

 有限状态机(FSM)

这只是一个最基本的fsm而且可以进行拓展。文章来源地址https://www.toymoban.com/news/detail-502682.html

到了这里,关于有限状态机(FSM)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Go中的有限状态机FSM的详细介绍 _

    1、FSM简介 1.1 有限状态机的定义 有限状态机(Finite State Machine,FSM)是一种数学模型,用于描述系统在不同状态下的行为和转移条件。 状态机有三个组成部分: 状态(State)、事件(Event)、动作(Action) ,事件(转移条件)触发状态的转移和动作的执行。动作的执行不是必

    2024年02月12日
    浏览(62)
  • Unity中的AI算法和实现2-有限状态机FSM(上)

    在上一篇文章中, 我们基于 Waypoint 构建了一个最简单的AI怪物, 这个怪物可以在几个点之间巡逻. 本篇文章会在此基础之上, 添加怪物在巡逻过程中发现玩家并追逐玩家, 并且在距离玩家一定距离之后脱离追逐然后继续进行巡逻. 在添加两个状态之前, 我们先介绍什么是 有限状态

    2024年02月01日
    浏览(32)
  • C# Unity FSM 状态机

    使用状态机可以降低代码耦合性,并且可以优化代码可读性,方便团队协作等。 对于游戏开发内容来讲游戏开发的流程控制玩家动画都可以使用FSM有限状态机来实现。 每个状态的基类,泛型参数表示所拥有者 有限状态机的接口 有限状态机管理器接口 有限状态机的基类 状态

    2024年02月09日
    浏览(38)
  • Spring状态机(FSM),让订单状态流转如丝般顺滑

    在复杂的应用程序设计中,尤其是那些涉及多个状态变迁和业务流程控制的场景,有限状态机( Finite State Machine, FSM )是一种强大而有效的建模工具。Spring框架为此提供了Spring状态机( Spring State Machine )这一组件,它允许开发者以一种声明式且结构清晰的方式来管理和控制对

    2024年03月12日
    浏览(27)
  • 前端状态管理与有限状态机

    当下前端流行的框架,都是用状态来描述界面(state = view),可以说前端开发实际上就是在维护各种状态(state),这已经成为目前前端开发的共识。 复制代码 View = ViewModel(Model); 理想情况下,ViewModel 是纯函数,给定相同的 Model,产出相同的 View。 state = view 很好理解,但如何在 vi

    2024年03月15日
    浏览(32)
  • 编译原理二:有限状态机

    有限状态机是一种 计算模型 ,它可以 接受一串输入并根据一组状态转移规则进行状态转移,最终输出一个结果 。有限状态机可以分为两种类型: 确定性有限状态机(DFA) 和 非确定性有限状态机(NFA) 。 DFA 是一种状态机,它的 每个状态都有一条出边对应每个输入符号,

    2024年02月11日
    浏览(29)
  • Unity有限状态机

    一、引言 在游戏开发中,经常会遇到游戏角色或实体具有多种状态,并且在不同状态之间需要切换的情况。例如,一个角色可能处于行走、奔跑、跳跃等不同的状态,并且根据玩家的输入或游戏逻辑,在这些状态之间进行切换。为了管理这些状态及其之间的转换,我们可以使

    2024年02月03日
    浏览(41)
  • 12-同步状态机的结构以及Mealy和Moore状态机的区别,Verilog实现有限状态机的4种方式,以及总结有限状态机设计的一般步骤

    由于寄存器传输级(RTL)描述的是以时序逻辑抽象所得到的有限状态机为依据,因此,把一个时序逻辑抽象成一个同步有限状态机是设计可综合风格的Verilog HDL模块的关键。 在本章节中,在了解状态机结构的基础上通过各种实例,由浅入深地介绍各种可综合风格的Verilog HDL模

    2024年01月17日
    浏览(35)
  • 在Unity中实现有限状态机

    本文将介绍Unity开发中的有限状态机,给出对应的实现代码。 有限状态机借鉴了图灵机的思想,可以看作是最简单的图灵机。 它包含4要素: 现态 条件 动作 次态 基础的有限状态机不复杂,无非是几个状态定义成类,提供OnEnter/OnExit/OnUpdate方法,这里直接根据需求给出对应的

    2024年02月05日
    浏览(38)
  • Linux网络编程——有限状态机

    在逻辑单元内部的一种高效的编程方法:有限状态机。 有的应用层协议头部包含数据包类型字段,每种类型可以映射为逻辑单元的一种执行状态,服务器可以根据它来编写相应的处理逻辑,下面代码展示的是 状态独立的有限状态机 这是一个简单的有限状态机,只不过该状态

    2024年02月07日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包