#unity3d
#игровой движок unity
Вопрос:
У меня есть скрипт с :
[SerializeField]
private List<UnityAction> m_method = new List<UnityAction>();
private List<Button> m_button = new List<Button>();
void Start()
{
//init m_button
}
// this function is called when the player click on an object in game
void onClick()
{
for(int i=0; i<m_button.Count; i )
m_button[i].AddListener(m_method[i]);
}
Я хочу определить unityAction из инспектора, но в инспекторе ничего не отображается…
Я думал, что это будет что-то вроде компонента button :
Есть ли способ привязки действия к кнопкам с полем сериализации в инспекторе?
Ответ №1:
Чего вы не хотите, так это того, UnityAction
что UnityEvent
это последнее может быть сериализовано в инспекторе.
Разница хорошо объяснена в UnityForums.
UnityAction
похоже:public delegate void UnityAction();
И
UnityEvent
это просто еще один способ обработки событий с (отличной) возможностью сериализации для использования в редакторе
(Инспектор) в отличие от обычных событий C #. Простым примером является
Событие onClick кнопки.
Если вы хотите передать UnityEvent методу addListener, вы можете использовать лямбда-выражения, подобные этому:
btn.onClick.AddListener(() => unityEvent?.Invoke());
Обратите внимание на « ?
«, чтобы избежать вызова нулевых (пустых) действий!
Комментарии:
1. Да, я пробовал UnityEvent, но функция addListener не принимает UnityEvent… Тогда, если у меня есть UnityEvent, как я могу привязать UnityEvent к кнопкам?
2. @lufydad Я обновил ответ одним из способов: btn.onClick. addListener(() => UnityEvent?. Вызвать());