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"); } }
第一种状态机介绍完成,记得一点,状态机是环形切换,不能跳过状态
下面是第二种状态机:
有空再更新。。。。。
原文地址:https://www.jianshu.com/p/6026ce3737bc
相关推荐
-
.NET Core中 实现H5微信登录(静默授权方式) C#
2019-5-15
-
ASP.NET Core WebApi + Microsoft.EntityFrameworkCore 连接 Mysql/Sqlserver 的项目框架搭建 C#
2019-8-31
-
Bumblebee微服务网关的部署和扩展 C#
2019-5-12
-
Wtm携手LayUI — .netcore 开源生态我们是认真的! C#
2019-9-8
-
初探机器学习之使用讯飞TTS服务实现在线语音合成 C#
2019-5-10
-
分布式事务之消息补偿解决方案 C#
2019-6-2
-
C# 多线程小试牛刀 C#
2019-6-10
-
[ASP.NET Core MVC] 如何实现运行时动态定义Controller类型? C#
2020-6-13
-
列表ListBox、ListView、GridView 排序 C#
2019-6-14
-
Dockerfile+Jenkinsfile+GitLab轻松实现.NetCore程序的CI&CD C#
2020-6-12