203 lines
4.9 KiB
C#
203 lines
4.9 KiB
C#
|
|
using ActionCustom;
|
|||
|
|
using System;
|
|||
|
|
using System.Collections.Generic;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace UnrealM
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public class ActionSequence
|
|||
|
|
{
|
|||
|
|
internal static readonly ObjectPool<ActionSequence> opSequences = new ObjectPool<ActionSequence>(64);
|
|||
|
|
|
|||
|
|
//<2F>ڵ<EFBFBD><DAB5>б<EFBFBD><D0B1><EFBFBD>Ĭ<EFBFBD>ϰ<EFBFBD><CFB0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ8
|
|||
|
|
public readonly List<ActionNode> nodes = new List<ActionNode>(8);
|
|||
|
|
|
|||
|
|
//<2F><>ǰִ<C7B0>еĽڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
private int curNodeIndex = 0;
|
|||
|
|
|
|||
|
|
//ʱ<><CAB1><EFBFBD><EFBFBD>
|
|||
|
|
public float timeAxis;
|
|||
|
|
|
|||
|
|
//Ŀ<><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٵ<EFBFBD>ʱ<EFBFBD><EFBFBD><F2A3ACB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD>
|
|||
|
|
public Component id { get; private set; }
|
|||
|
|
private bool isWithoutID = false;
|
|||
|
|
|
|||
|
|
//<2F><>Ҫѭ<D2AA><D1AD><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD>
|
|||
|
|
public int loopTime { get; private set; }
|
|||
|
|
|
|||
|
|
//<2F>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD>еĴ<D0B5><C4B4><EFBFBD>
|
|||
|
|
public int cycles { get; private set; }
|
|||
|
|
|
|||
|
|
//<2F>Ƿ<EFBFBD><C7B7>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
public bool isFinshed { get; private set; }
|
|||
|
|
|
|||
|
|
#if UNITY_EDITOR
|
|||
|
|
public static void GetObjectPoolInfo(out int countActive, out int countAll)
|
|||
|
|
{
|
|||
|
|
countActive = opSequences.countActive;
|
|||
|
|
countAll = opSequences.countAll;
|
|||
|
|
}
|
|||
|
|
#endif
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ֹͣ
|
|||
|
|
public void Stop()
|
|||
|
|
{
|
|||
|
|
id = null;
|
|||
|
|
isFinshed = true;
|
|||
|
|
cycles = 0;
|
|||
|
|
loopTime = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>нڵ<D0BD>
|
|||
|
|
public ActionSequence Interval(float interval)
|
|||
|
|
{
|
|||
|
|
nodes.Add(ActionNodeInterval.Get(interval));
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
public ActionSequence Action(Action action)
|
|||
|
|
{
|
|||
|
|
nodes.Add(ActionNodeAction.Get(action));
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
public ActionSequence Action(Action<int> action)
|
|||
|
|
{
|
|||
|
|
ActionNodeAction actionNodeAction = ActionNodeAction.Get(action);
|
|||
|
|
nodes.Add(actionNodeAction);
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>
|
|||
|
|
public ActionSequence Condition(Func<bool> condition)
|
|||
|
|
{
|
|||
|
|
nodes.Add(ActionNodeCondition.Get(condition));
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD>
|
|||
|
|
public ActionSequence Loop(int loopTime = -1)
|
|||
|
|
{
|
|||
|
|
if (loopTime > 0)
|
|||
|
|
{
|
|||
|
|
this.loopTime = loopTime - 1;
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
this.loopTime = loopTime;
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
private ActionSequence Start(Component id)
|
|||
|
|
{
|
|||
|
|
this.id = id;
|
|||
|
|
curNodeIndex = 0;
|
|||
|
|
isFinshed = false;
|
|||
|
|
cycles = 0;
|
|||
|
|
timeAxis = 0;
|
|||
|
|
isWithoutID = false;
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
private ActionSequence Start()
|
|||
|
|
{
|
|||
|
|
isWithoutID = true;
|
|||
|
|
curNodeIndex = 0;
|
|||
|
|
isFinshed = false;
|
|||
|
|
cycles = 0;
|
|||
|
|
timeAxis = 0;
|
|||
|
|
return this;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>и<EFBFBD><D0B8><EFBFBD>
|
|||
|
|
public void Update(float deltaTime)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ѿ<EFBFBD>Stop<6F><70>
|
|||
|
|
if (isFinshed)
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>id<69><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
if (!isWithoutID && id == null)
|
|||
|
|
{
|
|||
|
|
isFinshed = true;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>û<EFBFBD>м<EFBFBD><D0BC>κνڵ<CEBD>
|
|||
|
|
if (nodes.Count == 0)
|
|||
|
|
{
|
|||
|
|
isFinshed = true;
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
timeAxis += deltaTime;
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>½ڵ<C2BD>
|
|||
|
|
if (nodes[curNodeIndex].Update(this))
|
|||
|
|
{
|
|||
|
|
curNodeIndex++;
|
|||
|
|
if (curNodeIndex >= nodes.Count)
|
|||
|
|
{
|
|||
|
|
//<2F><><EFBFBD><EFBFBD>ѭ<EFBFBD><D1AD><EFBFBD>Ľڵ<C4BD>
|
|||
|
|
if (loopTime < 0)
|
|||
|
|
{
|
|||
|
|
Restart();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//ѭ<><D1AD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD>++
|
|||
|
|
if (loopTime > cycles)
|
|||
|
|
{
|
|||
|
|
Restart();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD>д<EFBFBD><D0B4><EFBFBD>>=ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˣ<EFBFBD><CBA3><EFBFBD>ֹͣ
|
|||
|
|
isFinshed = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD><D0A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĽڵ<C4BD>
|
|||
|
|
internal void Release()
|
|||
|
|
{
|
|||
|
|
cycles = 0;
|
|||
|
|
opSequences.Release(this);
|
|||
|
|
for (int i = 0; i < nodes.Count; i++)
|
|||
|
|
{
|
|||
|
|
nodes[i].Release();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
nodes.Clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal void UpdateTimeAxis(float interval)
|
|||
|
|
{
|
|||
|
|
timeAxis -= interval;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
private void Restart()
|
|||
|
|
{
|
|||
|
|
cycles++;
|
|||
|
|
curNodeIndex = 0;
|
|||
|
|
timeAxis = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static ActionSequence GetInstance(Component component)
|
|||
|
|
{
|
|||
|
|
return opSequences.Get().Start(component);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
internal static ActionSequence GetInstance()
|
|||
|
|
{
|
|||
|
|
return opSequences.Get().Start();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|