博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【转】 [UnityUI]UGUI射线检测
阅读量:6902 次
发布时间:2019-06-27

本文共 2013 字,大约阅读时间需要 6 分钟。

http://blog.csdn.net/lyh916/article/details/50947026

1.Graphic Raycaster

主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。

 

Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会接收到射线检测;反面展示时,不会接收到射线检测;否则,正反面展示都会接收到射线检测

 

Blocking Objects:屏蔽指定类型的(物理)对象,使它们不参与射线检测。渲染模式不为ScreenSpaceOverlay时起作用。可选值为:

None:不屏蔽任何物理对象
Two D:屏蔽2D物理对象(即具有2D碰撞体的对象)
Three D:屏蔽3D物理对象(即具有3D碰撞体的对象)

All:屏蔽所有物体对象

 

Blocking Mask:使屏蔽对象中的指定层不参与射线检测。渲染模式不为ScreenSpaceOverlay时,且Blocking Objects不为None时起作用。

例如,Blocking Objects为2D,Blocking Mask为UI,指2D物理对象中是UI层的东西都不会接收射线检测,而2D物理对象中的其他层还是能接收射线检测

2.Physics Raycaster & Physics2D Raycaster

主要用于物理对象上的射线检测,挂有这个组件的物体,必须要挂上Camera这个组件(当挂上组件时Camera也会自动挂上)。当物体(2D或者3D物理对象)受到射线检测时,物体上的实现了事件接口的方法会被调用

Physics Raycaster :只会对3D物体对象产生影响,Camera的Projection,尽量选为Perspective(透视)模式
Physics2D Raycaster:只会对2D物体对象产生影响,Camera的Projection,尽量选为Orthography(正交)模式
EventMask:射线作用层,可以用来做事件屏蔽

 

 

3.Selectable

Selectable的意思是可选择的,它是UGUI中很多交互控件(Button/ Slider / InputField / Toggle / Scrollbar /)的基类,其中的Interactable,当值为false时,UI控件会进入disable状态(颜色会变为Disabled Color的那个颜色),但是UI控件仍然能接收到射线检测!

 

4.CanvasGroup

用来批量地管理该控件以及该控件下的UI控件。Interactable的意思上面已经说到,而Blocks Raycasts,若为false,则UI控件不能接收射线检测

射线穿透:

如上图,button和image都实现了点击接口,如果想点击两者的重叠部分,button的事件没有触发,而image的事件触发了,方法就是:

给button挂上Canvas Group组件,然后不勾选Blocks Raycasts

 

5.判断鼠标或者手指是否点击在UI上

对于EventSystem.current.IsPointerOverGameObject这个函数,因为EventSystem是UI的事件系统,所以IsPointerOverGameObject中的GameObject是针对UI的,而不是普遍意义上的GameObject

 

[csharp]   
 
 
  1. using UnityEngine;  
  2. using UnityEngine.UI;  
  3. using UnityEngine.EventSystems;  
  4.   
  5. public class TestTouch : MonoBehaviour {  
  6.   
  7.     public Text text;  
  8.   
  9.     void Update()   
  10.     {  
  11.         if (Input.GetMouseButtonDown(0) || (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began))  
  12.         {  
  13. #if UNITY_ANDROID || UNITY_IPHONE  
  14.             if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))  
  15. #else  
  16.             if (EventSystem.current.IsPointerOverGameObject())  
  17. #endif  
  18.                   
  19.                 text.text = "当前触摸在UI上";  
  20.             else  
  21.                 text.text = "当前没有触摸在UI上";  
  22.         }  
  23.     }  
  24.   
  25. }  

转载于:https://www.cnblogs.com/mimime/p/6792936.html

你可能感兴趣的文章
Docker安装与入门
查看>>
开源软件没你想象中那么安全,Java 开发者尤其要警惕
查看>>
GnuCash 3.5 发布,跨平台财务管理软件
查看>>
本周 AI 论文良心推荐,你想 pick 谁?
查看>>
化繁为简 海云捷迅为企业提供应用OpenStack新“姿势”
查看>>
CVPR文章抢先看!这5篇最有趣,不容错过!
查看>>
新型智慧城市建设绘出沈阳“N朵云”
查看>>
为多云平台选择云配置管理工具
查看>>
linux C 获取当前的工作目录
查看>>
快速atof()函数
查看>>
Starting an Interactive Client Process in C++
查看>>
MSSQL-应用案例-日志表设计优化与实现
查看>>
中国移动应该怎样看待云计算
查看>>
网络安全人才平均月薪近万 这五个城市需求最大
查看>>
云安全风险不再是最令人担心的问题?
查看>>
怎样正确地测试和维护防火墙?
查看>>
打造智能城市 要先撑起一张智能接入的全覆盖大网
查看>>
VMware通过统一端点管理、Windows 10支持与加强身份管理为数字工作空间提供创新...
查看>>
企业信息化“五段论”
查看>>
Verizon报告:2020年IoT平台市场规模将达16亿美元
查看>>