Unity3d UnityAction无法捕获协同例程中的闭包变量
考虑到以下层次结构:Unity3d UnityAction无法捕获协同例程中的闭包变量,unity3d,closures,coroutine,Unity3d,Closures,Coroutine,考虑到以下层次结构: - Canvas - Toggle 1 - Toggle 2 - Toggle 3 其中,切换有一个公共切换组,并且最初仅选择了一个切换,以下脚本附加到画布: public class Testscript : MonoBehaviour { void Start () { StartCoroutine (LateStart ()); } IEnumerator LateStart() {
- Canvas
- Toggle 1
- Toggle 2
- Toggle 3
其中,切换有一个公共切换组,并且最初仅选择了一个切换,以下脚本附加到画布:
public class Testscript : MonoBehaviour {
void Start () {
StartCoroutine (LateStart ());
}
IEnumerator LateStart() {
yield return new WaitForEndOfFrame ();
var toggles = GetComponentsInChildren<Toggle> ();
foreach (Toggle toggle in toggles) {
var captured = toggle;
captured.onValueChanged.AddListener (b => {
Debug.Log (captured.name + " changed to " + b);
});
}
}
}
但是如果我将UnityAction
的创建放在这样一个函数中:
public class Testscript : MonoBehaviour {
void Start () {
StartCoroutine (LateStart ());
}
IEnumerator LateStart() {
yield return new WaitForEndOfFrame ();
var toggles = GetComponentsInChildren<Toggle> ();
foreach (Toggle toggle in toggles) {
var captured = toggle;
captured.onValueChanged.AddListener (makeListener(captured));
}
}
private UnityAction<bool> makeListener(Toggle toggle) {
return b => {
Debug.Log (toggle.name + " changed to " + b);
};
}
}
这是怎么回事?为什么这在协同程序中不起作用
同样值得注意的是,如果我将其导出并作为UWP应用程序而不是独立版本运行,那么第一个示例确实可以正常工作,因此我怀疑这种行为是由我不知道的实现细节引起的。在我看来像是一个bug。我建议您首先将Unity更新为最新版本(),然后重试。如果此问题仍然存在,请转到帮助->报告错误。等待Unity的回复。不是bug,只是它的工作方式。对我来说,这看起来像是一个失败的协同程序实现,尤其是当它在VS中编译和运行时,就像UWP应用程序对我来说是一个bug一样。我建议您首先将Unity更新为最新版本(),然后重试。如果此问题仍然存在,请转到帮助->报告错误。等待Unity的回复。不是bug,只是它的工作方式。对我来说,这看起来像是一个失败的协同程序实现,尤其是当它作为一个UWP应用程序在VS中编译和运行时
public class Testscript : MonoBehaviour {
void Start () {
StartCoroutine (LateStart ());
}
IEnumerator LateStart() {
yield return new WaitForEndOfFrame ();
var toggles = GetComponentsInChildren<Toggle> ();
foreach (Toggle toggle in toggles) {
var captured = toggle;
captured.onValueChanged.AddListener (makeListener(captured));
}
}
private UnityAction<bool> makeListener(Toggle toggle) {
return b => {
Debug.Log (toggle.name + " changed to " + b);
};
}
}
Toggle 1 changed to False
Toggle 2 changed to True