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

时间:2015-12-15 06:05:15

标签: c# events unity3d delegates

我是中国开发人员,英文不是很好,请前辈们阅读它进行编辑,在此先感谢。 在Unity中,我编写了一个脚本来监听一个Event和一个委托函数,我在前一个Event中添加了另一个脚本和同一个监听器,但为什么要立即调用同一个监听器呢? 以下是添加另一个脚本相同的侦听器脚本:

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();
    }
}

我已经尝试了多种变体,如果调用float.NegativeInfinity第二次注册它不会被立即调用,有人可以告诉我为什么?除了延迟通话之外没有更好的方法吗?英语太糟糕了,请原谅我谢谢!

0 个答案:

没有答案