当前位置: 首页 > article >正文

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"时就可以触发自定义事件了,如下图。


http://www.kler.cn/a/156726.html

相关文章:

  • Vue3.js - 一文看懂Vuex
  • 机器学习【激活函数】
  • Redo与Undo的区别:数据库事务的恢复与撤销机制
  • 如何在python中模拟重载初始化函数?
  • C 语言 【模拟实现内存库函数】
  • 鸿蒙学习基本概念
  • 论文阅读:Distributed Initialization for VVIRO with Position-Unknown UWB Network
  • 网页封装APP的原理:将网页转化为移动应用
  • Flask 自定义template和静态文件路径
  • 大华技术GIS开发工程师24届秋招三场面试Offer面经
  • 2023年中国中高端服饰品牌经营现状和市场发展趋势分析|徐礼昭
  • leetCode 51.皇后 + 回溯算法 + 图解 + 笔记
  • 更新头像之后,如何通知对方头像已更新?
  • oops-framework框架 之 初始了解(一)
  • 【Linux基础开发工具】yum生态vim的配置与使用
  • 第四十一篇,一次matlab与spdlog的合作
  • 如何使用PostMan进行并发测试?
  • Ansible及其优势是什么?
  • Vue:Vue-dev开发者工具国内下载地址
  • 盘点2023年有哪些办公的效率工具
  • C语言--每日选择题--Day33
  • 苍穹外卖--导出运营数据Excel报表
  • 【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试
  • mac mini只有键盘怎么连接蓝牙鼠标
  • 使用 PHPMailer 实现邮件的实时发送
  • Java中synchronized与Lock的区别与使用