public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Label("NodePool State: Active/All", EditorStyles.boldLabel); GUILayout.Label($"Action: {ActionSequenceSystem.countActiveAction}/{ActionSequenceSystem.countAllAction}"); GUILayout.Label($"IAction: {ActionSequenceSystem.countActiveIAction}/{ActionSequenceSystem.countAllIAction}"); GUILayout.Label($"Interval: {ActionSequenceSystem.countActiveInterval}/{ActionSequenceSystem.countAllInterval}"); GUILayout.Label($"Condition: {ActionSequenceSystem.countActiveWaitFor}/{ActionSequenceSystem.countAllWaitFor}"); GUILayout.Label($"Enable: {ActionSequenceSystem.countActiveEnable}/{ActionSequenceSystem.countAllEnable}"); GUILayout.Label($"SetActive: {ActionSequenceSystem.countActiveSetActive}/{ActionSequenceSystem.countAllSetActive}"); GUILayout.Label($"Sequence: {ActionSequence.countActive}/{ActionSequence.countAll}"); EditorGUILayout.Separator(); //Showing ActionSequences in progress GUILayout.Label("ActionSequences in progress", EditorStyles.boldLabel); ActionSequenceSystem actionSequenceSystem = target as ActionSequenceSystem; isShowSequenceInfo = EditorGUILayout.Foldout(isShowSequenceInfo, $"Sequence: {actionSequenceSystem.ListSequenceAlive.Count}"); if (isShowSequenceInfo) { UpdateInfo(actionSequenceSystem.ListSequenceAlive); } Repaint(); }
//直接延迟动作 public static ActionSequence Delayer(this Component id, float delay, Action action) { ActionSequence seq = ActionSequenceSystem.GetSequence(id); seq.Interval(delay).Action(action); return(seq); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); int countAll, countActive; GUILayout.Label("ObjectPool State: Active/All", EditorStyles.boldLabel); ActionNodeAction.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("ActionNode: {0}/{1}", countActive, countAll)); ActionNodeInterval.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("IntervalNode: {0}/{1}", countActive, countAll)); ActionNodeCondition.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("ConditionNode: {0}/{1}", countActive, countAll)); ActionSequence.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("Sequence: {0}/{1}", countActive, countAll)); //Showing ActionSequences in progress ActionSequenceSystem actionSequenceSystem = target as ActionSequenceSystem; GUILayout.Label(string.Format("Sequence Count: {0}", actionSequenceSystem.ListSequence.Count), EditorStyles.boldLabel); for (int i = 0; i < actionSequenceSystem.ListSequence.Count; i++) { if (!actionSequenceSystem.ListSequence[i].isFinshed) { GUILayout.Box(string.Format("{0} id: {1}\n Loop:{2}/{3}", i, actionSequenceSystem.ListSequence[i].id, actionSequenceSystem.ListSequence[i].cycles, actionSequenceSystem.ListSequence[i].loopTime), "TextArea"); } } Repaint(); }
public override void OnInspectorGUI() { base.OnInspectorGUI(); GUILayout.Label("NodePool State: Active/All", EditorStyles.boldLabel); GUILayout.Label(string.Format("Action: {0}/{1}", ActionSequenceSystem.countActiveAction, ActionSequenceSystem.countAllAction)); GUILayout.Label(string.Format("Interval: {0}/{1}", ActionSequenceSystem.countActiveInterval, ActionSequenceSystem.countAllInterval)); GUILayout.Label(string.Format("Condition: {0}/{1}", ActionSequenceSystem.countActiveWaitFor, ActionSequenceSystem.countAllWaitFor)); GUILayout.Label(string.Format("SetActive: {0}/{1}", ActionSequenceSystem.countActiveSetActive, ActionSequenceSystem.countAllSetActive)); GUILayout.Label(string.Format("Sequence: {0}/{1}", ActionSequence.countActive, ActionSequence.countAll)); EditorGUILayout.Separator(); //Showing ActionSequences in progress GUILayout.Label("ActionSequences in progress", EditorStyles.boldLabel); ActionSequenceSystem actionSequenceSystem = target as ActionSequenceSystem; isShowSequenceInfo = EditorGUILayout.Foldout(isShowSequenceInfo, string.Format("Sequence: {0}", actionSequenceSystem.ListSequenceAlive.Count)); if (isShowSequenceInfo) { UpdateInfo(actionSequenceSystem.ListSequenceAlive); } isShowSequenceUnscaledInfo = EditorGUILayout.Foldout(isShowSequenceUnscaledInfo, string.Format("SequenceUnscaled: {0}", actionSequenceSystem.ListSequenceUnscaleAlive.Count)); if (isShowSequenceUnscaledInfo) { UpdateInfo(actionSequenceSystem.ListSequenceUnscaleAlive); } Repaint(); }
private static void Create() { GameObject go = new GameObject("[ActionSequenceSystem]"); DontDestroyOnLoad(go); instance = go.AddComponent <ActionSequenceSystem>(); }
private void OnDestroy() { if (instance == this) { instance = null; isQuitting = false; } }
private void OnDestroy() { if (isDuplicate) { return; } if (instance == this) { instance = null; } }
public void Play() { //停止当前的动画 Stop(); if (nLength <= 0) { return; } //处理播放顺序 if (playOrder == PlayOrder.Forward) { nStartFrame = 0; nSign = 1; } else { nStartFrame = nLength - 1; nSign = -1; } //处理循环模式 switch (loopType) { case LoopType.Once: loopTypeFun = UpdateFrameFuncOnce; break; case LoopType.Loop: loopTypeFun = UpdateFrameFuncLoop; break; case LoopType.PingPong: loopTypeFun = UpdateFrameFuncPingPong; break; default: break; } float interval = 1 / FPS; nCurFrame = nStartFrame; isPlaying = true; //开启定时器 //这里使用了ActionSequenceSystem作为Timer,也可以使用DOTween的Sequence,当然您也可以使用您的Timer #if DOTween DOTween.Sequence().SetId(this).SetRecyclable().AppendInterval(interval).AppendCallback(UpdateFrame).SetLoops(-1); #else timer = ActionSequenceSystem.Looper(interval, -1, false, UpdateFrame); #endif }
public override void OnInspectorGUI() { base.OnInspectorGUI(); int countAll, countActive; GUILayout.Label("ObjectPool State: Active/All", EditorStyles.boldLabel); ActionNodeAction.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("ActionNode: {0}/{1}", countActive, countAll)); ActionNodeInterval.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("IntervalNode: {0}/{1}", countActive, countAll)); ActionNodeWaitFor.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("ConditionNode: {0}/{1}", countActive, countAll)); ActionNodeSetActive.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("HideNode: {0}/{1}", countActive, countAll)); ActionSequence.GetObjectPoolInfo(out countActive, out countAll); GUILayout.Label(string.Format("Sequence: {0}/{1}", countActive, countAll)); //Showing ActionSequences in progress ActionSequenceSystem actionSequenceSystem = target as ActionSequenceSystem; GUILayout.Label(string.Format("Sequence Count: {0}", actionSequenceSystem.ListSequenceAlive.Count), EditorStyles.boldLabel); for (int i = 0; i < actionSequenceSystem.ListSequenceAlive.Count; i++) { ActionSequence sequence = actionSequenceSystem.ListSequenceAlive[i]; //if (!sequence.isFinshed) //{ if (sequence.loopTime == 0) //It's a delayer { GUILayout.Box(string.Format(" ID: {0}\n Time({1:F2})", sequence.id, sequence.timeAxis), "TextArea"); } else if (sequence.loopTime < 0) //It's a infinite looper { GUILayout.Box(string.Format(" ID: {0}\n Time({1:F2}) Loop({2}/{3}) Node[{4}]", sequence.id, sequence.timeAxis, sequence.cycles, sequence.loopTime, sequence.nodes.Count), "TextArea"); } else //It's a count looper { GUILayout.Box(string.Format(" ID: {0}\n Time({1:F2}) Loop({2}/{3}) Node[{4}]", sequence.id, sequence.timeAxis, sequence.cycles, sequence.loopTime + 1, sequence.nodes.Count), "TextArea"); } //} } Repaint(); }
//直接循环动作 public static ActionSequence Looper(this Component id, float interval, int loopTime, bool isActionAtStart, Action <int> action) { ActionSequence seq = ActionSequenceSystem.GetSequence(id); if (isActionAtStart) { seq.Action(action).Interval(interval); } else { seq.Interval(interval).Action(action); } seq.Loop(loopTime); return(seq); }
//用Handle开序列 public ActionSequence Sequence(Component id = null) { return(ActionSequenceSystem.GetSequence(id).SetHandle(this)); }
/// <summary> /// 用Component作为ID开序列 /// </summary> /// <param name="id"></param> /// <returns></returns> public static ActionSequence SequenceUnscaled(this Component id) { return(ActionSequenceSystem.SequenceUnscaled(id)); }
/// <summary> /// 用Component作为ID开序列,并使用“控制句柄” /// </summary> /// <param name="id"></param> /// <param name="handle">控制句柄</param> /// <returns></returns> public static ActionSequence SequenceUnscaled(this Component id, ActionSequenceHandle handle) { return(ActionSequenceSystem.SequenceUnscaled(id).SetHandle(handle)); }
/// <summary> /// 用Component作为ID停止序列 /// </summary> /// <param name="id"></param> public static void StopSequence(this Component id) { ActionSequenceSystem.StopSequence(id); }
//用Component作为ID开序列 public static ActionSequence Sequence(this Component id) { ActionSequence seq = ActionSequenceSystem.GetSequence(id); return(seq); }
/// <summary> /// 用Component作为ID开序列 /// </summary> /// <param name="id"></param> /// <returns></returns> public static ActionSequence Sequence(this Component id) => ActionSequenceSystem.Sequence(id);
//用Component作为ID开序列 public static ActionSequence Sequence(this Component id) { return(ActionSequenceSystem.GetSequence(id)); }
//用Component作为ID停止序列 public static void StopSequence(this object id) { ActionSequenceSystem.SetStopSequenceID(id); }
/// <summary> /// 用Handle开序列 /// </summary> /// <returns></returns> public ActionSequence Sequence() { return(ActionSequenceSystem.Sequence().SetHandle(this)); }
/// <summary> /// 用Component作为ID开序列,并使用“控制句柄” /// </summary> /// <param name="id"></param> /// <param name="handle">控制句柄</param> /// <returns></returns> public static ActionSequence Sequence(this Component id, ActionSequenceHandle handle) => ActionSequenceSystem.Sequence(id).SetHandle(handle);