C# 在委托函数中,添加相同的侦听器事件,为什么要立即调用相同的侦听器?

C# 在委托函数中,添加相同的侦听器事件,为什么要立即调用相同的侦听器?,c#,events,unity3d,delegates,C#,Events,Unity3d,Delegates,我是一名中国开发者,英语不是很好,请前辈们阅读后进行编辑,提前感谢。 在Unity中,我为一个事件编写了一个脚本,在委托函数中,我为前一个事件中的同一个侦听器添加了另一个脚本,但为什么要立即调用同一个侦听器呢? 以下是将另一个脚本添加到同一侦听器脚本: using System.Collections.Generic; using UnityEngine; public class SceneManager : MonoBehaviour { private static SceneM

我是一名中国开发者,英语不是很好,请前辈们阅读后进行编辑,提前感谢。 在Unity中,我为一个事件编写了一个脚本,在委托函数中,我为前一个事件中的同一个侦听器添加了另一个脚本,但为什么要立即调用同一个侦听器呢? 以下是将另一个脚本添加到同一侦听器脚本:

using System.Collections.Generic;
using UnityEngine;

public class SceneManager : MonoBehaviour
{
    private static SceneManager m_Instance;

    public static SceneManager Instance
    {
        get
        {
            if (m_Instance == null)
            {
                m_Instance = (SceneManager)FindObjectOfType(typeof(SceneManager));
            }
            if (!m_Instance)
            {
                Debug.LogError("SceneManager could not find himself!");
            }
            return m_Instance;
        }
    }

    [HideInInspector]
    public List<EventDelegate> EventDelegetDo = new List<EventDelegate>();

    public void RegisterBackBtnDo()
    {
        EventDelegate.Add(EventDelegetDo, Do);
    }

    public void UnRegisterBackBtnDo()
    {
        EventDelegate.Remove(EventDelegetDo, Do);
    }

    private void Start()
    {
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.T))
        {
            EventDelegate.Execute(EventDelegetDo);
        }
    }

    private void Do()
    {
        Debug.Log("===============ZJDebug=============== From SceneManager");
    }
}
using UnityEngine;

public class TDelegate : MonoBehaviour
{
    public void RegisterBackBtnDo()
    {
        EventDelegate.Add(SceneManager.Instance.EventDelegetDo, Do);
    }

    public void UnRegisterBackBtnDo()
    {
        EventDelegate.Remove(SceneManager.Instance.EventDelegetDo, Do);
    }

    private void Start()
    {
        RegisterBackBtnDo();
    }

    private void Update()
    {
    }

    private void Do()
    {
        Debug.Log("===============ZJDebug=============== From TDelegate");
        SceneManager.Instance.RegisterBackBtnDo();
        //Invoke("WaitForTest", float.NegativeInfinity);
    }

    private void WaitForTest()
    {
        SceneManager.Instance.RegisterBackBtnDo();
    }
}

我已经尝试过这种方法的多种变体,如果invoke float.NegativeInfinity second register不能立即调用它,有人能告诉我为什么吗?除了延迟通话,还有没有更好的方式叫后?英语太差了,请原谅我,谢谢

您可以发布您是如何声明EventDelegate的吗?我怀疑你的问题就在那里。您是否实现了EventDelegate.Add(通过简单地将元素添加到列表末尾),以及EventDelegate.Execute(通过简单的for循环在列表上执行)?在这种情况下,如果您在for中向列表中添加元素,就像您在这里所做的那样,事件将立即被调用。@YuraNudelman按照您说的做,我在for中向列表中添加元素。怪我懒惰,不要看源代码,非常感谢!那么我还有一个问题想问。除了像use invoke这样的延迟调用之外,没有更好的方法可以通过after调用?谢谢您可以复制EventDelegate列表,并在副本上运行for循环。@YuraNudelman谢谢!问题解决了:)