Unity开发——点击事件/射线检测
一、IPointerClickHandler接口
通过为 UI 元素添加自定义脚本,实现IPointerClickHandle接口,在点击事件发生时进行处理。
这种方式适用于对特定 UI 元素的点击检测。
using UnityEngine;
using UnityEngine.EventSystems;public class UIClickHandler : MonoBehaviour, IPointerClickHandler
{public void OnPointerClick(PointerEventData eventData){Debug.Log("Clicked on UI element: " + gameObject.name);}
}
二、IsPointerOverGameObject()方法
这是EventSystem类的一个方法。
这种方法比较简单,适用于只需要知道鼠标或触摸点是否在 UI 上的场景。
鼠标下有UI,则返回true;鼠标下面没有UI,则返回false;
//只需要知道鼠标指针是否在 UI 元素上的场景。
EventSystem.current.IsPointOverGameObject();//需要同时处理触摸输入时,参数 -1 表示不忽略触摸输入
EventSystem.current.IsPointOverGameObject(-1);
使用场景:
1、简单的 UI 遮挡判断
在一些简单的 UI 逻辑中,只需要知道当前指针是否被 UI 遮挡,而不需要具体知道是哪个 UI 元素。
如在游戏中,当玩家在屏幕上进行滑动操作时,如果指针在 UI 上,可能需要忽略这个滑动操作。
2、场景交互屏蔽
在游戏开发中,当玩家的鼠标指针或触摸点位于 UI 元素之上时,其他交互不希望被触发,可用该方法进行判断鼠标是否UI上。
如鼠标在UI上时,不能点击地面移动角色、选择场景中的物体等;
3、对性能要求高,开销小的场景
IsPointerOverGameObject方法性能开销较小,只返回一个布尔值。
如在一些需要频繁进行指针位置判断的场景中,使用该方法可以减少不必要的性能消耗。
示例:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.Audio;public class UISoundControl : MonoBehaviour
{public AudioSource sceneClickSound;void Update(){if (Input.GetMouseButtonDown(0))// 检测鼠标左键点击{// 判断指针是否不在 UI 元素上if (!EventSystem.current.IsPointerOverGameObject(-1)){sceneClickSound.Play();// 播放点击音效}}}
}
三、RaycastAll()方法
适用于需要对整个场景(包括 UI 和 3D 物体)进行射线检测的场景,也适用于需要对命中的 UI 元素进行进一步判断处理的场景。
可一次性获取所有被射线命中的对象,无论它们是 UI 元素还是 3D 物体时,并且这种方法可以获取到所有被命中的 UI 元素的详细信息。
1、GraphicRaycaster.Raycast()方法
GraphicRaycaster一个组件,专门用于在 UI 系统中进行射线检测。
GraphicRaycaster的Raycast()方法主要用于针对特定 Canvas 下的 UI 元素进行射线检测。
对当前GraphicRaycaster所在 Canvas 下的 UI 元素进行射线检测。
当你只关心某个 Canvas 内的 UI 交互,并且希望精确控制射线检测范围时,使用GraphicRaycaster更合适。
如,在一个复杂的 UI 界面中,有多个 Canvas 分别管理不同的功能模块,你可以为每个 Canvas 单独添加GraphicRaycaster组件,分别处理它们的射线检测。
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;public class GraphicRaycastExample : MonoBehaviour
{public GraphicRaycaster graphicRaycaster;public EventSystem eventSystem;void Update(){if (Input.GetMouseButtonDown(0)){PointerEventData eventData = new PointerEventData(eventSystem);eventData.position = Input.mousePosition;List<RaycastResult> results = new List<RaycastResult>();graphicRaycaster.Raycast(eventData, results);foreach (RaycastResult result in results){Debug.Log("Hit UI element: " + result.gameObject.name);}}}
}
2、EventSystem.current.RaycastAll()
这是EventSystem类的一个方法。
主要用于检测鼠标或触摸点是否命中 UI 元素,适用于处理 UI 交互场景。
//创建一个PointerEventData对象,模拟指针事件
PointerEventData eventDataCurrentPosition = new PointerEventData(EventSystem.current);
eventDataCurrentPosition.position = Input.mousePosition;//使用RaycastAll方法对整个 UI 层进行射线检测,返回一个RaycastResult列表
//包含了所有被射线命中的 UI 元素的信息,包括元素本身、命中点、距离等
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(eventDataCurrentPosition, results);//通过遍历这个列表来获取每个命中元素的具体信息
foreach (RaycastResult result in results)
{Debug.Log("Hit UI element: " + result.gameObject.name);
}
使用场景:
1、多个UI 交互逻辑
当需要根据不同的 UI 元素执行不同的操作时,使用RaycastAll方法可以获取到所有被命中的 UI 元素,然后根据元素的类型或其他属性进行不同的处理。
如在一个包含多个按钮和文本框的界面中,点击不同的元素需要执行不同的逻辑。
2、多层 UI 元素处理
在一些复杂的 UI 布局中,可能存在多层 UI 元素重叠的情况,使用RaycastAll方法可以获取到所有被命中的 UI 元素,然后对这些元素进行逐层处理。
如在一个弹出窗口中,可能有背景遮罩、内容面板和关闭按钮等多层元素,点击时需要依次处理这些元素的逻辑。
3、 对射线检测结果的深度处理
在某些情况下,需要获取射线检测的详细信息,如命中点、距离等。RaycastAll方法返回的RaycastResult列表中包含了这些信息。
如在实现一个 UI 元素的拖拽功能时,可以根据命中点的位置来确定元素的拖拽偏移量。
示例:
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using System.Collections.Generic;public class UIRaycastAndGetProperties : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){PointerEventData eventData = new PointerEventData(EventSystem.current);eventData.position = Input.mousePosition;List<RaycastResult> results = new List<RaycastResult>();EventSystem.current.RaycastAll(eventData, results);foreach (RaycastResult result in results)// 遍历检测结果列表{GameObject hitObject = result.gameObject;Text txt = hitObject.GetComponent<Text>();if (txt != null){Debug.Log($"Text content: {txt.text}");}}}}
}
3、Physics.RaycastAll()
是Physics类的静态方法,作为静态方法,直接通过Physics.RaycastAll调用,不依赖与EventSystem,开发者可以在任何需要进行射线检测的地方调用该方法。
适用于纯粹的无论场景射线检测,它不依赖于 UI 事件系统,更专注于物理世界中的射线交互。
该方法用于在物理场景中进行射线检测,可检测射线命中的所有 3D 物体;
常用于处理游戏中的射击、碰撞检测等进行各种物理相关的射线检测;
比如射击游戏中检测子弹是否击中目标、角色是否能看到特定物体等。
using UnityEngine;public class PhysicsRaycastAllExample : MonoBehaviour
{void Update(){if (Input.GetMouseButtonDown(0)){// 从主摄像机的位置向鼠标点击位置发射一条射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);// 进行射线检测,获取所有命中的物体信息RaycastHit[] hits = Physics.RaycastAll(ray);foreach (RaycastHit hit in hits)// 遍历所有命中的物体{Debug.Log("Hit object: " + hit.collider.gameObject.name);}}}
}
4、 PhysicsRaycaster
和GraphicRaycaster一样,作为组件使用,需要挂载到摄像机上,是MonoBehaviour的派生类。
和纯物理的不依赖EventSystem,可直接调用的Physics.RaycastAll射线检测不同;
PhysicsRaycast主要用于UI事件和3d物理对象的交互,通常结合 EventSystem 使用;
用于处理基于指针输入(如鼠标点击、触摸)与场景中 3D 物理对象的交互,更侧重于将物理射线检测集成到 UI 事件处理流程中。
如当你希望在点击屏幕时,通过 UI 事件系统触发对 3D 物体的选中操作,就可以使用 PhysicsRaycaster。
using UnityEngine;
using UnityEngine.EventSystems;
using System.Collections.Generic;public class PhysicsRaycasterExample : MonoBehaviour
{public PhysicsRaycaster physicsRaycaster;public EventSystem eventSystem;void Update(){if (Input.GetMouseButtonDown(0)){PointerEventData eventData = new PointerEventData(eventSystem);eventData.position = Input.mousePosition;List<RaycastResult> results = new List<RaycastResult>();physicsRaycaster.Raycast(eventData, results);foreach (RaycastResult result in results){Debug.Log("Hit object via PhysicsRaycaster: " + result.gameObject.name);}}}
}
四、EventTrigger组件
EventTrigger组件是 Unity 提供的一种可视化配置 UI 事件的方式,无需编写复杂的脚本即可实现点击检测。
操作步骤:
1、在需要检测点击事件的UI元素身上,添加EventTrigger组件。
2、在EventTrigger组件种,点击AddNewEventType,选择需要的Pointer事件

3、在选择的Pointer事件里,点击“+”添加点击事件。
4、将需要执行点击事件的对象拖入RuntimeOnly字段,并选择相应的方法。

相关文章:
Unity开发——点击事件/射线检测
一、IPointerClickHandler接口 通过为 UI 元素添加自定义脚本,实现IPointerClickHandle接口,在点击事件发生时进行处理。 这种方式适用于对特定 UI 元素的点击检测。 using UnityEngine; using UnityEngine.EventSystems;public class UIClickHandler…...
【零基础入门unity游戏开发——unity3D篇】3D物理系统之 —— 3D刚体组件Rigidbody
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的…...
微信小程序接入DeepSeek模型(火山方舟),并在视图中流式输出
引言: DeepSeek,作为一款先进的自然语言处理模型,以其强大的文本理解和生成能力著称。它能够处理复杂的文本信息,进行深度推理,并快速给出准确的回应。DeepSeek模型支持流式处理,这意味着它可以边计算边输…...
55年免费用!RevoUninstaller Pro专业版限时领取
今天,我要给大家介绍一款超给力的卸载工具——RevoUninstaller Pro。这是一款由保加利亚团队精心打造的专业级卸载软件,堪称软件卸载界的“神器”。 RevoUninstaller分为免费版和专业版。专业版功能更为强大,但通常需要付费才能解锁全部功能。…...
Markdig:强大的 .NET Markdown 解析器详解
在现代开发中,Markdown 已经成为了一种广泛使用的轻量级标记语言,特别是在文档、博客和内容管理系统中,Markdown 为开发者提供了快速、简洁的格式化文本方式。而在 .NET 生态中,Markdig 是一款非常强大的 Markdown 解析器…...
基于ensp的IP企业网络规划
基于ensp的IP企业网络规划 前言网络拓扑设计功能设计技术详解一、网络设备基础配置二、虚拟局域网(VLAN)与广播域划分三、冗余协议与链路故障检测四、IP地址自动分配与DHCP相关配置五、动态路由与安全认证六、广域网互联及VPN实现七、网络地址转换&#…...
谷歌Chrome或微软Edge浏览器修改网页任意内容
在谷歌或微软浏览器按F12,打开开发者工具,切换到console选项卡: 在下面的输入行输入下面的命令回车: document.body.contentEditable"true"效果如下:...
初探大模型开发:使用 LangChain 和 DeepSeek 构建简单 Demo
最近,我开始接触大模型开发,并尝试使用 LangChain 和 DeepSeek 构建了一个简单的 Demo。通过这个 Demo,我不仅加深了对大模型的理解,还体验到了 LangChain 和 DeepSeek 的强大功能。下面,我将分享我的开发过程以及一些…...
【Linux】进程(1)进程概念和进程状态
🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:Linux 目录 前言 一、什么是进程 二、task_struct的内容 三、Linux下进程基本操作 四、父进程和子进程 1. 用fork函数创建子进程 五、进程状态 1. 三种重…...
关闭win11根据内容自动调整屏幕亮度
在win11笔记本上使用编程软件的时候,用的是深色背景,但是屏幕会慢慢变暗;等切换回明亮的桌面时,又会慢慢变亮,带来不适应的感觉。这个博客记录一下解决这个问题的办法 ps:有些人修改的是电源选项ÿ…...
2021-05-23 C++百元百鸡
此是草稿,有值得优化的地方,如从公鸡先循环再母鸡再小鸡这样可以提高效率,且有输出后也可优化为公鸡母鸡小鸡初始化。 void 百元百鸡() {//缘由https://ask.csdn.net/questions/7434093?spm1005.2025.3001.5141int xj 1, mj 1, gj 1, y …...
理解langchain langgraph 官方文档示例代码中的MemorySaver
以下是langchain v0.3官方示例代码 from langgraph.checkpoint.memory import MemorySaver from langgraph.graph import START, MessagesState, StateGraph# 可以理解为:定义一个流程,这个流程中用到的数据类型是Messages。 <---定义一个有向图&…...
C# 建造者模式(Builder Pattern)详细讲解
一、什么是建造者模式? 建造者模式(Builder Pattern)是一种创建型设计模式,它通过将一个复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。这个模式主要应用于那些构建过程复杂且涉及多个步骤的…...
Android自动化测试工具
细解自动化测试工具 Airtest-CSDN博客 以下是几种常见的Android应用自动化测试工具: Appium:支持多种编程语言,如Java、Python、Ruby、JavaScript等。可以用于Web应用程序和原生应用程序的自动化测试,并支持iOS和Android平台。E…...
【蓝桥杯】24省赛:数字串个数
思路 本质是组合数学问题: 9个数字组成10000位数字有9**10000可能 不包括3的可能8**10000 不包括7的可能8**10000 既不包括3也不包括77**10000 根据容斥原理:结果为 9 ∗ ∗ 10000 − 8 ∗ ∗ 10000 − 8 ∗ ∗ 10000 7 ∗ ∗ 10000 9**10000 - 8**10…...
SpringBoot中使用kaptcha生成验证码
简介 kaptcha是谷歌开源的简单实用的验证码生成工具。通过设置参数,可以自定义验证码大小、颜色、显示的字符等等。 Maven引入依赖 <!-- https://mvnrepository.com/artifact/pro.fessional/kaptcha --><dependency><groupId>pro.fessional<…...
解密乐天音乐如何通过抗指纹浏览器刷变现
作者:药尘-韩立----->🚀🌍❤️( hanli068 ) 专栏:反反爬技术 日期:2025年3月15日 原创声明:本文为作者原创,未经允许不得转载 在音乐流媒体平台(“日本乐天音乐”)中…...
自定义tiptap插件
本文为开发开源项目的真实开发经历,感兴趣的可以来给我的项目点个star,谢谢啦~ 具体博文介绍: 开源|Documind协同文档(接入deepseek-r1、支持实时聊天)Documind 🚀 一个支持实时聊天和接入 - 掘…...
软考网络安全专业
随着信息技术的迅猛发展,网络安全问题日益凸显,成为社会各界普遍关注的焦点。在这样的背景下,软考网络安全专业应运而生,为培养高素质的网络安全人才提供了有力支撑。本文将对软考网络安全专业进行深入剖析,探讨其在信…...
蓝桥杯嵌入式赛道复习笔记1(led点亮)
前言 基础的文件创建,参赛资源代码的导入,我就不说了,直接说CubeMX的配置以及代码逻辑思路的书写,在此我也预祝大家人人拿国奖 理论讲解 原理图简介 1.由于存在PC8引脚到PC15引脚存在冲突,那么官方硬件给的解决方案…...
订单超时自动取消功能如何设计
在一个 Java 电商项目中,订单超时自动取消功能可以通过多种方式设计和实现。常见的实现方式包括使用定时任务(例如 ScheduledExecutorService 或 Spring 的 Scheduled 注解)或者基于事件驱动的方式(如使用消息队列)。以…...
FPGA为何要尽量减少组合逻辑的使用
在FPGA设计中,组合逻辑的使用确实需要谨慎,尤其是要尽量减少它的复杂性。这并不是因为组合逻辑本身不好,而是因为它在实际应用中容易引发一系列问题,而这些问题往往与FPGA的设计哲学和硬件特性相冲突。让我从几个关键点来和你聊聊…...
六十天前端强化训练之第十七天React Hooks 入门:useState 深度解析
欢迎来到编程星辰海的博客讲解 看完可以给一个免费的三连吗,谢谢大佬! 目录 一、知识讲解 1. Hooks 是什么? 2. useState 的作用 3. 基本语法解析 4. 工作原理 5. 参数详解 a) 初始值设置方式 b) 更新函数特性 6. 注意事项 7. 类组…...
芯科科技推出的BG29超小型低功耗蓝牙®无线SoC,是蓝牙应用的理想之选
具有扩大的内存和超低功耗特性的超小型BG29是互联健康设备的理想之选 低功耗无线领域内的领导性创新厂商Silicon Labs(亦称“芯科科技”,NASDAQ:SLAB)今日宣布:推出全新的第二代无线开发平台产品BG29系列无线片上系统…...
联想小新 Pro16 锐龙版本 type c 充电掉速降频问题
小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案 通过网盘分享的文件:小新Pro-16 2021 锐龙版 Type-C接口连接电源适配器卡顿降频的解决方案.zip 链接: https://pan.baidu.com/s/1713s9AO5QC31bdsf8g1ZIw?pwd1234 提取码: 1234 --来自百度网盘…...
export、export default 和 module.exports 深度解析
文章目录 1. 模块系统概述1.1 模块系统对比1.2 模块加载流程 2. ES Modules2.1 export 使用2.2 export default 使用2.3 混合使用 3. CommonJS3.1 module.exports 使用3.2 exports 使用 4. 对比分析4.1 语法对比4.2 使用场景 5. 互操作性5.1 ES Modules 中使用 CommonJS5.2 Com…...
qwen2.5-vl多机多卡分布式部署
记录一下工作中进行多机多卡部署qwen2.5-vl多模态大模型踩过的坑 第一个天坑就是官方提供的镜像qwenllm/qwenvl:2.5-cu121有问题,在titan显卡会抛出cuda error:no kernel image is availabe for execution on the device. 这是cuda内核与GPU不兼容的问题,…...
tsfresh:时间序列特征自动提取与应用
tsfresh:时间序列特征自动提取与应用 本文系统介绍了 tsfresh 技术在 A 股市场数据分析与量化投资中的应用。从基础特征提取到高级策略开发,结合实战案例,详细讲解了如何利用 tsfresh 构建量化投资策略,并优化风险控制,…...
C++Primer学习(7.1 定义抽象数据类型)
类的基本思想是数据抽象(data abstraction)和封装(encapsulation)。数据抽象是种依赖于接口(interface)和实现(implementation)分离的编程(以及设计)技术。类的接口包括用户所能执行的操作:类的实现则包括类的数据成员、负责接口实现的函数体以及定义类所需的各种私有函数。 封…...
【PHP】新版本特性记录(持续更新)
文章目录 前言PHP 7.01)NULL合并运算符:??2)参数、返回值支持类型声明3)太空船操作符:<>4)通过 define 定义常量数组5)匿名类实例化6)字符串里使用\u转义unicode codepoint …...
