您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
57 行
1.8 KiB
57 行
1.8 KiB
using NaughtyAttributes;
|
|
using System.Collections;
|
|
using UnityEngine;
|
|
namespace GameplayIngredients.Logic
|
|
{
|
|
public class DelayedLogic : LogicBase
|
|
{
|
|
public enum DelayMode { Constant, Random };
|
|
public DelayMode delayMode;
|
|
[ShowIf("DelayIsConstant")]
|
|
public float Delay = 1.0f;
|
|
[ShowIf("DelayIsRandom")]
|
|
public Vector2 DelayRange = Vector2.one;
|
|
[ReorderableList]
|
|
public Callable[] OnDelayComplete;
|
|
[ReorderableList]
|
|
public Callable[] OnCanceled;
|
|
IEnumerator m_Coroutine;
|
|
private void OnValidate()
|
|
{
|
|
if (DelayIsConstant())
|
|
DelayRange = new Vector2(Delay, Delay + 1);
|
|
}
|
|
private bool DelayIsRandom()
|
|
{
|
|
bool random = delayMode == DelayMode.Random ? true : false;
|
|
return random;
|
|
}
|
|
private bool DelayIsConstant() { return !DelayIsRandom(); }
|
|
public void Cancel(GameObject instigator = null)
|
|
{
|
|
if (m_Coroutine != null)
|
|
{
|
|
StopCoroutine(m_Coroutine);
|
|
Callable.Call(OnCanceled, instigator);
|
|
m_Coroutine = null;
|
|
}
|
|
}
|
|
public override void Execute(GameObject instigator = null)
|
|
{
|
|
float newDelay;
|
|
if (m_Coroutine != null) Cancel();
|
|
if (delayMode == DelayMode.Random)
|
|
newDelay = Random.Range(DelayRange.x, DelayRange.y);
|
|
else
|
|
newDelay = Delay;
|
|
m_Coroutine = RunDelay(newDelay, instigator);
|
|
StartCoroutine(m_Coroutine);
|
|
}
|
|
IEnumerator RunDelay(float Seconds, GameObject instigator = null)
|
|
{
|
|
yield return new WaitForSeconds(Seconds);
|
|
Callable.Call(OnDelayComplete, instigator);
|
|
m_Coroutine = null;
|
|
}
|
|
}
|
|
}
|