Unity, вызов функции IEnumerator из Button onClick

Я попытался вызвать функцию IEnumerator по нажатию кнопки, чтобы я мог что-то вернуть, но я не могу выбрать функцию из раскрывающегося меню On Click() инспектора.

Я пытался вызвать IEnumerator из другой функции и назначить эту функцию кнопке, не работает!

И, видимо, я не могу сделать yield return в функции void.

Так может кто-нибудь, пожалуйста, будьте так добры и научите меня, что мне делать!?

Очень признателен!


person PiggyChu001    schedule 15.10.2019    source источник
comment
Нет, вы не можете вернуть возврат на пустоту - это пустота, у нее нет возврата   -  person BugFinder    schedule 15.10.2019
comment
Является ли ваш IEnumerator сопрограммой?   -  person Menyus    schedule 15.10.2019
comment
ты можешь сделать yield return null; хотя   -  person Menyus    schedule 15.10.2019


Ответы (2)


Существуют определенные правила для подключения функции к событию единства от инспектора.

1) Функция должна быть public, чтобы ее можно было выбрать в инспекторе.

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

3) Параметры функции должны совпадать с параметрами события, если только UnityEvent не принимает никаких параметров, таких как событие Button.onClick (спасибо @derHugo за исправление), например, событие кнопки onClick не принимает никаких параметров, поэтому для выбора функции для него из инспектора функция должна выглядеть так

public void ChoosableTemplateForOnClickButton() { }

Но вы хотите вызвать IEnumerator из инспектора, поэтому вы можете обернуть его в функцию void:

предполагая, что ваша функция IEnumerator выглядит как

public IEnumerator MyRoutine()
{
   yield and enjoy...
}

оберните его в функцию void:

public void RoutineWrap()
{
   StartCoroutine(MyRoutine());
}

Теперь вы можете выбрать RoutineWrap в инспекторе.

person Tenretni    schedule 15.10.2019
comment
Пункт 3) The function parameters must match the event parameters, не совсем корректен! UnityEvent позволяет добавлять либо статические методы параметров (с параметрами 0 или 1 и ограниченными базовыми типами (float, string, bool, int и т. д., и Object ссылками)) или вы можете добавить динамические методы параметров. Здесь, в случае onClick, их нет, но вы можете реализовать свой собственный UnityEvent<T> с несколькими динамическими параметрами;) - person derHugo; 15.10.2019
comment
Верно, но в конечном итоге, чтобы подключить метод к событию из «инспектора», сигнатуры (параметры) должны совпадать, т. е. событие с (логическими, строковыми) параметрами может выбирать только функции с (логическими, строковыми) параметрами из раскрывающегося списка инспектора. , что я и сказал, я говорю, что событие видит только функции, соответствующие его параметрам, я не говорил, что у него не может быть нескольких параметров: D - person Tenretni; 15.10.2019
comment
И именно здесь я сказал, что это неправда;) в обычном UnityEvent, таком как Button.onClick, вы все еще можете ссылаться на методы, как указано, либо без одного, либо с одним базовым типом в качестве параметра и передавать его в статике. - person derHugo; 15.10.2019
comment
О, о да, теперь я понял вашу точку зрения, это правда, я отредактирую заявление, чтобы оно было The function parameters must match the event parameters, unless the event is parameterless. - person Tenretni; 15.10.2019

В качестве альтернативы этому правильному ответу вы всегда можете добавить обратный вызов во время выполнения через скрипт.

Тем не менее в Unity каждая корутина должна запускаться с использованием StartCoroutine:

public Button button;

private void Awake()
{
    button.onClick.AddListener(() => StartCoroutine(MyRoutine()));
}

private IEnumerator MyRoutine()
{
    ...
}
person derHugo    schedule 15.10.2019