- 创建自定义Action
- 创建过度条件Event
- 状态与变量传递Variable
一个游戏有两个工具是一定离不开的,一个是节点型工具,典型代表Playmaker,Bot,蓝图
一个节点型工具,使用时至少有三个基本功能绕不开
创建自定义Action创造自定义Action的意义:
在Playmaker中,有很多现成的Action 可以使用,但是大部分时候,需要根据现有业务逻辑创造特定的Action,这可以自定义变量,自己掌握整个Action运作流程,比如虽然自带动画播放,但是根据实际情况还是需要自己写一个
比如需要结合轨道型工具做轨道间的动画过度,显然自带的动画不能帮助我们实现这个
在实际使用中自带的Action 参考意义更大
1.创造自定义Action步骤:继承FsmStateAction,实现其方法
[ActionCategory("Cutscene")]
public class PlayCutsceneAction : FsmStateAction
{
[UnityEngine.Tooltip("Cutscene名字")]
public string CutsceneName;
public override void Reset()
{
base.Reset();
}
public override void OnEnter()
{
Debug.Log("播放Cuescene");
CutsceneHelper.Play(Fsm.GameObject, CutsceneName);
Finish();
}
public override void OnUpdate()
{
base.OnUpdate();
}
public override void OnExit()
{
base.OnExit();
}
}
2.ActionCategory 表示分类,添加即可实现自定义行为
自定义Event
Event是过度的条件,比较自由,根据Playmaker官方手册实现即可
1.可以在Action里使得action之间的过度行为成立(即发送了Event事件)
2.可以在Animation (动画片段中,发送事件)
3.可以在脚本中使得过度行为成立(比如在Action脚本中)
1,2参考手册连接:
https://hutonggames.fogbugz.com/default.asp?W128
3.通过脚本
如果是在Action脚本中,可以直接通过FSM发送Event事件
Fsm.SendEventToFsmOnGameObject(this.Owner,this.Fsm.Name,“IdleToRun”);
在非Action脚本中
静态对象Playmaker,获取FSM,然后发送即可,FsmList是场景所有的Fsm,需要找到目标Fsm
PlayMakerFSM.FsmList.First().SendEvent();
PlayMakerFSM.FsmList.First().Fsm.SendEventToFsmOnGameObject(...);
通过FsmName找对应的Fsm
PlayMakerFSM.FsmList.First().FsmName
静态对象FSm,获取FSMList,然后发送即可, Fsm.FsmList.First().SendEventToFsmOnGameObject(…);
状态与变量传递VariablePlaymaker 的状态会根据Action 依次Enter,然后依次Update,退出依次调用Exit
最基本的两个变量传递需求:
1.要在同一个状态的不同Action传递变量,
2.要在不同的状态,不同的Action传递变量,
有两个方法可以做到,
1.最简单的方法采用全局变量,这样所有状态的Action都可以访问到,
2.使用Playmaker Fsmvalue,推荐使用此方法,可视化更方便调试
使用自带的FsmValue,声明即可在Playmaker面板设置值
public FsmFloat offsetTime;
然后新建变量/全局变量 即可在状态所有的Action 传递值(两个Action选择同一变量即可实现值传递)
定义自己的Fsmvalue
如果没有所选变量类型呢?这时候需要定义自己的Fsmvalue
Assets > Create > Playmaker > New Custom Variable Type Definition
Custom Variable Type Definition Error: Invalid object type (must be UnityEngine.Object or Enum): value1:Slate.myValue (Assets/ThirdParty/ParadoxNotion/SLATE Cinematic Sequencer/Directables/Clips/Runtime/AnimatorTrack/myValue.asset)
定义自定义的类型需要是 UnityEngine.Object or Enum ,比如官方示例的System.DayOfWeek
如果无法满足自己的需求,比如某些特殊数据结构需要在Cutscene之间进行数据传递,那只能脱离playmaker,做类似全局变量的存在了
Playmaker貌似无法从当前状态知道下一个即将进入的状态(即在某状态的Exit无法向下一个状态传递信息)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)