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