Unity action как использовать?
Как вызвать два метода через UnityAction в Unity 6
Компьютеры и связь
Развлечения
Нейросети, ИИ
Животные и питомцы
Подключите UnityEngine.Events и назначьте методы делегату UnityAction. Оба ваших метода должны возвращать void и не требовать аргументов.
| Операция | Пример | Смысл |
|---|---|---|
| Назначить | UnityAction finished = ShowResult; | Сохранить ссылку на первый метод |
| Добавить | finished += CloseRound; | Включить второй обработчик |
| Выполнить | finished?.Invoke(); | Вызвать цепочку, если она существует |
| Убрать | finished -= CloseRound; | Исключить ненужный обработчик |
ShowResult и CloseRound здесь обозначают уже реализованные методы компонента. В записи назначения после имени метода нет скобок: метод передаётся как действие, а не выполняется немедленно. Сам делегат не определяет момент завершения раунда. Его вызывает ваша логика, когда событие действительно произошло.
UnityAction — делегат из UnityEngine.Events. Обычный UnityAction без параметров хранит ссылки на методы, которые ничего не принимают и возвращают void. Вы можете назначить один метод, добавить второй и вызвать полученную цепочку в нужный момент.
Например, внутри вашего компонента уже существуют методы void ShowResult() и void CloseRound(). Первый показывает результат раунда, второй завершает его внутреннее состояние. Их можно связать так:
UnityAction finished = ShowResult;
finished += CloseRound;
finished?.Invoke();
Добавьте using UnityEngine.Events. Строки назначения и вызова должны находиться в выполняемом методе или подходящей части вашей логики, а сами ShowResult и CloseRound должны быть настоящими методами с указанными сигнатурами. Запись без скобок сохраняет ссылку на метод. Если написать ShowResult(), вы пытаетесь вызвать его сразу, а не передать действие на будущее.
Оператор += добавляет обработчик к цепочке, а Invoke выполняет её. Вызов с ?. учитывает случай отсутствия обработчиков. Если один из методов больше не нужен в цепочке, его можно убрать через -=, сохранив оставшееся действие.
Продумайте момент вызова: назначение делегата само по себе не означает, что раунд завершился. Например, можно передать finished другой части программы, которая вызовет его после выполнения условия. Это отделяет событие завершения от конкретных реакций на него.
UnityAction не запускает отдельный поток и не превращает методы в корутины. Обработчики выполняются последовательно в месте вызова. Если первый выбросит необработанное исключение, дальнейший обычный вызов цепочки прервётся. Для методов с аргументами существуют обобщённые варианты UnityAction<T>, но в вашем случае достаточно варианта без параметров.
4.20
Пока нет премиум-вопросов в подборке
Не нашли то, что искали?
Задайте свой вопрос
Ответить на вопрос