Files
aibis-dream/Assets/Scripts/Framework/ActionKit/Action/Repeat.cs
T
2025-04-25 20:24:11 +08:00

118 lines
3.0 KiB
C#

using System;
namespace AibisDream.Kit
{
public interface IRepeat : ISequence
{
}
public class Repeat : IRepeat
{
private Sequence _sequence;
private int _repeatCount = -1;
private int _currentRepeatCount;
private static readonly SimpleObjectPool<Repeat> SimpleObjectPool = new(() => new Repeat(), null, 5);
private Repeat()
{
}
public static Repeat Allocate(int repeatCount = -1)
{
var repeat = SimpleObjectPool.Allocate();
repeat.ActionID = ActionKit.IDGenerator++;
repeat._sequence = Sequence.Allocate();
repeat.IsFinalized = false;
repeat.Reset();
repeat._repeatCount = repeatCount;
return repeat;
}
public bool Paused { get; set; }
public bool IsFinalized { get; set; }
public ulong ActionID { get; set; }
public ActionStatus Status { get; set; }
public void OnStart()
{
_currentRepeatCount = 0;
}
public void OnExecute(float dt)
{
if (_repeatCount == -1 || _repeatCount == 0)
{
if (_sequence.Execute(dt))
{
_sequence.Reset();
}
}
else if (_currentRepeatCount < _repeatCount)
{
if (_sequence.Execute(dt))
{
_currentRepeatCount++;
if (_currentRepeatCount >= _repeatCount)
{
this.Finish();
}
else
{
_sequence.Reset();
}
}
}
}
public void OnFinish()
{
}
public ISequence Append(IAction action)
{
_sequence.Append(action);
return this;
}
public void Deinit()
{
if (!IsFinalized)
{
IsFinalized = true;
_sequence.Deinit();
ActionKitMonoBehaviourEvents.AddCallback(
new ActionQueueRecycleCallback<Repeat>(SimpleObjectPool, this));
}
}
public void Reset()
{
_currentRepeatCount = 0;
Status = ActionStatus.NotStart;
Paused = false;
_sequence.Reset();
}
}
public static class RepeatExtension
{
public static ISequence Repeat(this ISequence self, Action<IRepeat> repeatSetting)
{
var repeat = Kit.Repeat.Allocate();
repeatSetting(repeat);
return self.Append(repeat);
}
public static ISequence Repeat(this ISequence self, int repeatCount, Action<IRepeat> repeatSetting)
{
var repeat = Kit.Repeat.Allocate(repeatCount);
repeatSetting(repeat);
return self.Append(repeat);
}
}
}