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 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.sendNavigationEvents = true;

4、设置拖动的像素阈值:

EventSystem eventSystem = GetComponent();
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"时就可以触发自定义事件了,如下图。

Unity EventSystem的一些理解和使用_第1张图片

你可能感兴趣的:(unity,游戏引擎,c#)