Текущие ответы в порядке ... ответить на ваш вопрос, если time
на самом деле является значением int
.
Это только предположение, но обычно, когда вы говорите оtime
у вас есть значение float
, например, от Time.time
.
Для этого ваш подход с использованием ==
, switch
и dictionary
также будетбыть абсолютно бесполезным, поскольку вероятность того, что точное время, например, 2.0
соответствует определенному кадру, очень близка к 0
.(даже не говоря о точности с плавающей запятой здесь ...)
Для этого вы, скорее всего, захотите взглянуть на сопрограммы и WaitForSeconds
Вы можете создать Метод расширения
public static class MonoBehaviourExtensions
{
public static void Invoke(this MonoBehaviour me, Action theDelegate, float time)
{
me.StartCoroutine(ExecuteAfterTime(theDelegate, time));
}
private static IEnumerator ExecuteAfterTime(Action theDelegate, float delay)
{
yield return new WaitForSeconds(delay);
theDelegate?.Invoke();
}
}
, а затем просто использовать, например,
private void Start()
{
this.Invoke(DoSomething, 1);
this.Invoke(DoSomethingElse, 2);
this.Invoke(YouGetThePoint, 3);
}
// will be executed 1 second after start
private void DoSomething()
{ ... }
// will be executed 2 seconds after start
private void DoSomethingElse()
{ ... }
// will be executed 3 seconds after start
private void YouGetThePoint()
{ ... }
Еслиесли вы хотите, чтобы они выполнялись снова после определенной задержки, вы можете просто добавить новый вызов в конце, например,
private void DoSomething()
{
...
this.Invoke(DoSomething, 1);
}
или, альтернативно, добавить другой метод расширения для этого:
public static class MonoBehaviourExtensions
{
public static void Invoke(this MonoBehaviour me, Action theDelegate, float time)
{ ... }
private static IEnumerator ExecuteAfterTime(Action theDelegate, float delay)
{ ... }
public static void InvokeRepeated(this MonoBehaviour me, Action theDelegate, float timeInterval)
{
StartCoroutine(ExecuteInIntervals(theDelegate, interval));
}
private static IEnumerator ExecuteInIntervals(Action theDelegate, float interval)
{
while(true)
{
yield return new WaitForSeconds(interval);
theDelegate?.Invoke();
}
}
}
и затем используйте вместо
private void Start()
{
this.InvokeRepeated(DoSomething, 1);
this.InvokeRepeated(DoSomethingElse, 2);
this.InvokeRepeated(YouGetThePoint, 3);
}
, поэтому DoSomething
вызывается каждую секунду, DoSomethingElse
вызывается каждые 2
секунд и YouGetThePoint
вызывается каждые 3
секунд.