如果我使用 PointerEventData 而不是 BaseEventData,回调会消失

Callback Disappears If I Use PointerEventData Instead of BaseEventData

我有一个正在尝试使用 UnityEvents 实现的回调。

在我的对象上,我有一个事件系统和一个 OnDragEvent。

回调代码如下:

public void UpdatePosition(BaseEventData data)
{
    Debug.Log("UPDATE" + data.GetType());
}

现在,如果我 运行 这样做并拖动对象,它就可以工作并将数据类型打印为 PointerEventData

但是,如果我将 UpdatePosition 更改为:

public void UpdatePosition(PointerEventData data)
{
    Debug.Log("UPDATE" + data.GetType());
}

我失去了与回调的连接,它找不到它。它不再出现在下拉列表中。

我曾经使用 IDropHandler 并且它可以工作,但我现在正在尝试使用 GUI,我很困惑为什么我不能用 PointerEventData 参数调用我想要的回调?

我猜问题是委托的声明类似于:

public delegate void CallbackHandlerDelegate(BaseEventData data);

这意味着任何实现回调处理程序的方法都必须具有相同的方法签名,包括类型,即使 PointerEventData 派生自 BaseEventData

问题是,当使用像上面那样的 "generic" 委托时,您不能在不更改方法签名的情况下用更多派生类型替换 BaseEventData 参数。

虽然修复很简单,而不是试图在参数列表中强制类型,只需将其转换为方法:

public void UpdatePosition(BaseEventData data)
{
    var pEventData = data as PointerEventData;

    if (pEventData == null)
        return;

    //Do whatever with pEventData here
    Debug.Log("UPDATE" + data.GetType());
}

注意这里使用了 as 而不是像这样:

var pEventData = (PointerEventData)data;

这也是合法的,除了使用 as 会让转换失败(以防传入 PointerEventData 以外的内容而不抛出异常。null 检查有助于解决这个问题,因为 as 将 return 对象作为 null 如果转换失败。