如何每隔 Y 秒调用一个函数,但 Y 会根据其他事件发生变化?
How to call a function every Y amount of seconds, but Y changes depending on other events?
InvokeRepeating("MoveEnemies", 1.0f, ratioAlive);
我在启动方法中调用了它。但是,它只会 运行 与原始 ratioAlive
值。
如果我在更新中 运行 它,它 运行 每一帧都是我不想要的。
如果您真的需要每 N 秒调用一个函数(其中 N != const)并且您不能通过 events, then you can try using a Coroutine 实现它。
它会每隔 N 秒自动调用 Foo()
,但 N 可能会在这个 class 或另一个中更改:
public float Delay; // Your "N"
private IEnumerator InvokeRepeatedly () { // Coroutine that invokes the function
while (true) {
Foo(); // Call
yield return new WaitForSeconds(Delay);// Wait
}
}
private void Foo () {...} // The function
您还可以发送一些参数:
private IEnumerator InvokeRepeatedly (int a, bool b) {
while (true) {
Foo(a, b);
yield return new WaitForSeconds(Delay);
}
}
private void Foo (int a, bool b) {...}
此外,您可以定义自己的委托(或使用现有委托)并通过协程调用不同的函数,除非它们的参数或 return 值不同。
delegate void SomeDelegate(float a, bool b); // Defininf delegate type
private IEnumerator InvokeRepeatedly (SomeDelegate func, float a, bool b) {
func(a, b); // Call function sent as an argument
}
private void Func1 (float num, bool isTrue) {...} // First fucntion
private void Func2 (float num, bool isTrue) {...} // Second function
// Whatever void function that takes these arguments would be appropriate.
如果是这样,你可以这样称呼它:
SomeDelegate func = new SomeDelegate(Func1); // Define a delegate instance
StartCoroutine(InvokeRepeatedly(func, 1.0f, true)); // Call coroutine that will call function
InvokeRepeating("MoveEnemies", 1.0f, ratioAlive);
我在启动方法中调用了它。但是,它只会 运行 与原始 ratioAlive
值。
如果我在更新中 运行 它,它 运行 每一帧都是我不想要的。
如果您真的需要每 N 秒调用一个函数(其中 N != const)并且您不能通过 events, then you can try using a Coroutine 实现它。
它会每隔 N 秒自动调用 Foo()
,但 N 可能会在这个 class 或另一个中更改:
public float Delay; // Your "N"
private IEnumerator InvokeRepeatedly () { // Coroutine that invokes the function
while (true) {
Foo(); // Call
yield return new WaitForSeconds(Delay);// Wait
}
}
private void Foo () {...} // The function
您还可以发送一些参数:
private IEnumerator InvokeRepeatedly (int a, bool b) {
while (true) {
Foo(a, b);
yield return new WaitForSeconds(Delay);
}
}
private void Foo (int a, bool b) {...}
此外,您可以定义自己的委托(或使用现有委托)并通过协程调用不同的函数,除非它们的参数或 return 值不同。
delegate void SomeDelegate(float a, bool b); // Defininf delegate type
private IEnumerator InvokeRepeatedly (SomeDelegate func, float a, bool b) {
func(a, b); // Call function sent as an argument
}
private void Func1 (float num, bool isTrue) {...} // First fucntion
private void Func2 (float num, bool isTrue) {...} // Second function
// Whatever void function that takes these arguments would be appropriate.
如果是这样,你可以这样称呼它:
SomeDelegate func = new SomeDelegate(Func1); // Define a delegate instance
StartCoroutine(InvokeRepeatedly(func, 1.0f, true)); // Call coroutine that will call function