Избегайте цепочки обратного вызова событий пользовательского интерфейса Unity - PullRequest
0 голосов
/ 09 января 2020

Как я могу предотвратить в Unity эту ситуацию (A должен реагировать на событие C, но A знает экземпляр B, а B знает экземпляр C): В ситуации ниже A создает экземпляры B, которые создают экземпляры из C, теперь C - это элементы пользовательского интерфейса с кнопками, которые получают событие при нажатии. В этом случае B просто «передает событие» A, который должен реагировать на событие. Я хочу попытаться избежать этого. Одним из решений может быть создание синглтона "eventManager", который отправляет все события зарегистрированным объектам ... но мне не очень нравится синглтон.

Class A : Monobehaviour
{
    Start()
    {
        GameObject bGO = InstantiateGameobject();
        B b = bGO.GetComponent<B>();
        b.m_onButtonClicked += DoSmthinA;
    }

    private DoSmthinA
    {
        Log("A";)
    }
}

Class B : Monobehaviour
{
    public event System.Action m_onButtonClicked;

    Start()
    {
        GameObject cGO = InstantiateGameobject();
        C c = cGO.GetComponent<C>();
        c.m_onButtonClicked += DoSmthinB;
    }

    private DoSmthinB
    {
        Log("B";)
        m_onButtonClicked?.Invoke();
    }
}

Class C : Monobehaviour
{
    public UnityEngine.UI.Button m_button; 
    public event System.Action m_onButtonClicked;

    Start()
    {
        button.onclick.addlistner(OnButtonCLicked);
    }

    private OnButtonCLicked
    {
        Log("C";)
        m_onButtonClicked?.Invoke();
    }
}
...