Jtro的技术分享:unity中写FSM状态机

作者: UnityPlane | 来源:发表于2018-09-07 11:34 被阅读14次

HI :大家好
状态机,在游戏开发的时候,用的比较多,一般是用在开发游戏中小怪的逻辑上,最近比较忙,所以忘了简书种更新文章,
今天我给大家介绍2种状态机的写法。
这是去年写的机器人的状态机,我是做VR开发的,机器人在项目中起到提示玩家的作用,提示玩家,包含,确定将消息已经完整的提示到玩家,指引玩家到规定的位置,在玩家操作的地方等待玩家一共是3个状态.
这个机器人的运行模式已经被公司申请了专利,一种教学模式的指引机器人。当然状态机只是机器人的冰山一角。主要的功能就是机器人的状态机功能
第一种状态机:
首先是写一个接口:

//    脚本功能:状态机接口
//此脚本挂载在:  null  上
//    初创日期:2017.9.29
//        作者:张曙光
//  第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public interface IState  {
     void Execute (AIController ac);
}

状态机的总控制:

//    脚本功能:机器人的有限状态机,用于传递状态机
//此脚本挂载在:   机器人根 上
//    初创日期:2017.9.29
//        作者:张曙光
//  第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FSM : MonoBehaviour {
    public IState currentState { get; private set;}
    public bool isCanMoveToCamera;
    public bool isCanMoveToMission;
    public bool isCanMoveToExcut;
    public AIController ac;
    // Use this for initialization
    void Start () {
        
    }//End of Start 

    public void ChangeState (IState newState)
    {
        currentState = newState;
    }
    // Update is called once per frame
    void Update () {
        if (currentState !=null &&ac !=null)
        {
            currentState.Execute (ac);
        }   
    }//End of Update
}

具体的状态,这里就举一个例子

//    脚本功能:
//此脚本挂载在:    上
//    初创日期:
//        作者:张曙光
//  第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class _MoveCameraState : IState {
    public void Execute (AIController ac)
    {
        if (ac.fsm.isCanMoveToCamera) {
            ac.MoveToCamera ();
        } else {
            ac .fsm .ChangeState (new _MoveMissionState());
        }
    }
}

最后是一个控制器:

//    脚本功能:控制机器人做事
//此脚本挂载在:  机器人  上
//    初创日期:2017.9.29
//        作者:张曙光
//  第一次修改:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AIController : MonoBehaviour {
    public FSM fsm;
    // Use this for initialization
    void Start () {
        fsm = GetComponent <FSM > ();
        fsm.ac = this;
        //初始化一个默认的状态机
        fsm .ChangeState (new _MoveCameraState ());
    }//End of Start 
    public void MoveToCamera ()
    {
        Debug.Log ("移动到相机");
    }
    public void MoveToMission ()
    {
        Debug.Log ("移动到任务点");
    }
    public void MoveToExcut()
    {
        Debug.Log ("移动到执行点");
    }
    public void test1 ()
    {
        Debug.Log ("test1");
    }
    public void test2 ()
    {
        Debug.Log ("test2");
    }
}

第一种状态机介绍完成,记得一点,状态机是环形切换,不能跳过状态
下面是第二种状态机:
有空再更新。。。。。

相关文章

  • Jtro的技术分享:unity中写FSM状态机

    HI :大家好状态机,在游戏开发的时候,用的比较多,一般是用在开发游戏中小怪的逻辑上,最近比较忙,所以忘了简书种更...

  • Finite-state Machine 有限状态机

    FSM 有限状态机和Unity的Animator类似,不过FSM除了动画还可以应用在如AI状态等。 FSM框架 S...

  • GDGeek使用总结

    FSM(有限状态机) GDGeek的FSM实现了分层状态机,并且整合了任务(Task)和插值动画(Tween),使...

  • unity fsm 有限状态机

    FSM 有限状态机 概念 如其名,在有限的状态下,管理状态的转移的一种设计模式 基本思路 如 状态a 要切换到 状...

  • [Unity]有限状态机FSM

    概念 1.有限状态机:状态机由状态寄存器和组合逻辑电路构成,能够根据控制信号按照预先设定的状态进行状态转移,是协调...

  • FPGA Verilog HDL 设计-----有限状态机

    数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机...

  • Jtro的技术分享:unity的串口通讯

    今天一天时间都在面向Google编程.这也蛮头疼的,哈哈 串行接口(串口)通常指COM接口,是采用串行通信方式的扩...

  • FPGA状态机

    其他参考:主要是区分moore状态机和mealy状态机的。[原创][FPGA]有限状态机FSM学习笔记(一)[转载...

  • 有限状态机抽取地址

    有限元状态机 什么是有限状态机 有限状态机(英语:finite-state machine,缩写:FSM)又称有限...

  • Android StateMachine

    状态机 状态机定义 状态机,Finite state machine,简称FSM。指一个对象在有限个状态内转移并处...

网友评论

  • 雨落随风:怎么感觉他算不上一个完整的状态机啊

本文标题:Jtro的技术分享:unity中写FSM状态机

本文链接:https://www.haomeiwen.com/subject/vtzqgftx.html