精华内容
下载资源
问答
  • 射线检测

    2019-10-16 11:07:13
    unity中射线检测时非常实用也经常实用的一种手段。下面讲解一下射线检测问题 1.射线Ray 根据射线端点和射线的方向定义一条射线,Ray ray= new Ray(transform.position, transform.forward); 定义一个包含射线投射...


    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<3f)
                {
                    float angle = Random.Range(90, 110);
                    print(angle);
                    transform.Rotate(0, angle, 0);
                }
            }
    

    通过结构体变量hit既可以获取射线碰到物体后相关数据,如hit.Point(碰撞点坐标),hit.transform.gameObject(碰撞物体对象,进而可以获取游戏物体上的脚本组件,进而可以调用组件上的方法或者变量); 射线检测时可以用Raycast也可以用SphereCast,具体用什么类型的射线投射可以根据需求自己选择

    2.屏幕射线

    屏幕射线(摄像机射线)为有camera发出的射线,从point点像摄像机方向发出射线。

                Ray ray = mainCamera.ScreenPointToRay(point);
                RaycastHit hit;
                if (Physics.Raycast(ray, out hit))
                {
                    StartCoroutine(CreateOnShow(hit.point));
                    GameObject hitGobj = hit.transform.gameObject;
                    ReactTOHIt newReactor = hitGobj.GetComponent<ReactTOHIt>();
                    if(newReactor!=null)
                    {
                        newReactor.React();
                    }
                }
    
    展开全文
  • 画射线,射线检测

    2020-03-24 09:50:04
    画射线,射线检测 //射线 public LineRenderer line; void Update() { //射线检测,画射线 RayBehaviour(); //射线检测 RayBuild(); } public void RayBehaviour() { //0 表示射线的起点 line.SetPosition(0, ...

    画射线,射线检测

    [RequireComponent(typeof(LineRenderer))]
    //射线
    public LineRenderer line;
    void Update()
    {
    //射线检测,画射线
    RayBehaviour();
    //射线检测
    RayBuild();
    }
    public void RayBehaviour()
    {
    //0 表示射线的起点
    line.SetPosition(0, OriginPos.position);
    Ray ray = new Ray(OriginPos.position, OriginPos.forward);
    RaycastHit hitInfo;
    //20是射线的长度,射线检测
    if (Physics.Raycast(ray, out hitInfo, 20))
    {
    //1 是射线的终点,当然了后面还可以添加很多值 可以画折线什么的 2 3 4,每一个都是一个线段的位置
    line.SetPosition(1, hitInfo.point);
    //cursor.position = hitInfo.point;
    }
    else
    {
    //检测在射线前方没有物体时,设置射线的长度
    line.SetPosition(1, OriginPos.position + OriginPos.forward * 1);
    //这个是自己做的一个物体的跟随,cursor的位置一直处于射线的前端
    //cursor.position = OriginPos.position + OriginPos.forward * 1;
    }
    }

    //射线检测   
    void RayBuild()
    {
        Ray ray = new Ray(OriginPos.position, OriginPos.forward);
        RaycastHit hitInfo;
        if (Physics.Raycast(ray, out hitInfo, 20,~(1<<10)))
        {
            Debug.Log(hitInfo.transform);
            Debug.Log(hitInfo.transform.name);
        }
    }
    
    展开全文
  • RayCast 射线检测本文提供全流程,中文翻译。Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)Chinar—— 心分享、心创新!助力快速理解Unity中射线检测的...

    RayCast 射线检测

    本文提供全流程,中文翻译。

    Chinar坚持将简单的生活方式,带给世人!

    (拥有更好的阅读体验 —— 高分辨率用户请根据需求调整网页缩放比例)

    Chinar—— 心分享、心创新!

    助力快速理解Unity中射线检测的基本用法

    为新手节省宝贵的时间,避免采坑!

    Chinar教程效果:

    全文高清图片,点击即可放大观看(很多人竟然不知道)

    1

    Raycast —— 射线检测

    Unity 中提供了一种控制方案,用以检测鼠标点在屏幕上后

    具体点在了Unity 场景中,三维世界的哪个点上

    用法上多种多样,在这里就不一一列举了,尽以检测到的点来做一个总结

    这种解决方案,就是射线检测

    通过鼠标点击屏幕,由屏幕点,向Unity三维直接发射一条无限长的射线

    当检测到碰撞物体后,会返回被碰撞物体的所有信息,以及交点信息等等….

    这里我用简单的划线来方便理解

    2

    Scritps —— 脚本

    创建一个地板,和一个小球,作为简单的场景用于测试

    讲脚本挂载空物体上,并在Inspector 面板将小球拖进Ball

    具体代码如下

    using UnityEngine;

    using UnityEngine.AI;

    ///

    /// 射线检测类

    ///

    public class ChinarRayCast : MonoBehaviour

    {

    public Transform Ball; //小球(用来标记坐标)

    //设置射线在Plane上的目标点target

    private Vector3 target;

    void Update()

    {

    if (Input.GetMouseButton(1)) //点击鼠标右键

    {

    object ray = Camera.main.ScreenPointToRay(Input.mousePosition); //屏幕坐标转射线

    RaycastHit hit; //射线对象是:结构体类型(存储了相关信息)

    bool isHit = Physics.Raycast((Ray) ray, out hit); //发出射线检测到了碰撞 isHit返回的是 一个bool值

    if (isHit)

    {

    Debug.Log("坐标为:" + hit.point);

    target = hit.point; //检测到碰撞,就把检测到的点记录下来

    }

    }

    //如果检测到小球的坐标 与 碰撞的点坐标 距离大于0.1f,就移动小球的位置到 碰撞的点 :target

    Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target;

    //Move(target);//以上是Move函数的简写,此函数可不调用

    }

    ///

    /// 移动方法

    ///

    ///

    void Move(Vector3 target)

    {

    if (Vector3.Distance(Ball.position, target) > 0.1f)

    {

    Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime);

    }

    //如果物体的位置和目标点的位置距离小于 0.1时直接等于目标点

    else

    Ball.position = target;

    }

    }

    3

    Effect —— 效果

    通过邮件点击,可以查看最终效果

    4

    Extend —— 扩展

    射线检测的牛逼之处在于,只要发出的射线与带有碰撞盒的物体,都会发生碰撞

    并可以返回各种信息,例如被碰撞物体的位置、名称、法线等等一系列的数据

    另外可以自定义发出射线的 距离、影响到的图层等等

    ///

    /// 射线检测

    ///

    public class ChinarRay : MonoBehaviour

    {

    void Update()

    {

    Ray ray = new Ray(transform.position, Vector3.down); //创建一条射线对象

    RaycastHit hit; //碰撞信息对象结构体

    bool isRaycast = Physics.Raycast(ray, out hit);

    if (isRaycast)

    {

    Debug.DrawLine(ray.origin, hit.point, Color.green);

    print("坐标" + hit.transform.position);

    print("点" + hit.point);

    print("重心坐标" + hit.barycentricCoordinate);

    print("碰撞盒" + hit.collider);

    print("距离" + hit.distance);

    print("光线地图坐标" + hit.lightmapCoord);

    print("法线" + hit.normal);

    print("刚体" + hit.rigidbody);

    print("纹理坐标" + hit.textureCoord);

    print("三角指数" + hit.triangleIndex);//等等

    }

    }

    }

    支持

    May Be —— 搞开发,总有一天要做的事!

    拥有自己的服务器,无需再找攻略!

    Chinar 提供一站式教程,闭眼式创建!

    为新手节省宝贵时间,避免采坑!

    技术交流群:806091680 !Chinar 欢迎你的加入

    END

    本博客为非营利性个人原创,除部分有明确署名的作品外,所刊登的所有作品的著作权均为本人所拥有,本人保留所有法定权利。违者必究

    对于需要复制、转载、链接和传播博客文章或内容的,请及时和本博主进行联系,留言,Email: ichinar@icloud.com

    对于经本博主明确授权和许可使用文章及内容的,使用时请注明文章或内容出处并注明网址

    展开全文
  • 本文简要分析了Unity中射线检测的基本原理及用法,包括:Ray 射线RaycastHit 光线投射碰撞信息Raycast 光线投射SphereCast 球体投射OverlapSphere 相交球等项目地址:Raycast - SouthBegonia ...

    本文简要分析了Unity中 射线检测 的基本原理及用法,包括:

    • Ray 射线

    • RaycastHit 光线投射碰撞信息

    • Raycast 光线投射

    • SphereCast 球体投射

    • OverlapSphere 相交球等

    项目地址:Raycast - SouthBegonia (https://github.com/SouthBegonia/UnityWorld/tree/master/Raycast)

    6a75ef40ef869881dfb5413c23f8b6f5.gif

    27aba6ebe251ac58b899c5705c8d731c.gif

    Ray 射线

    • 含义:官方解释为一条无穷的线,开始于origin点,朝向direction方向(但是,根据项目验证来看其默认长度为单位向量,只有对direction进行乘以倍率,才可实现延长射线,而非无穷)

    • 用法:

      Ray ray = new Ray(transform.position,transform.forward)
      Ray camerRay = Camera.main.ScreenPointToRay(Input.mousePosition)

    RaycastHit 光线投射碰撞信息

    • 含义:取得从Raycast函数中得到的碰撞信息(注意不是collider哈,是包含collider信息)

    • 关键变量:point、collider、rigidbody、transform

    检测方法 - 线型检测

    Physics.Raycast 光线投射

    • 功能:在已有一条射线(也可无)的基础上,使用射线(新建射线)进行一定距离内的定向检测。可修改射线长度,限制其检测的Layer层,并且可以得到射线检测到的碰撞信息。但仅能检测到 第一个被射线碰撞的物体 ,后面的物体无法被检测到

    • 用法:

      Raycast(transform.position, Vector.forward, distance, LayerMask.GetMask("Enemy"))
      Raycast(transform.position, Vector.forward, distance, out RaycastHitInformation ,LayerMask.GetMask("Enemy"))
      Raycast (MyRay, distance, LayerMash.GetMask("Enemy"))
      Raycast (MyRay, out RaycastHitInformation, distance, LayerMask.GetMask("Enemy"))
    • 适用场合:配合相机坐标转换实现各类交互

    Physics.RaycastAll 所有光线投射

    • 功能:机理用法大致同Raycast,当区别在于可检测射线路径上的 所有物体 ,返回检测信息的数组。其他带All后缀的方法也同理

    • 用法:

      RaycastHit[] hits = RaycastAll(Vector3.zero, Vector.forward, distance, LayerMask.GetMask("Enemy"))RaycastHit[] hits = RaycastAll(MyRay, distance, LayerMash.GetMask("Enemy"))
    • 适用场合:穿透性检测

    Physics.Linecast 线段投射

    • 功能:建立 某两点之间 的射线进行检测,返回bool类型

    • 用法:

      Linecast(startPos, endPos, LayerMask.GetMask("Enemy"))
      Linecast(startPos, endPos, out RaycastHit, LayerMask.GetMask("Enemy"))
    • 适用场合:特定地点局部距离射线检测

    检测方法 - 体型检测

    Physics.SphereCast 球体投射

    • 功能:扩展检测范围为球形,返回bool类型。但是该投射用法需要万分小心,见下

    • 用法:

      SphereCast (originPos, radius, direction, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
      SphereCast (Ray, radius, out RaycastHit, distance, LayerMask.GetMask("Enemy"))
    • 适用场合:检测目的地是否可抵达,从而判断可移动性

    Physics.Boxcast 块体投射/ CapsuleCast 胶囊体投射

    • 功能:同球体投射

    • 用法:同球体投射

    Physics.OverlapSphere 相交球

    • 功能:同样检测球形,但与SphereCast存在较大区别

    • 用法:

      • Collider[] hits = Physics.OverlapSphere(startPos, radius, LayerMask.GetMask("Enemy")) :以startPos为原点,创建半径为radius的球形,检测区域为整个球形包围体(实心),检测Enemy层上的物体,返回所有碰撞物体的collider而不是RaycastHit

    • 适用场合:检测挂载物体球形范围内是否存在碰撞,常用方法

    Physics.IgnoreCollision 忽略碰撞

    IgnoreCollision (collider1, collider2, ignore)

    参考

    • Physics.Raycast - UnityDocumentation

    • Unity常用射线检测方法 - 昵称好难写

    • Unity的学习笔记(射线检测) - 小鸟游

    • Unity3DAPI射线检测 - 码迷

    声明:发布此文是出于传递更多知识以供交流学习之目的。若有来源标注错误或侵犯了您的合法权益,请作者持权属证明与我们联系,我们将及时更正、删除,谢谢。

    作者:SouthBegonia

    来源:https://www.cnblogs.com/SouthBegonia/p/11732340.html

    More:【微信公众号】 u3dnotes

    99be60f5f8cf3ec7bfb437586798cd8d.png

    展开全文
  • UGUI射线检测

    2019-02-18 16:44:23
    主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会...
  • 射线检测中CMOS的研究

    2020-10-19 22:15:39
    射线检测技术利用X射线探测材料内部的不连续性,并在记录介质上显示出图像。随着技术的不断进步,射线检测从传统的以胶片为记录介质的照相方法不断扩展,形成了多种数字化射线检测手段,如底片的数字化处理技术...
  • Unity 射线检测

    2020-02-25 16:10:42
    要使用射线检测,物体必须是触发器或者碰撞器。 什么是触发器,碰撞器请看https://blog.csdn.net/qq_27461747/article/details/104492748 射线检测函数在Physics 类中。由于射线无法看见,调试起来非常不方便。Unity...
  • unity射线检测

    2020-03-06 13:08:47
    射线检测步骤 在代码中声明一个射线,可以是自定义的射线,也可以是鼠标位置或者其他什么的射线,自定义射线(通过定义射线的起始位置和发射方向):Ray mRay = new Ray(transform.position, transform.forward);...
  • VRTK射线检测

    2019-05-15 14:17:00
    VRTK射线检测回调事件 本人在工作中做VR隐患排查项目开发的时候,有个功能需要做到:按下手柄触摸板发送射线,松开触摸板的时候处理射线最后检测到的那个游戏物体。 功能构思:1、按下触摸板,从手柄上发射射线; ...
  • unity鼠标射线检测

    2020-03-04 16:07:56
    unity鼠标射线检测 首先获取鼠标在屏幕上点击的位置发出的射线,用方法Camera.ScreenPointToRay(Input.mousePosition) 声明射线检测的结果RaycastHit 使用物体射线的检测结果Physics.Raycast(),有很多重载的方法,...
  • Unity射线检测功能

    2019-09-18 19:27:20
    射线检测功能
  • UGUI射线检测或触碰检测

    千次阅读 2020-06-06 14:06:08
    在开发移动端时,往往需要触碰UI实现与UI的交互,要是使用射线检测机制,这时候问题来了,会发现与UI交互不起作用,这是为什么呢? 解决方法有挺多的,以下是个人常用的两种解决办法: 方法一: 首先,要使用射线...
  • Unity射线检测

    2020-02-19 16:37:05
    射线检测 一般情况是从摄像机到鼠标点击位置生成射线。 void Update () { if (Input.GetMouseButtonDown(0)) { Ray ray = _cam.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit...
  • 1.普通射线检测(一般用于检测某一个物体)Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);Debug.DrawRay(ray.origin ,ray.direction , Color.red);RaycastHit hit;if(Physics .Raycast (ray,out hit,...
  • Unity - 射线检测

    2020-05-13 10:27:56
    Unity - 射线检测 本文简要分析了Unity中各类射线检测的基本原理及用法,及不同检测手段的性能对比。内容包括: Ray 射线 RaycastHit 光线投射碰撞信息 Raycast 光线投射 BoxCast/SphereCast/CapsuleCast 体...
  • Unity中射线检测

    2019-04-09 20:41:08
    主要用于UI上的射线检测,挂有这个组件的物体,必须要挂上Canvas这个组件(当挂上Graphic Raycaster时Canvas也会自动挂上)。 Ignore Reversed Graphics:是否忽略反方向的图形,如果为true,则表示图形正面展示时,会...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,931
精华内容 772
关键字:

射线检测