Unity进阶:PlayMaker
版权申明:
- 本文原创首发于以下网站:
- 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
- 优梦创客的官方博客:https://91make.top
- 优梦创客的游戏讲堂:https://91make.ke.qq.com
- 『优梦创客』的微信公众号:umaketop
您可以自由转载,但必须加入完整的版权声明
PlayMaker基于状态机的可视化编程工具,playmaker内部实现会为其创建一个类,在其实例化和序列化时会有开销(建立通过缓冲池避免),对复杂度要求较高的逻辑也可以将其封装到PlayMaker的Action中
playMaker基于有限状态机,一个状态机包括若干个状态节点,组合在一起形成游戏逻辑。每个状态节点包括若干Action,这些Action对应的就是Unity内的具体游戏功能,如播放动画,移动位置
PlayMaker状态机不能单独存在(其本身也是继承自MonoBehaviour),选择一个GameObjec,- PlayerMaker -> Components -> Add FSM to Selected Objects;将状态机指定给选中的GameObject,一个GameObject可以有多个状态机
State(状态)
创建状态机后,默认拥有一个状态节点,也就是起始节点,名为State1
在PlayMaker窗口中点击鼠标右键,选择Add State即可添加新的状态节点
Event 事件
在不同状态之间切换的条件,在PlayMaker中被称为事件,
选中状态节点并单击鼠标右键,选择Add Transition -> Finished创建一个结束事件,然后在状态节点下方会出现一个Finish选项,选中它并拖动到其他状态节点即可创建过渡,由当前节点转换到其他节点;此外还有很多事件,如System Event和Network Events
Custom Events(自定义事件)默认是空的,可以自定义事件的名称
Action 动作
状态节点本身没有任何功能,可以为状态节点添加Action实现功能
选中一个状态节点后,在状态机编辑窗口选择State,单击下方的Action Browser按钮,打开Action列表,选择Action(如Debug Log),单击Add Action to State,就为当前状态添加Action;在State中设置Log的文本即可在允许时输出日志;使用Finished事件切换状态实在1帧内完成的,我们添加一个Wait动作,等待2秒再切换,注意要把Wait动作的Finish Event设置为FINISHED(这样它在结束时应该会触发Finished事件)
变量
可以在Variable Type中选择变量类型,输入变量名称,点击Add添加变量,并可以编辑变量的初始值;如果希望创建全局变量,选择Global Variables即可创建全局变量,所有状态机对象均可访问,注意全局变量保存在PlayMakerGlobals.assets文件中
如果使用自定义Action,获取在状态机中设置的变量:
FsmString speed = this.Fsm.GetFsmString("speed");
发送事件 //在playMaker中事件意味着状态切换
使用Action列表中的StateMachine -> Send Event 或 Send Event By Name 即可;二者的区别在与Send Event By Name通过字符串名称来发生事件,当通信对象是不同状态机时,只能使用这种方式(有点像Unity自身用String发送的全局事件);选择Send Event的Event Target和Send Event的事件类型即可,如果是Send Event By Name,Send Event中输入的是一个字符串;
Aciton是一个动作啊,SendEvent就是一个Aciton,它的目的就是切换状态
自定义Action
Unity编辑器菜单栏中:PlayMaker -> Tools -> Custom Action Wizard打开自定义Action窗口
在Name and Descriptin中输入Aciton的名字和描述,
在Category中选择Action的类型或自定义类型
在Generated Code Folder中选择自定义Action脚本的存放位置
在Add Methods中选择默认的重载方法,OnEnter会在进入状态时触发,OnUpdate会在每帧执行,- OnExit会在退出状态节点时触发
最后单击Save Custom Action 按钮传教自动义Action脚本;
编译自定义MyAction脚本:
using UnityEngine;
namespace HutongGames.PlayMaker.Actions {
[ActionCategory("MyGame")]
public class MyAction : FsmStateAction {
[Tooltip("event name A")] //添加提示
public FsmString eventNameA = string.Empty; //下一个状态节点的名称 //再PlayMake创建该Action后,指定该Public变量对应的Event
[Tooltip("event name B")]
public FsmString eventNameB = string.Empty; //名称B,注意变量类型都是以Fsm开头
public FsmEventTarget target; //事件接收目标
public override void OnEnter()
{
target = new FsmEventTarget();
target.gameObject = new FsmOwnerDefault();
target.target = FsmEventTarget.EventTarget.GameObjectFSM; //选择目标类型,一个带有FSM的GameObject
target.gameObject.OwnerOption = OwnerDefaultOption.SpecifyGameObject; //事件类型
target.gameObject.GameObject = this.Owner; //这里设置事件接收对象时自己
}
public override void OnUpdate () { //每帧执行
if (Input.GetKeyUp(KeyCode.Keypad1)) {
Fsm.Event(target, eventNameA.Value); //如果按下数字键1,发送eventNameA事件
}
else if (Input.GetKeyUp(KeyCode.Keypad2)) {
Fsm.Event(target, eventNameB.Value);
}
}
public override void OnExit() {
Debug.Log("On Exit MyAction");
}
}
}
- 使用PlayMaker,默认只能在PlayMaker编辑器的Variables窗口中创建状态机的变量,但是如果使用自定义Action可以将所有状态机引用的变量单独放到脚本中保存:
public class MyData
{
public string title = string.Empty;
public int money = 0;
public bool isActiv = true;
}
- 然后再Action中引用MyData:
public class MyAction : FsmStateAction
{
public MyData myData;
}
- 然后就可以再自定义的Action代码中获取MyData变量
Unity进阶:PlayMaker的更多相关文章
- 转一篇关于Unity的PlayMaker
这篇文章转自http://va.lent.in/should-you-use-playmaker-in-production/ 此文作者大概深受其苦,吐槽了playmaker的多个蛋疼的地方,这其实说 ...
- Unity进阶技巧 - 动态创建UGUI
前言 项目中有功能需要在代码中动态创建UGUI对象,但是在网上搜索了很久都没有找到类似的教程,最后终于在官方文档中找到了方法,趁着记忆犹新,写下动态创建UGUI的方法,供需要的朋友参考 你将学到什么? ...
- Unity进阶----Lua语言知识点(2018/11/08)
国内开发: 敏捷开发: 集中精力加班堆出来第一个版本 基本没啥大的bug 国外开发: 1).需求分析: 2).讨论 3).分模块 4).框架 5).画UML图(类图class function)(e- ...
- Unity进阶----AssetBundle_02(加载依赖关系及网络资源)(2018/10/31)
网络资源加载: string path ="file://"+ Application.streamingAssetsPath + "\\windows\\123&quo ...
- Unity进阶----AssetBundle_01(2018/10/30)
AssetBundle作用和定义 1).AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载: 2).AssetBundle自身保存着互相的依赖关系 ...
- Unity进阶技巧 - 使用MonoDevelop来断点调试
前言 断点调试在编程调试过程中是一项非常重要的功能,而Unity自带的脚本编辑器MonoDevelop需要进行一些设置才能使用断点调试的功能,今天我们就来看看如何使用MonoDevelop进行断点调试 ...
- Unity进阶之:Shader渲染
版权声明: 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客&qu ...
- Unity进阶之ET网络游戏开发框架 01-下载、运行
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
- Unity进阶之ET网络游戏开发框架 02-ET的客户端启动流程分析
版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...
随机推荐
- Maven国内镜像 Maven阿里云镜像
<mirror> <id>nexus-aliyun</id> <mirrorOf>central</mirrorOf> <name&g ...
- JNDI资源(一)
JNDI:Java命名与目录接口 是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录的通用.统一的服务. 使用JNDA的步骤: 1.配置资源. //Tomcat跟目录/conf/co ...
- wangEditor富文本编辑器使用及图片上传
引入js文件 <script type="text/javascript" src="style/js/wangEditor.min.js">< ...
- springBoot数据校验与统一异常处理
概念 异常,在程序中经常发生,如果发生异常怎样给用户一个良好的反馈体验就是我们需要处理的问题.以前处理异常信息,经常都是给前端一个统一的响应,如数据错误,程序崩溃等等.没办法指出哪里出错了,这是一种对 ...
- 【POJ - 3104 】Drying(二分)
Drying 直接上中文 Descriptions 每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台 ...
- 浅谈 ASCII、Unicode、UTF-8,一目了然
对于ASCII.Unicode.UTF-8这三种编码方式我们经常用到,也经常挂到嘴边,但他们是怎么来的,为什么要存在,具体是怎么个规则,我们并没有做深入了解,下面,就带你看一下他们到底是怎么回事吧…… ...
- PYNQ上手笔记 | ① 启动Pynq
现在人工智能非常火爆,一般的教程都是为博硕生准备的,太难看懂了,分享一个非常适合小白入门的教程,不仅通俗易懂而且还很风趣幽默,点☞这里☜进入传送门~ = = = = 我是华丽的分割线 = ...
- maysql的自增字段
因为mysql中的自增字段与oracle数据库是不一样的,所以在这里唠嗑一下mysql的自增字段 1.添加自增字段 1.1 在创建表时添加 create table emp( empno ) auto ...
- C#连接SQL Anywhere 12 数据库
using System;using System.Data.Common; namespace ConsoleApplication27{ class Program { ...
- 【错误】【vscode】输出中文是乱码问题