Unity Animator 自带也支持过渡条件, 我看了下PlayMaker没有这个概念. 最近研究下PlayMaker,图形化编程的确很爽. 但是PlayMaker 始于与给一些策划进行流程设置. 用它来全程做游戏我感觉会疯的.
在Playmaker上自己封装的条件类
using HutongGames.PlayMaker; using System.Collections; using System.Collections.Generic; using UnityEngine; public class CondFloat : BaseCond { [UIHint(UIHint.FsmFloat)] public FsmFloat mVal1; public ECondition mCondition; [UIHint(UIHint.FsmFloat)] public FsmFloat mVal2; public override bool Condition() { if (mCondition == ECondition.Equal) return mVal1.Value == mVal2.Value; if (mCondition == ECondition.Less) return mVal1.Value < mVal2.Value; if (mCondition == ECondition.Greater) return mVal1.Value > mVal2.Value; return false; } } public class CondBool : BaseCond { [UIHint(UIHint.FsmBool)] public FsmBool mVal1; public override bool Condition() { return mVal1.Value; } } public class CondString : BaseCond { [UIHint(UIHint.FsmString)] public FsmString mVal1; [UIHint(UIHint.FsmString)] public FsmString mVal2; public override bool Condition() { return mVal1.Equals(mVal2); } } public class CondMethod : BaseCond { [UIHint(UIHint.Method)] public FsmString mVal1; [UIHint(UIHint.Method)] public FsmString mVal2; public override bool Condition() { return mVal1.Equals(mVal2); } } [SerializeField] public class BaseCond { public string mEventName; public string GetEventName() { return mEventName; } public virtual bool Condition() { return false; } } public enum ECondition { Less, Equal, Greater }
using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using System.Collections; using System.Collections.Generic; using UnityEngine; [ActionCategory(ActionCategory.Debug)] [HutongGames.PlayMaker.Tooltip("发送事件")] public class SendMethod : FsmStateAction { public string mMethodName; public override void OnEnter() { this.Finish(); } }
using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using System.Collections; using System.Collections.Generic; using UnityEngine; public abstract class CondAction : SendMethod { public abstract BaseCond Condition { get;} public override void OnEnter() { bool l = Condition.Condition(); string s = Condition.GetEventName(); if (l) { this.Fsm.Event(s); Debug.Log("发送事件"); } this.Finish(); } }
using HutongGames.PlayMaker; using HutongGames.PlayMaker.Actions; using System.Collections; using System.Collections.Generic; using UnityEngine; using System; public class CondActionBool : CondAction { public CondBool mCondition; public override BaseCond Condition { get { return mCondition; } } }
代码浏览
代码地址: https://gitee.com/PFSchool/UFrame.git ScriptTools文件夹下