Unity3D 以编程方式分配 EventTrigger 处理程序
Unity3D Programmatically Assign EventTrigger Handlers
在新的 Unity3D UI(Unity > 4.6)中,我正在尝试创建一个简单的脚本,我可以附加到 UI 组件(图像、文本等),这将允许我加入了自定义工具提示处理程序。所以我需要的是在我的组件上捕获一个 PointerEnter 和 PointerExit。到目前为止,我没有成功执行以下操作。我看到 EVentTrigger 组件出现了,但无法让我的代表开火来挽救我的生命。
有什么想法吗?
public class TooltipTrigger : MonoBehaviour {
public string value;
void Start() {
EventTrigger et = this.gameObject.GetComponent<EventTrigger>();
if (et == null)
et = this.gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry entry;
UnityAction<BaseEventData> call;
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerEnter;
call = new UnityAction<BaseEventData>(pointerEnter);
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(call);
et.delegates.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerExit;
call = new UnityAction<BaseEventData>(pointerExit);
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(call);
et.delegates.Add(entry);
}
private void pointerEnter(BaseEventData eventData) {
print("pointer enter");
}
private void pointerExit(BaseEventData eventData) {
print("pointer exit");
}
}
另外...我在浏览论坛和文档时可以找到的另一种方法是通过接口实现添加事件处理程序,例如:
public class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
public string value;
public void OnPointerEnter(PointerEventData data) {
Debug.Log("Enter!");
}
public void OnPointerExit(PointerEventData data) {
Debug.Log("Exit!");
}
}
这些方法似乎都不适合我。
第二种方法(IPointerEnterHandler
和 IPointerExitHandler
接口的实现)就是您要找的方法。但是要触发 OnPointerEnter
和 OnPointerExit
方法,您的场景必须包含名为 "EventSystem" 和 EventSystem
组件的游戏对象(此游戏对象会在您添加任何 UI 元素时自动创建到场景,如果它不在这里 - 自己创建它)和不同输入法的组件(例如 StandaloneInputModule
和 TouchInputModule
)。
另外 Canvas(带有 Canvas
组件的按钮的根对象)必须具有 GraphicRaycaster
组件才能通过光线投射检测到 UI 元素。
我刚刚测试了您 post 的代码,它工作正常。
在新的 Unity3D UI(Unity > 4.6)中,我正在尝试创建一个简单的脚本,我可以附加到 UI 组件(图像、文本等),这将允许我加入了自定义工具提示处理程序。所以我需要的是在我的组件上捕获一个 PointerEnter 和 PointerExit。到目前为止,我没有成功执行以下操作。我看到 EVentTrigger 组件出现了,但无法让我的代表开火来挽救我的生命。
有什么想法吗?
public class TooltipTrigger : MonoBehaviour {
public string value;
void Start() {
EventTrigger et = this.gameObject.GetComponent<EventTrigger>();
if (et == null)
et = this.gameObject.AddComponent<EventTrigger>();
EventTrigger.Entry entry;
UnityAction<BaseEventData> call;
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerEnter;
call = new UnityAction<BaseEventData>(pointerEnter);
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(call);
et.delegates.Add(entry);
entry = new EventTrigger.Entry();
entry.eventID = EventTriggerType.PointerExit;
call = new UnityAction<BaseEventData>(pointerExit);
entry.callback = new EventTrigger.TriggerEvent();
entry.callback.AddListener(call);
et.delegates.Add(entry);
}
private void pointerEnter(BaseEventData eventData) {
print("pointer enter");
}
private void pointerExit(BaseEventData eventData) {
print("pointer exit");
}
}
另外...我在浏览论坛和文档时可以找到的另一种方法是通过接口实现添加事件处理程序,例如:
public class TooltipTrigger : MonoBehaviour, IPointerEnterHandler, IPointerExitHandler {
public string value;
public void OnPointerEnter(PointerEventData data) {
Debug.Log("Enter!");
}
public void OnPointerExit(PointerEventData data) {
Debug.Log("Exit!");
}
}
这些方法似乎都不适合我。
第二种方法(IPointerEnterHandler
和 IPointerExitHandler
接口的实现)就是您要找的方法。但是要触发 OnPointerEnter
和 OnPointerExit
方法,您的场景必须包含名为 "EventSystem" 和 EventSystem
组件的游戏对象(此游戏对象会在您添加任何 UI 元素时自动创建到场景,如果它不在这里 - 自己创建它)和不同输入法的组件(例如 StandaloneInputModule
和 TouchInputModule
)。
另外 Canvas(带有 Canvas
组件的按钮的根对象)必须具有 GraphicRaycaster
组件才能通过光线投射检测到 UI 元素。
我刚刚测试了您 post 的代码,它工作正常。