经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » 游戏设计 » 查看文章
Unity进阶:PlayMaker
来源:cnblogs  作者:优梦创客  时间:2019/9/10 10:31:04  对本文有异议

版权申明:

  • 本文原创首发于以下网站:
  1. 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123
  2. 优梦创客的官方博客:https://91make.top
  3. 优梦创客的游戏讲堂:https://91make.ke.qq.com
  4. 『优梦创客』的微信公众号: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脚本:

  1. using UnityEngine;
  2. namespace HutongGames.PlayMaker.Actions {
  3. [ActionCategory("MyGame")]
  4. public class MyAction : FsmStateAction {
  5. [Tooltip("event name A")] //添加提示
  6. public FsmString eventNameA = string.Empty; //下一个状态节点的名称 //再PlayMake创建该Action后,指定该Public变量对应的Event
  7. [Tooltip("event name B")]
  8. public FsmString eventNameB = string.Empty; //名称B,注意变量类型都是以Fsm开头
  9. public FsmEventTarget target; //事件接收目标
  10. public override void OnEnter()
  11. {
  12. target = new FsmEventTarget();
  13. target.gameObject = new FsmOwnerDefault();
  14. target.target = FsmEventTarget.EventTarget.GameObjectFSM; //选择目标类型,一个带有FSM的GameObject
  15. target.gameObject.OwnerOption = OwnerDefaultOption.SpecifyGameObject; //事件类型
  16. target.gameObject.GameObject = this.Owner; //这里设置事件接收对象时自己
  17. }
  18. public override void OnUpdate () { //每帧执行
  19. if (Input.GetKeyUp(KeyCode.Keypad1)) {
  20. Fsm.Event(target, eventNameA.Value); //如果按下数字键1,发送eventNameA事件
  21. }
  22. else if (Input.GetKeyUp(KeyCode.Keypad2)) {
  23. Fsm.Event(target, eventNameB.Value);
  24. }
  25. }
  26. public override void OnExit() {
  27. Debug.Log("On Exit MyAction");
  28. }
  29. }
  30. }
  • 使用PlayMaker,默认只能在PlayMaker编辑器的Variables窗口中创建状态机的变量,但是如果使用自定义Action可以将所有状态机引用的变量单独放到脚本中保存:
  1. public class MyData
  2. {
  3. public string title = string.Empty;
  4. public int money = 0;
  5. public bool isActiv = true;
  6. }
  • 然后再Action中引用MyData:
  1. public class MyAction : FsmStateAction
  2. {
  3. public MyData myData
  4. }
  • 然后就可以再自定义的Action代码中获取MyData变量

原文链接:http://www.cnblogs.com/raymondking123/p/11457260.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号