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

125 lines
3.5 KiB
C#
Raw Permalink Normal View History

2024-07-03 18:38:10 +08:00
using GameCore;
using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnrealM
{
//开动作序列扩展
public class ActionSequenceSystem : UnitySingleton<ActionSequenceSystem>
{
private readonly List<ActionSequence> listSequence = new List<ActionSequence>(64);
#if UNITY_EDITOR
public List<ActionSequence> ListSequence { get { return listSequence; } }
private void Reset()
{
name = "ActionSequenceSystem";
}
#endif
//Start a sequence
public static ActionSequence GetSequence(Component component)
{
ActionSequence seq = ActionSequence.GetInstance(component);
Instance.listSequence.Add(seq);
return seq;
}
// Update is called once per frame
private void Update()
{
//UpdateSequence
bool isNeedRemoveSequence = false;
for (int i = 0; i < listSequence.Count; i++)
{
listSequence[i].Update(Time.deltaTime);
if (listSequence[i].isFinshed)
{
listSequence[i].Release();
isNeedRemoveSequence = true;
}
}
//RemoveFinshedSequence
if (isNeedRemoveSequence)
{
listSequence.RemoveAll(seq => seq.isFinshed);
}
}
private void StopSequenceByID(Component id)
{
for (int i = 0; i < listSequence.Count; i++)
{
if (id == listSequence[i].id)
{
listSequence[i].Stop();
}
}
}
public static void SetStopSequenceID(Component id)
{
Instance.StopSequenceByID(id);
}
private static ActionSequence GetSequence()
{
ActionSequence seq = ActionSequence.GetInstance();
Instance.listSequence.Add(seq);
return seq;
}
#region 无ID启动注意要手动关闭循环的不然机器就会爆炸……
public static ActionSequence Sequence()
{
ActionSequence seq = GetSequence();
return seq;
}
public static ActionSequence Delayer(float delay, Action action)
{
ActionSequence seq = GetSequence();
seq.Interval(delay).Action(action);
return seq;
}
public static ActionSequence Looper(float interval, int loopTime, bool isActionAtStart, Action action)
{
ActionSequence seq = GetSequence();
if (isActionAtStart)
{
Debug.Log("WWWWWWWWWWWWWWWWWWWWWWWWWWW isActionAtStart");
seq.Action(action).Interval(interval);
}
else
{
Debug.Log("WWWWWWWWWWWWWWWWWWWWWWWWWWW isActionAtStart not");
seq.Interval(interval).Action(action);
}
seq.Loop(loopTime);
return seq;
}
public static ActionSequence Looper(float interval, int loopTime, bool isActionAtStart, Action<int> action)
{
ActionSequence seq = GetSequence();
if (isActionAtStart)
{
seq.Action(action).Interval(interval);
}
else
{
seq.Interval(interval).Action(action);
}
seq.Loop(loopTime);
return seq;
}
#endregion
}
}