Unity射线与UI碰撞检测
问题产生背景:我们有的时候,需要实现射线与3D UI之间的碰撞,当射线碰撞到3D UI之后(将Canvas设置为World Space),调整到合适的位置。使用LineRender表示射线的直观显示,使用一把枪结合第一人称控制器。当射线瞄准UI的时候,UI添加高亮边框。点击鼠标左键,调用按钮对应的函数。
(1)首先,搭建场景,最终如下所示
(2)简要说明:给Button添加Mask组件,设置对应的边框,开始的时候enable为false。当射线指向的时候,enable为true。枪口添加ray对象,作为射线的起点,并且为ray添加LineRender组件
调整必要的参数,设置Use World Space为false。
(3)给Button添加一个BoxCollider组件,调整大小正好包括Button即可
(4)新建脚本,控制射线以及碰撞,代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class GraphicDetect : MonoBehaviour
{public Transform origin; //射线起点public Button startBtn; //开始按钮public LineRenderer line; Vector3 endPoint; //LineRender结束点// Start is called before the first frame updatevoid Start(){startBtn.onClick.AddListener(delegate (){Debug.Log("Game Start");});endPoint = line.GetPosition(1);}// Update is called once per framevoid Update(){// PhysicsRaycastHit hit;//需要设置射线检测层if (Physics.Raycast(origin.position, origin.forward, out hit,50)){if (hit.collider.gameObject.layer == LayerMask.NameToLayer("UI")){//将轮廓组件显示startBtn.gameObject.GetComponent<Outline>().enabled = true;//将世界坐标转换为Localline.SetPosition(1,line.transform.InverseTransformPoint( hit.point));if (Input.GetMouseButtonDown(0)) {//自动执行按钮对应的回调函数ExecuteEvents.Execute<IPointerClickHandler>(startBtn.gameObject,new PointerEventData(EventSystem.current), ExecuteEvents.pointerClickHandler);} }}else {startBtn.gameObject.GetComponent<Outline>().enabled = false;line.SetPosition(1,endPoint);}}
}
(5)给该脚本必要的组件赋值,结合第一人称控制器。当枪口移动并且射线指向Button的时候,会触发按钮对应的函数并且显示边框。显示按钮的边框可以使用Shader进行实现,我这里为了演示方便,直接用的Outline。
Unity射线与UI碰撞检测相关推荐
- 为SteamVR做射线触发UI
最近需要在SteamVR上做类似VRTK的射线和UI交互的功能.我自己开发的时候的思路是在右手手柄上加一个LineRender组件,然后从手柄的位置为起点,手柄正方向transform.forward ...
- unity 射线检测 碰撞点不准确的原因分析
unity 射线检测 碰撞点不准确的原因分析 射线检测的时候,出现了碰撞的那个点位置总是上下不准确,但屏幕中心位置不受影响,越远离中心,越偏移. 无论是用鼠标,还是ui上的坐标都不准确. 下面是代码 ...
- Unity 射线与碰撞范围检测【踩坑记录】
射线检测 射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider,Physics.Raycast是不会检测到Collider 2D的(这个让我有 ...
- PicoXR中手柄射线与UI的交互
PicoXR中手柄射线与UI的交互 本文将介绍在PicoXR中如何使用手柄射线与UI进行交互 基本步骤 开发Unity XR项目必不可少的要先右键点击Hierarchy面板 XR-Room-Scale ...
- 【Unity3D】在Unity中实现UI指向箭头
本问转载自http://ghostyii.com/uiarrow/,为什么转载呢,怕以后找不到了! ps:博主写到超级详细,复制粘贴即可使用,超赞的! 0x0.引言 屏幕UI指示箭头,非常常见的游戏U ...
- 关于射线检测与碰撞检测
关于射线检测与碰撞检测_基础 基础知识 射线与平面的交点 1. 射线与球体的交点检测 2. AABB框重叠检测,可以快速判断两个AABB是否产生碰撞, 以用来排除一些更复杂的检测 3. 判断AABB包 ...
- Unity报错但VS(代码编辑器)不报错,Unity提示需要继承自MonoBehavior,Unity提示缺少命名空间或者DLL,Unity点击UI或者GameObject无法在Hierarchy锁定
Unity一些神奇的报错包括但不限于 在2021年10月1日到2021年10月31日遇到的一些神奇的Unity的报错. 继承了MonoBehavior 但是Unity提示没有继承 问题描述:提示创建的 ...
- [Unity][射线检测]检测两个物体之间是否有其他物体阻挡
1.用Physics.Raycast进行射线检测 物体必须有Collider碰撞组件. //定义一条射线,起点为GO1的物体坐标,终点为GO2的物体坐标 Ray ray = new Ray(GO1.t ...
- Unity日记-移动UI
Unity日记-移动UI 1.在需要给需要移动的UI添加一个Empty GameObject的父物体. 2.通过RectTransform找到Empty GameObject. 3.用Empty.an ...
最新文章
- windows server 2016 安装指南
- 2019微生物组—宏基因组分析专题培训第三期
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
- 坑!自己走过的坑...
- Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)
- 二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)
- 1 java基础增强
- 因为计算机中丢失crlutl,crlutlintl.dll
- 前端面试每日 3+1 —— 第27天
- flume与log4j的整合
- 怎么知道他人的 IP
- NetApp存储方案及巡检命令
- 调试经验——使用VBA下载网络资源
- UE4联机多人游戏基本设置
- 粉屏门又一次显示出了苹果的傲慢
- vue组件通信1:父传子(props)
- CSS3的动画与变形
- Python chicken (2)
- 【Codecs系列】HEVC-SCC编码技术汇总
- SN74LVC4245A/(74LVC245) 真是个好东西啊
热门文章
- #Paper reading#DeepInf: Social Influence Prediction with Deep Learning
- 使用qt实现多线程编程
- 基于 Impala 的高性能数仓实践之物化视图服务
- 并查集算法(优化) | Union by Rank and Path Compression
- Android--CoordinatorLayout源码分析及NestedScrolling机制
- 神策数据王乾:微信生态与小程序发展趋势洞察
- linux 同步套件,为Linux安装套件强化系统安全
- 机器学习:决策树的预剪枝和后剪枝
- URL中特殊字符的转义
- java中的clear()