用于 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]);
}
我正在研究 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]);
}