如果我使用 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
如果转换失败。
我有一个正在尝试使用 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
如果转换失败。