FSM(有限状态机)模块

2020-01-14  本文已影响0人  Qkuang

IFramework所有模块总目录

简介

状态模式+有限状态机的思路,可以在各个状态之间来回切换。

FSM模块的使用

代码如下:

using System.Collections;
using System.Collections.Generic;
using IFramework;
using IFramework.FSM;           // 引入FSM命名空间
using UnityEngine;

//实现 IFsmState接口。
public class JumpState : IFsmState
{
    public void OnEnter()
    {
        Debug.Log("跳跃状态进入……");
    }
    public void OnExit()
    {
        Debug .Log("跳跃状态退出……");

    }
    public void Update()
    {
        Log.L("跳跃!");
    }
}

public class RunState : IFsmState
{
    public void OnEnter()
    {
         Debug.Log("奔跑状态进入……");
    }

    public void OnExit()
    {
        Debug .Log("奔跑状态退出……");

    }

    public void Update()
    {
        Log.L("奔跑!");

    }
}
public class IdleState : IFsmState
{
    public void OnEnter()
    {
        Debug.Log("待机状态进入……");
    }

    public void OnExit()
    {
        Debug .Log("待机状态退出……");
    }

    public void Update()
    {
        Log.L("待机!");
    }
}
public class TestFSM : MonoBehaviour
{
    // Start is called before the first frame update
    FsmMoudle fsmMoudle ;
    JumpState jumpState;
    RunState runState ;
    IdleState idleState ;
    void Start()
    {
        // 初始化 状态机、跑状态、
        fsmMoudle = new FsmMoudle();
        jumpState = new JumpState();
        runState = new RunState();
        idleState = new IdleState ();
        
        //将状态 都加入 状态机中
        fsmMoudle.SubscribeState(jumpState);
        fsmMoudle.SubscribeState(runState);
        fsmMoudle.SubscribeState(idleState);
        // 设置初始 状态
        fsmMoudle.EnterState = idleState;
        // 创建过渡条件数值
         var val=fsmMoudle.CreateConditionValue<bool>("bool", true);
         //过渡链接线创建
            var t1=  fsmMoudle.CreateTransition(idleState, jumpState);
            var t2 = fsmMoudle.CreateTransition(jumpState, runState);
        //过渡连接线绑定过渡条件
            t1.BindCondition(fsmMoudle.CreateCondition<bool>("bool", false, ConditionCompareType.EqualsWithCompare));
            t2.BindCondition(fsmMoudle.CreateCondition<bool>(val, true, ConditionCompareType.EqualsWithCompare));
           //第八步、启动状态机
            fsmMoudle.Start();

    }

    // Update is called once per frame
    void Update()
    {
        fsmMoudle.Update();
        if (Input.GetKeyDown(KeyCode.Space))
            {
               fsmMoudle.SetBool("bool", false);
            }
            if (Input.GetKeyDown(KeyCode.D))
            {
                fsmMoudle.SetBool("bool", true);
            }
 
    }
}

输出结果:

注意: 先点击的“空格”,再点击的“D键”,途中多次点击,并不会出现状态胡乱切换的情况。

image.png

代码解析

结尾

以上内容是 作者个人的理解,如有错误,欢迎指出。
顺便给出OnClick大佬自己 写的文档地址:005 FSM 模块
如果对 IF框架有其他看法,也欢迎大家 进群交流。

上一篇 下一篇

猜你喜欢

热点阅读