专栏首页Unity TechnologyJtro的技术分享:unity中写FSM状态机

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

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");
    }
}

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

有空再更新。。。。。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Jtro的技术分享:c#多态

    多态的作用就是把不同的子类都当作父类来看,通过继承实现不同的不同对象相同方法,表现出不同的行为,写出通用的代码,做出通用的编程,以适应需求的不断变化。

    LittleU
  • Jtro的技术分享:游戏模式之命令模式

    命令模式 命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以...

    LittleU
  • Jtro的技术分享:unity接入百度语音识别SDK

    首先,你要去百度申请一个百度的AI开放平台的账号:https://ai.baidu.com/?track=cp:aipinzhuan|pf:pc|pp:AIpi...

    LittleU
  • 快速学会像Git一样管理数据库业务版本变更

    随着项目的不断迭代,数据库表结构、数据都在发生着变化。甚至有的业务在多环境版本并行运行。数据为王的时代,管理好数据库的版本也成为了迫切的需要。如何能做到像 Gi...

    码农小胖哥
  • 高效优雅处理程序错误实战

    今天,讨论一下程序中的错误处理。也许你会觉得这个事没什么意思,处理错误的代码并不难写。但你想过没有,要把错误处理写好,并不是件容易的事情。另外,任何一个稳定的程...

    python编程从入门到实践
  • Spring Boot设置上传文件大小

    二十三年蝉
  • 一组匹配中国大陆手机号码的正则表达式

    [^(?:\+?86)?1(?:3\d{3}|5[^4\D]\d{2}|8\d{3}|7(?:[01356789]\d{2}|4(?:0\d|1[0-2]|9\...

    芋道源码
  • 虚拟机备份(VDP)

    L宝宝聊IT
  • Hadoop学习笔记—21.Hadoop2的改进内容简介

    Hadoop2相比较于Hadoop1.x来说,HDFS的架构与MapReduce的都有较大的变化,且速度上和可用性上都有了很大的提高,Hadoop2中有两个重要...

    Edison Zhou
  • 【设计模式】第九篇:组合模式解决层级关系结构问题

    说明:此文章两个示例中,公司结构的示例思路来自于《大话设计模式》,内容以及代码经过了一定修改,尊重且维护作者版权所有,特此声明。

    BWH_Steven

扫码关注云+社区

领取腾讯云代金券

,,