unity3d射线检测ui_unity射线检测ui中ui信息 - CSDN
  • [UnityUI]UGUI射线检测

    2016-03-21 22:23:55
    1.Graphic Raycaster:主要用于UI上的射线检测 a.挂有这个组件的物体,必须也要挂上Canvas这个组件,因为Graphic Raycaster依赖于Canvas b.挂有这个组件的物体,必须也要挂上继承Graphic的组件,即必须要有Image/...

    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

    using UnityEngine;
    using UnityEngine.UI;
    using UnityEngine.EventSystems;
    
    public class TestTouch : MonoBehaviour {
    
        public Text text;
    
        void Update() 
        {
            if (Input.GetMouseButtonDown(0) || (Input.touchCount > 0 && Input.GetTouch(0).phase == TouchPhase.Began))
            {
    #if UNITY_ANDROID || UNITY_IPHONE
                if (EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
    #else
                if (EventSystem.current.IsPointerOverGameObject())
    #endif
                    
                    text.text = "当前触摸在UI上";
                else
                    text.text = "当前没有触摸在UI上";
            }
        }
    
    }
    


    展开全文
  • unity射线检测ui

    2019-08-23 21:05:02
    ui添加3d碰撞盒 public void ray3d() { if (Input.GetMouseButtonDown(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); Raycas...

    给ui添加3d碰撞盒

     public void ray3d()
            {
                if (Input.GetMouseButtonDown(0))
                {
                    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
                    RaycastHit hit;
                    if (Physics.Raycast(ray, out hit))
                    {
                        print(hit.collider.transform.name);
                    }
                }
            }
    
    展开全文
  • Unity屏幕射线检测UI冲突的解决办法 屏幕射线的使用的就不介绍了,贴代码 ```csharp using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.EventSystems; ...

    Unity屏幕射线检测与UI冲突的解决办法
    屏幕射线的使用的就不介绍了,贴代码

    
    ```csharp
       using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class Test : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            
        }
        RaycastHit hit;
        Ray ray;
        void Update()
        {
            if (Input.touchCount > 0)
            {
                if (!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
                    Debug.Log("没有点到UI");
                    ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
                    if (Physics.Raycast(ray, out hit, 1000, 1 << LayerMask.NameToLayer("Monster")))
                    {
                        //TODO
                    }
                }
                else
                {
                    Debug.Log("点到UI");
    
                }
    
            }
          
        }
    }
    
    这里的EventSystem.current.IsPointerOverGameObject()可以判断有没有点到UI上,
    经过测试上面的代码会有一个问题,就是手指离开屏幕的瞬间,就会判断为没有点到UI,然而UI的触发又是离开响应,所以这里需要判断手指的状态,贴代码:
    
    ```csharp
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    
    public class Test : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            
        }
        RaycastHit hit;
        Ray ray;
        Touch touch;
    
        void Update()
        {
            if (Input.touchCount > 0)
            {
                touch = Input.GetTouch(0);
                if (touch.phase == TouchPhase.Began && !EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId)) {
                    Debug.Log("没有点到UI");
                    ray = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
                    if (Physics.Raycast(ray, out hit, 1000, 1 << LayerMask.NameToLayer("Monster")))
                    {
                        //TODO
                    }
                }
                else
                {
                    Debug.Log("点到UI");
    
                }
    
            }
          
        }
    }
    
    

    Touch类有手指的状态信息

        //
        // 摘要:
        //     Describes phase of a finger touch.
        public enum TouchPhase
        {
            //
            // 摘要:
            //     A finger touched the screen.
            Began = 0,
            //
            // 摘要:
            //     A finger moved on the screen.
            Moved = 1,
            //
            // 摘要:
            //     A finger is touching the screen but hasn't moved.
            Stationary = 2,
            //
            // 摘要:
            //     A finger was lifted from the screen. This is the final phase of a touch.
            Ended = 3,
            //
            // 摘要:
            //     The system cancelled tracking for the touch.
            Canceled = 4
        }
    

    所以需要限制手指的状态

    展开全文
  • Unity 射线检测 UGUI

    2019-05-28 11:46:51
    1.鼠标通过射线检测 UI ,记得 EventSystem和 GraphicRaycaster赋值,变量已经 Public直接拖拽上去即可 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine....

     工程示例图:

     1. 鼠标通过射线检测 UI ,记得 EventSystem 和 GraphicRaycaster 赋值,变量已经 Public 直接拖拽上去即可

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    
    public class BBTouchTest : MonoBehaviour {
        List<RaycastResult> list;
    
        void Start() {
            list = new List<RaycastResult>();
        }
        void Update()
        {
            if (Input.GetMouseButtonDown(0))
            {
               
                list =  GraphicRaycaster(Input.mousePosition);
                foreach (var item in list)
                {
                    Debug.Log(item);
                }
            }
        }
        //Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        //RaycastHit[] hit = Physics.RaycastAll(ray);
        //if (hit.Length > 0)
        //{
        //    foreach (var item in hit)
        //    {
        //        Debug.Log(item.collider.name);
        //    }
        //}
        public EventSystem _mEventSystem;
        public GraphicRaycaster gra;
        private List<RaycastResult> GraphicRaycaster(Vector2 pos)
        {
            var mPointerEventData = new PointerEventData(_mEventSystem);
            mPointerEventData.position = pos;
            List<RaycastResult> results = new List<RaycastResult>();
    
            gra.Raycast(mPointerEventData, results);
            return results;
        }
    
    }
    
    

     

    2. 触摸多点检测 UGUI ,因为这个是雷达的多点触摸,所以你们只需要修改成 Input.touch 相对应的代码即可

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.EventSystems;
    using UnityEngine.UI;
    
    public class BBTouchTest : MonoBehaviour {
        List<RaycastResult> list;
    
        void Start()
        {
            list = new List<RaycastResult>();
        }
        void Update()
        {
            for (int i = 0; i < iPhoneInput.touchCount; i++)
            {
                iPhoneTouch touch = iPhoneInput.GetTouch(i);
                list =  GraphicRaycaster(Input.mousePosition);
                foreach (var item in list)
                {
                    Debug.Log(item);
                }
            }
        }
    
        public EventSystem _mEventSystem;
        public GraphicRaycaster gra;
        private List<RaycastResult> GraphicRaycaster(Vector2 pos)
        {
            var mPointerEventData = new PointerEventData(_mEventSystem);
            mPointerEventData.position = pos;
            List<RaycastResult> results = new List<RaycastResult>();
    
            gra.Raycast(mPointerEventData, results);
            return results;
        }
    
    }
    
    

     

    展开全文
  • 按照传统的做法,EventSystem用做UI的事件处理,射线检测用做非UI碰撞的判断,但需要手动添加Collider。EventSystem使用了,GraphicRaycaster组件来检测UI元素的事件,其底层还是使用了射线来检测碰撞的。虽然UI组件...
  • Ray2D ray = new Ray2D(transform.position, Vector2.right); Debug.DrawRay(ray.origin, ray.direction, Color.blue); RaycastHit2D info = Physics2D.Raycast(ray.origin, ray.direction...
  • 射线检测、UGUI解决UI穿透问题 转载自:http://blog.csdn.net/u014230923/article/details/51493382 最近在学习的过程中遇到一个问题,那就是当有 ui 时如果你点击 ui,这时如果鼠标下面还有一些3d物体也有点击...
  • //3D射线 if (Input.GetMouseButton(0)) { Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出到点击坐标的射线 RaycastHit hitInfo; if (Physics.Raycast(r
  • 我们在使用Unity开发当中,可能会遇到这个问题,如何鼠标点击物体,在物体旁边出现UI呢 今天我就把我自己的思路分享给大家 ... ... OK,先从射线开始 ...创建一条射线Ray需要指明射线的起点(origin)和射线...
  • 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,...
  • 想象这么一个场景,我的鼠标发出射线每帧检测,碰到物体就触发函数,但是如果射线同时碰到UI和物体(即射线穿过UI)该怎么办呢? 我的解决办法是这样的: using UnityEngine; using System.Collections; using ...
  • 助力快速理解 Unity射线检测的基本用法 本文提供全流程,中文翻译。 Unity 中提供了一种控制方案,用以检测鼠标点在屏幕上后 具体点在了 Unity 场景中,三维世界的哪个点上 用法上多种多样,在这里就不一一列举了...
  • // htc vive CanvasRaycastMethod /* 继承关系:IRaycastMethod 接口抽象类 重写Raycast(Ray ray, float distance, List raycastResults) */ public override void Raycast(Ray ra
  • 首先参考原文章:...致敬原作者,代码稍作修改才可使用。 首先先引入头文件 using UnityEngine.EventSystems; using UnityEngine.UI; ...public GameObject changePanel;(这是要阻挡射线UI
  • Unity3D中,我们经常需要通过射线检测对物体进行相关操作,但是常常会遇到当我们点击按钮时,射线检测同样会执行,为解决这种问题的困扰,我们需要判断该物体是否是给定的EventSystem对象。
  • unity设置射线穿透UI

    2018-12-06 21:12:45
    设置UI穿透的Image这个UI 设置属性Raycast Target不勾选 设置属性Raycast Target不勾选 设置属性Raycast Target不勾选
  • 主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表...
  • Unity 射线检测(2D&&3D)

    2019-07-29 15:20:05
    3D物体检测: if (Input.GetMouseButtonUp(0)) { // 点击鼠标左键抬起时发射一条射线 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); RaycastHit hitInfo; if...
  • 为了看出那个UI的raycast勾选了 public class UIRayCast : MonoBehaviour { public static bool m_IsCheck = false; #if UNITY_EDITOR [MenuItem("Tool/UI RayCast Check")] static void UIRayCastChec...
1 2 3 4 5 ... 20
收藏数 944
精华内容 377
关键字:

unity3d射线检测ui