【转】 [UnityUI]UGUI射线检测

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] view plain copy

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

时间: 2024-10-06 00:41:03

【转】 [UnityUI]UGUI射线检测的相关文章

UGUI射线检测

1.Graphic Raycaster 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上). Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会接收到射线检测:反面展示时,不会接收到射线检测:否则,正反面展示都会接收到射线检测 Blocking Objects:屏蔽指定类型的(物理)对象,使它们不参与射线检测.渲染模式不为ScreenSpa

unity 射线检测

unity中射线检测时非常实用也经常实用的一种手段.下面讲解一下射线检测问题. 1)Ray 根据射线端点和射线的方向定义一条射线 Ray ray= new Ray(transform.position, transform.forward); 定义一个包含射线投射信息的变量RaycastHit hit,并进行射线检测Physics.SphereCast RaycastHit hit; if(Physics.SphereCast(ray,1f,out hit)) { if(hit.distance

Unity3D 之射线检测

这里来记录下射线检测的相关内容: 射线检测故名就是通过射线去检测是否和碰撞器产生了交集,和碰撞器与碰撞器发生交集一样,会返回一个真. 射线的用法很多:比如检测是否跳跃,通过向地面投射射线控制在地面时候可以跳起. 射击游戏中可以通过定长射线去判断目标物体是否被击中,等 主要用到的工具类是: Physics RaycastHit 光线投射碰撞 Ray 射线 第一种是: Physics.Linecast 线性投射 从开始位置到结束位置做一个光线投射,如果与碰撞体交互,返回真. Debug.DrawLi

unity3d之射线检测

问题:在<英雄联盟>里,你的鼠标在地图上点击在了哪里,你的英雄就会走到你所点击的地方,那么,用u3d如何来实现这个小小的功能呢??? 解决方案:做射线检测.首先你要准备两个东西(1):摄像机(这是射线的出发点)       (2):"碰撞信息"(用以记录射线与对象所产生的碰撞点的信息) 在u3d中创建一个空工程并添加一个c#脚本:RaycastTest.添加好我们刚才所说的两个东西:"摄像机"."碰撞信息",并初始化他俩(摄像机稍后再

【Unity3D】枪战游戏—发射子弹、射线检测

一.子弹的碰撞检测: 因为子弹的移动速度非常的快,那么如果为子弹添加一个collider,就有可能检测不到了. 因为collider是每一帧在执行,第一帧子弹可能在100米处,那么下一帧就在900米处了, 那么中间的障碍物就不能被检测到了. 所以就需要射线检测: 在每一帧的执行,都向上一帧发射射线,不断地检测射线中是否有穿过的障碍物体 1 void Update () { 2 transform.Translate (Vector3.forward * Speed * Time.deltaTim

反复横跳的瞄准线!从向量计算说起!基于射线检测的实现!Cocos Creator!

最近有小伙伴问我瞄准线遇到各种形状该怎么处理?如何实现反复横跳的瞄准线?最近刚好在<Cocos Creator游戏开发实战>中看到物理系统有一个射线检测,于是,基于这个射线检测,写了一个反复横跳的瞄准线效果.一起往下看吧!文章底部获取完整项目! 国际惯例,先上最终效果! 在讲解之前我们需要一些向量的知识,简单的介绍一些吧! 向量的加法,OA + AB = OB 向量的点乘,表示一个向量在另一个向量上的投影,是个标量,有正负之分.向量夹角小于 90度 为正数,等于 90度 为 零,大于 90度

canvas射线检测

public class someclass:monobehaviour { public EventSystem eventssystem;    public GraphicRaycaster gra;    /// <summary>    /// 射线检测    /// </summary>    /// <param name="Name"></param>    /// <returns></returns&

Unity LineRenderer 射线检测 激光攻击

在进行激光攻击的脚本编写前,我们需要先进行一定程度的想象,激光和普通的远程攻击有哪些不太一样的地方. 正常的远程攻击例如子弹,箭矢,技能波等,都有明确的弹道,不可能同时命中多个敌人,而且一般只要命中敌人后就会被销毁.(特殊技能除外) 但激光可以认为是一种持续性的范围伤害,只是它的范围(长度)是不固定的,在激光的发射阶段,它会在第一个被命中的目标或障碍物处截断. 一旦整个激光成型后,一般来说,它将不再被运动的目标截断,反而是依靠它已经生成的光柱将目标弹开并造成伤害. 当然,如果之前被命中的目标或障

射线检测

using UnityEngine; using System.Collections; public class RayCastDemo : MonoBehaviour { //射线碰撞检测器 RaycastHit hit; void Update() { //通过鼠标屏幕坐标,生成一条射线对象 Ray r = Camera.main.ScreenPointToRay (Input.mousePosition); //发射射线,并检测 if (Physics.Raycast (r, out h