Unity EventSystem的一些理解和使用
Unity的EventSystem是用于处理用户输入和交互的系统。它是Unity UI系统的核心组件之一,可以用于捕捉和分发各种事件,例如点击、拖拽、按键、射线等。
常用的属性和方法有以下这些:
属性:
current
: 获取当前的EventSystem实例。sendNavigationEvents
: 一个布尔值,表示是否发送导航事件。pixelDragThreshold
: 拖动的像素阈值。currentInputModule
: 获取当前激活的InputModule实例。
方法:
IsPointerOverGameObject(int pointerId)
: 检查指定的指针事件是否发生在UI元素上。SetSelectedGameObject(GameObject selected)
: 设置当前选中的游戏对象,默认使用PointerInputModule来处理选中事件。SetSelectedGameObject(GameObject selected, BaseEventData pointer)
: 设置当前选中的游戏对象,并传递BaseEventData参数。Raycast(PointerEventData eventData, List<RaycastResult> resultAppendList)
: 执行射线检测并返回与射线相交的最上层的UI元素。
常见用法:
1、 获取当前点击的UI元素:
EventSystem eventSystem = EventSystem.current;
GameObject selectedObject = eventSystem.currentSelectedGameObject;
2、判断鼠标或指定指针是否在UI元素上:
//不带参数,pointerId默认为-1,表示鼠标左键
EventSystem eventSystem = EventSystem.current;
bool isPointerOverUI = eventSystem.IsPointerOverGameObject();
//带参数指定指针
bool isPointerOverUI1 = EventSystem.IsPointerOverGameObject(pointerId);
if (isPointerOverUI1)
{
// 当前指针在UI上
}
3、设置导航事件的发送:
EventSystem eventSystem = GetComponent<EventSystem>();
eventSystem.sendNavigationEvents = true;
4、设置拖动的像素阈值:
EventSystem eventSystem = GetComponent<EventSystem>();
eventSystem.pixelDragThreshold = 10;
5、当前手指是否触摸在UI上:
EventSystem eventSystem = EventSystem.current;
Touch[] touches = Input.touches;
foreach (Touch touch in touches)
{
if (eventSystem.IsPointerOverGameObject(touch.fingerId))
{
// 当前是否触摸在UI上
}
}
6、发送自定义事件:
比如我在场景中创建一个组件,如Image并把下面脚本放到组件上,
using UnityEngine;
using UnityEngine.EventSystems;
public class CustomEventHandler : MonoBehaviour, IPointerClickHandler
{
public void OnPointerClick(PointerEventData eventData)
{
Debug.Log("你触发了自定义事件");
// 在这里处理自定义事件的逻辑
}
}
然后我再创建如下脚本放到场景中:
using UnityEngine;
using UnityEngine.EventSystems;
public class CustomEventTrigger : MonoBehaviour
{
private void Start()
{
// 获取EventSystem实例
EventSystem eventSystem = EventSystem.current;
// 获取自定义事件的目标游戏对象
GameObject targetObject = GameObject.Find("Image");
// 触发自定义事件
eventSystem.SetSelectedGameObject(targetObject);
}
}
当我点击''Image"时就可以触发自定义事件了,如下图。