用于 OnSelect 和 OnDeselect 目的的委托

Delegates for OnSelect and OnDeselect purposes

我正在研究 Unity 并努力制作一个自定义 SelectableButton,它在两个不同的委托中存储方法,并在选择按钮时执行一个,在取消选择时执行另一个.相关部分显示如下:

public delegate void OnSelectAction();
public delegate void OnDeselectAction();

public class SelectableButton : MonoBehaviour
{
    private bool selected;

    public OnSelectAction onSelect;
    public OnDeselectAction onDeselect;

    public bool Selected
    {
        get { return selected; }
        set
        {
            selected = value;

            if(selected)
                onSelect();
            else
                onDeselect();
        }
    }
}

在另一个脚本中,我尝试在 onSelect 中封装一个方法,在 onDeselect 中封装另一个方法。

for(int i = 0; i < racesData.RaceList.Count; i++)
{
    selectableButton.onSelect = Select(racesData.RaceList[i]);
    selectableButton.onDeselect = Deselect(racesData.RaceList[i]);
}

public void Select(Race race)
{
// Does its selection stuff
}

public void Deselect(Race race)
{
// Does its deselection stuff
}

最后,我遇到了一个错误,告诉我我不能 "convert void to OnSelectAction/OnDeselectAction"。如果我试着这样写:

selectableButton.onSelect = () => Select(racesData.RaceList[i]);
selectableButton.onDeselect = () => Deselect(racesData.RaceList[i]);

Select() 和 Deselect() 方法未按预期方式执行。如果有人可以帮助我完成这项工作所缺少的部分,那就太好了,我将不胜感激 :)

您的第一次尝试没有成功,因为这不是您分配代表的方式。

你需要这样做:

selectableButton.onDeselect = Deselect;

因为您分配的是方法 reference 而不是方法 call 的 return 值。

但是因为您的 Select/Deselect 方法采用参数,所以它们与您的委托定义不匹配。所以你无论如何都不能这样做(或者你必须改变你的代表的定义来接受那个参数,但你可能不想要那个)。

然后我们得到您的 lambda 版本,它 分配 正确,但 函数 不正确。由于 Function Closure.

,它无法 正常运行
for(int i = 0; i < racesData.RaceList.Count; i++)
{
    int j = i; //declare new local variable with a copy of the data
    selectableButton.onSelect = () => Select(racesData.RaceList[j]);
    selectableButton.onDeselect = () => Deselect(racesData.RaceList[j]);
}