为什么我无法从我的 UnityEvent 中获得非持久侦听器计数?

Gre*_*reg 5 c# hook listener unity-game-engine

我需要知道有多少非持久侦听器被添加到 UnityEvent。

似乎没有方法在 UnityEvent 类中给我这个数字。我只能获得持久侦听器计数(从编辑器或使用 UnityEvent.AddPersistentListener() 添加的那些)。我想出的唯一解决方案是创建一个子类并使用注册计数覆盖该函数。

这是一个显示问题的简短代码:

    private UnityEvent myEvent;

    private void MyFunctionToHook()
    {
        // func logic
    }

    private void MyInitialisation()
    {
        myEvent.AddListener(MyFunctionToHook);
        myEvent.AddListener(MyFunctionToHook);
        myEvent.AddListener(MyFunctionToHook);

        // here, I need to know how much hooks were added.
        // ??
    }
Run Code Online (Sandbox Code Playgroud)

1)您对我如何设法在本地跟踪此信息有任何想法吗?

2)我这样做对吗?想知道这些信息有错吗?

无法访问此信息似乎很奇怪,因为它可能在单元测试/警告中很有用...等

谢谢你的时间。

这是 unityEvent 文档:https ://docs.unity3d.com/ScriptReference/Events.UnityEvent.html

[编辑] 到目前为止我发现的唯一解决方案如下:

    public class TrackingUnityEvent<T0> : UnityEvent<T0>
{
    private int nonPersistentListenersCount;

    public int GetNonPersistentEventCount()
    {
        return nonPersistentListenersCount;
    }

    public void AddNonPersistantListener(UnityAction<T0> call)
    {
        AddListener(call);
        nonPersistentListenersCount++;
    }

    public void RemoveNonPersistantListener(UnityAction<T0> call)
    {
        RemoveListener(call);
        nonPersistentListenersCount--;
    }
}
Run Code Online (Sandbox Code Playgroud)

这种方式很糟糕,因为您无法判断“RemoveListener()”和“AddListener()”是否成功,因为它们是无效的。

小智 0

为什么不将事件包装在另一个没有继承的类中,以便可以计算侦听器的数量?您还可以向事件添加更多代码...

public class MySpecialEvent {
    private UnityEvent event;
    public EventCount { get; private set; }

    public void AddListener(UnityAction call) {
        event.AddListener(call);
        EventCount++;
    }

    public void RemoveListener(UnityAction call) {
        event.RemoveListener(call);
        EventCount--;
    }
}
Run Code Online (Sandbox Code Playgroud)