如何每隔 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