问题产生背景:我们有的时候,需要实现射线与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碰撞检测相关推荐

  1. 为SteamVR做射线触发UI

    最近需要在SteamVR上做类似VRTK的射线和UI交互的功能.我自己开发的时候的思路是在右手手柄上加一个LineRender组件,然后从手柄的位置为起点,手柄正方向transform.forward ...

  2. unity 射线检测 碰撞点不准确的原因分析

    unity 射线检测 碰撞点不准确的原因分析 射线检测的时候,出现了碰撞的那个点位置总是上下不准确,但屏幕中心位置不受影响,越远离中心,越偏移. 无论是用鼠标,还是ui上的坐标都不准确. 下面是代码 ...

  3. Unity 射线与碰撞范围检测【踩坑记录】

    射线检测 射线检测在2D和3D的区别比较大 一定要加上对应的Collider组件 对应的函数只检测对应的Collider,Physics.Raycast是不会检测到Collider 2D的(这个让我有 ...

  4. PicoXR中手柄射线与UI的交互

    PicoXR中手柄射线与UI的交互 本文将介绍在PicoXR中如何使用手柄射线与UI进行交互 基本步骤 开发Unity XR项目必不可少的要先右键点击Hierarchy面板 XR-Room-Scale ...

  5. 【Unity3D】在Unity中实现UI指向箭头

    本问转载自http://ghostyii.com/uiarrow/,为什么转载呢,怕以后找不到了! ps:博主写到超级详细,复制粘贴即可使用,超赞的! 0x0.引言 屏幕UI指示箭头,非常常见的游戏U ...

  6. 关于射线检测与碰撞检测

    关于射线检测与碰撞检测_基础 基础知识 射线与平面的交点 1. 射线与球体的交点检测 2. AABB框重叠检测,可以快速判断两个AABB是否产生碰撞, 以用来排除一些更复杂的检测 3. 判断AABB包 ...

  7. Unity报错但VS(代码编辑器)不报错,Unity提示需要继承自MonoBehavior,Unity提示缺少命名空间或者DLL,Unity点击UI或者GameObject无法在Hierarchy锁定

    Unity一些神奇的报错包括但不限于 在2021年10月1日到2021年10月31日遇到的一些神奇的Unity的报错. 继承了MonoBehavior 但是Unity提示没有继承 问题描述:提示创建的 ...

  8. [Unity][射线检测]检测两个物体之间是否有其他物体阻挡

    1.用Physics.Raycast进行射线检测 物体必须有Collider碰撞组件. //定义一条射线,起点为GO1的物体坐标,终点为GO2的物体坐标 Ray ray = new Ray(GO1.t ...

  9. Unity日记-移动UI

    Unity日记-移动UI 1.在需要给需要移动的UI添加一个Empty GameObject的父物体. 2.通过RectTransform找到Empty GameObject. 3.用Empty.an ...

最新文章

  1. windows server 2016 安装指南
  2. 2019微生物组—宏基因组分析专题培训第三期
  3. iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
  4. 坑!自己走过的坑...
  5. Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)
  6. 二叉树的遍历(算法导论第三版12.1-4)(包含先序遍历,后序遍历和中序遍历)
  7. 1 java基础增强
  8. 因为计算机中丢失crlutl,crlutlintl.dll
  9. 前端面试每日 3+1 —— 第27天
  10. flume与log4j的整合
  11. 怎么知道他人的 IP
  12. NetApp存储方案及巡检命令
  13. 调试经验——使用VBA下载网络资源
  14. UE4联机多人游戏基本设置
  15. 粉屏门又一次显示出了苹果的傲慢
  16. vue组件通信1:父传子(props)
  17. CSS3的动画与变形
  18. Python chicken (2)
  19. 【Codecs系列】HEVC-SCC编码技术汇总
  20. SN74LVC4245A/(74LVC245) 真是个好东西啊

热门文章

  1. #Paper reading#DeepInf: Social Influence Prediction with Deep Learning
  2. 使用qt实现多线程编程
  3. 基于 Impala 的高性能数仓实践之物化视图服务
  4. 并查集算法(优化) | Union by Rank and Path Compression
  5. Android--CoordinatorLayout源码分析及NestedScrolling机制
  6. 神策数据王乾:微信生态与小程序发展趋势洞察
  7. linux 同步套件,为Linux安装套件强化系统安全
  8. 机器学习:决策树的预剪枝和后剪枝
  9. URL中特殊字符的转义
  10. java中的clear()