sk-client/Assets/Scripts/Extension/ActionSequenceSystem/ActionSequence.cs

203 lines
4.9 KiB
C#
Raw Normal View History

2024-07-03 18:38:10 +08:00
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();
}
}
}