检查器中 UnityAction 的序列化字段

luf*_*dad 4 unity-game-engine

我有一个脚本:

[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]);
}
Run Code Online (Sandbox Code Playgroud)

我想从检查器中定义 unityAction,但检查器中没有出现任何内容...我认为它会类似于按钮组件: 在此输入图像描述

有没有一种方法可以将操作绑定到检查器中带有序列化字段的按钮?

Lot*_*tan 7

你想要的不是UnityAction,是UnityEvent,这最后一个可以序列化到检查器上。

UnityForums中对差异进行了很好的解释。

UnityAction就好像:

 public delegate void UnityAction();
Run Code Online (Sandbox Code Playgroud)

与 普通的 C# 事件相反,UnityEvent它只是处理事件的另一种方式,并且很有可能被序列化,以便在编辑器(检查器)中使用。一个简单的例子是 Button 的 onClick 事件。

如果要将 UnityEvent 传递给 AddListener 方法,可以使用如下 lambda 表达式:

btn.onClick.AddListener(() => unityEvent?.Invoke());
Run Code Online (Sandbox Code Playgroud)

注意“ ?”以避免调用 null(空)操作!