UGUI详解-事件接口
1. 简介
UGUI 系统虽然提供了很多封装好的组件,但是要实现一些特定的功能还是显得非常有限,这时候就需要使用事件接口来完成UI功能的实现。
比如我们想实现鼠标移动到图片上时自动显示图片的文字介绍,一般思路会想到写个射线来检测。
但其实这样的检测UGUI已经替我们完成了,我们只需要实现检测到目标对象后所要执行的代码即可!
事件系统:UnityEngine.EventSystems;
UI 组件都是基于 UGUI 封装好的类和接口以及一些 Editor 文件来进行封装制作供开发者使用的,开发者利用这些封装好的工具,只需更专注于功能开发即可。
2. 事件系统的前置条件
2.1 使用该事件系统的条件
- 对象必须是 Canvas 的子对象;
- 对象必须有 Rect 范围;
- 鼠标的操作不分左键 中键 右键;
2.2 事件触发条件
对象或其子对象所附加的 UI 组件含有 Raycast Target 属性(为 true)
鼠标光标进入该对象的 Rect 范围时
2.3 事件系统的特殊情况
若:该对象实现事件接口,而其子对象所附加的 UI 组件含有 Raycast Target 属性且没有实现事件接口
则:只有该对象会触发事件,而其子对象不会触发事件当:该对象和其子对象同时具有触发事件接口的条件时:
若:该对象的 Rect 范围被其子对象的 Rect 范围完全覆盖掉
则:该对象不会触发事件,只有其子对象会触发事件。
3. 事件接口一览
IPointerEnterHandler
功能:
鼠标移入对象时触发响应函数实现方法:
1
public void OnPointerEnter(PointerEventData eventData){}
IPointerExitHandler
功能:
鼠标移出对象时触发响应函数实现方法:
1
public void OnPointerExit(PointerEventData eventData){}
IPointerDownHandler
功能:
鼠标在对象范围内按下时触发响应函数实现方法:
1
public void OnPointerDown(PointerEventData eventData){}
IPointerUpHandler
功能:
鼠标在对象范围内抬起时触发响应函数实现方法:
1
public void OnPointerUp(PointerEventData eventData){}
注意:
- 无论鼠标在何处抬起(即不在A对象中)都会在A对象中响应此事件
- 响应此事件的前提是A对象必须响应过OnPointerDown事件
IPointerClickHandler
功能:
鼠标在对象范围内按下并抬起后触发响应函数实现方法:
1
public void OnPointerClick(PointerEventData eventData){}
注意:
按下和抬起时鼠标要处于同一对象上IDragHandler
功能:
鼠标在对象范围内按下并拖拽时,对象每帧响应一次此事件实现方法:
1
public void OnDrag(PointerEventData eventData){}
注意:
如果不实现此接口,则后面的四个接口方法都不会触发IInitializePotentialDragHandler
功能:
鼠标在对象范围内按下还没开始拖拽时,对象响应此事件与IPointerDownHandler接口事件类似
实现方法:
1
public void OnInitializePotentialDrag(PointerEventData eventData){}
IBeginDragHandler
功能:
当鼠标在对象范围内按下并开始拖拽时,对象响应此事件实现方法:
1
public void OnBeginDrag(PointerEventData eventData){}
注:
此事件在OnInitializePotentialDrag之后响应 OnDrag之前响应IEndDragHandler
功能:
当鼠标完成拖拽抬起时,对象响应此事件实现方法:
1
public void OnEndDrag(PointerEventData eventData){}
IDropHandler
功能:
当鼠标从A对象上开始拖拽,在B对象上抬起时,B对象响应此事件实现方法:
1
public void OnDrop(PointerEventData eventData){}
注意:
A、B对象必须均实现IDropHandler接口,且A至少实现IDragHandler接口
此时eventData.pointerDrag.name获取到的是B对象的name属性
eventData.pointerDrag表示发起拖拽的对象(GameObject)
4. 参考链接
总结整理自:
https://blog.csdn.net/eazey_wj/article/details/65632664
他这还有很多案例和代码,建议去看看