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