Invoke или StartCouroutine в Unity не будут работать вне Monobehaviour - PullRequest
0 голосов
/ 10 июля 2020

У меня есть объект, который не является Monobehaviour, но имеет ссылку на него. Я попытался использовать метод Monobehaviours Invoke (string methodName) для запуска функции (в том же классе - это не Monobehaviour) через определенное время, и у меня появилась ошибка:

Попытка в метод Invoke: StateManager.ActivateWaitStateAfterDelay не может быть вызван.

Затем я попытался использовать функцию StartCouroutine (string methodName) для достижения той же задачи, но проблема аналогична

Coroutine 'ActivateWaitStateAfterDelay' не может быть запущен!

Тогда я передавал имя метода не в виде строки, а как фактический вызов функции (требовалось изменить возврат тип вызывающей функции в IEnumerator).

И это сработало .. метод был вызван, как ожидалось.

Кто-нибудь знает, почему я не мог вызвать функцию, передавая строку вне Monobehaviour (конечно, внутри Monobehaviour он ведет себя нормально)?

Имя функции PS, представленное в виде строки Правильно на 100%.

1 Ответ

1 голос
/ 10 июля 2020

Как видите, StartCoroutine работает как с string (имя метода), так и с IEnumerator .

Но независимо от того, какой из два варианта (я обычно всегда предпочитаю IEnumerator), которые вы используете:

Каждый метод Coroutine должен иметь тип IEnumerator!

Checkout Сопрограммы , где это фактически демонстрируется с помощью string.

Отличается от Invoke, для которого метод должен быть void и не иметь параметров.

Общее примечание

Для лучшей производительности и возможность обслуживания, используйте вместо них Coroutines.

Допустим, у вас есть, например,

public class StateManager : MonoBehaviour
{
    public IEnumerator ActivateWaitStateAfterDelay()
    {
        yield return new WaitForSeconds(3f);

        Debug.Log("Hello there!", this);
    }
}

, вы можете сделать и

public class SomeOtherClass
{
    public StateManager stateManager;

    public void DoIt()
    {
        stateManager.StartCoroutine(stateManager.ActivateWaitStateAfterDelay());
    }
}

или

public class SomeOtherClass
{
    public StateManager stateManager;

    public void DoIt()
    {
        stateManager.StartCoroutine(nameof(StateManager.ActivateWaitStateAfterDelay));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...