Serializefield для UnityAction в инспекторе

#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?. Вызвать());