unity中射线碰撞检测总结

这阵子通过看视频,看书对unity中射线碰撞检测,有了一些了解,这里我把它总结一下写下来,希望能帮助到你们,也希望通过各位大神来指正不足之处;

射线碰撞检测,就是由某一物体发射出一道射线,射线碰撞到物体之后,可以得到该物体的相关信息,然后就可以对该物体进行一些操作的过程了。PS:个人见解;

射线的发射分为可见和不可见,可见的情况就是在游戏当中你可以看到射线,而不可见就是游戏运行时,你只可以在Scene试图下观察到它,而这到射线又是存在的;

而其实两者区别不大,关键是看你怎么用它了;

下面先看看不可见的情况吧,还是看代码;

Ray ray=new Ray(transform.position,transform.forward*100);          //定义一个射线对象,包含射线发射的位置transform.position,发射距离transform.forward*100;
Debug.DrawLine(transform.position,transform.position+transform.forward*100,Color.red);  //这个就是绘制出的射线了,包含发射位置,发射距离和射线的颜色;
RaycastHit hitInfo;                                 //定义一个RaycastHit变量用来保存被撞物体的信息;
if(Physics.Raycast(ray,out hitInfo,100))         //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;
{
    //hitInfo.point:碰撞点的位置;
    //hitInfo.normal:与碰撞点所在平面垂直的向量;
    //hitInfo.collider.gameobject:可以得到该物体上的所有信息了;
}

另一种情况:需要在发射射线的物体上添加LineRenderer组件;

LineRenderer render;
void start()
{
    render=transform.GetComponent<LineRenderer>();
    render.SetWidth(0.01f,0.01f);     //SetWidth(startWidth,endWidth);
    render.SetColor(Color.red,Color.red);   //SetColor(startColor,endColor);
    render.SetVertexCount(2);              //设置顶点数
}
void Update()
{
        Ray ray=new Ray(transform.position,transform.forward*100);          //定义一个射线对象,包含射线发射的位置transform.position,
                                                                            // 发射距离transform.forward*100;                                                              
        RaycastHit hitInfo;                                 //定义一个RaycastHit变量用来保存被撞物体的信息;
        if(Physics.Raycast(ray,out hitInfo,100))         //如果碰撞到了物体,hitInfo里面就包含该物体的相关信息;
        {
            //hitInfo.point:碰撞点的位置;
            //hitInfo.normal:与碰撞点所在平面垂直的向量;
            //hitInfo.collider.gameobject:可以得到该物体上的所有信息了;
            if(Input.GetMouseButtonDown(0))
            {
                render.SetPosition(0,transform.position);            //射线起始位置;
                render.SetPosition(1,transform.position+transform.forward);    //射线方向;
            }
            render.SetVertexCount(0);                 //消除射线;
        }    
}

ok,简单吧,代码是我直接在这上面写的,有什么错误,欢迎指正哦!共同努力,耶

时间: 2024-07-31 14:58:03

unity中射线碰撞检测总结的相关文章

Unity中射线碰撞试验分享:

Physics.Raycast:光线投射 参数: origin:射线起始点 direction:射线方向 distance:射线长度 layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略. Returns bool - True when the ray intersects any collider,otherwise false. 当光线投射与任何碰撞器交叉时为真,否则为假. 下面通过实现这个小例子来试验一下:点击哪里就向哪里移动 using UnityEngine;

Unity中LayerMask的学习手记

Unity中是用int32来表示32个Layer层.int32表示二进制一共有32位(0-31).LayerMask实际上是用Int32的32个位来表示每个层级,当这个位为1时表示使用这个层,为0时表示不用这个层. 代码释义: LayerMask mask = 1 << 你需要开启的Layers层. LayerMask mask = 0 << 你需要关闭的Layers层.   等价于  LayerMask mask = ~( 1 << 你需要关闭的Layers层.) p

解读Unity中的CG编写Shader系列9——镜面反射

讨论完漫反射之后,接下来肯定就是镜面反射了 在开始镜面反射shader的coding之前,要扩充一下前面提到的知识,加深理解镜面反射与漫反射的区别. 引用一下一位前人博文中的一些基础概念,特别是关于冯氏反射模型的: 平行光(directional light) 一种是从特定方向射入并只会照亮面对入射方向的物体,我们称之为平行光(directional light). 环境光(ambient light) 另一种光是来自所有方向并且会照亮所有物体,不管这些物体的朝向如何,我们称之为环境光(ambi

unity中计算ugui中Text控件的所需长度

背景是这样的,我在unity中需要在我按下某个按键的时候,然后显示出被射线碰撞到的物体的信息.物体的信息之前已经整理好成txt文本了.读取一下就可以了.那么这时候就有一个问题,因为每个物体的介绍信息不是一样的长度,那么如果当text控件里面文字的长度超过显示的长度时,超过部分就不再显示.那么这该怎么办. 我是通过去便利txt文本中的所有文字和符号,然后将所有换行符也就是/n的个数记录下来,然后计算一下对应字体大小一行有几个字,比如我的是18号字体,那么一行可以写30个字,然后计算一下txt文本中

移植UE4的模型操作到Unity中

最近在Unity上要写一个东东,功能差不多就是在Unity编辑器上的旋转,移动这些,在手机上也能比较容易操作最好,原来用Axiom3D写过一个类似的,有许多位置并不好用,刚好在研究UE4的源码,在模型操作上,很多位置都解决了,其实大家可以对比下,在UE4与Unity中,UE4的如移动和旋转都要正确和好用. 如下是根据UE4中简单移植过来的效果图,差不多已经够用,UE4相关源码主要在EditorViewportClient与UnrealWidget. 介绍一下这个组件主要功能. 1. 模型本地空间

游戏的物理和数学:Unity中的弹道和移动目标提前量计算

下载地址:http://yunpan.cn/cK6pCrpdhfbTd  提取码 5472 弹道计算是游戏里常见的问题,其中关于击中移动目标的自动计算提前量的话题,看似简单,其实还是挺复杂的数学.网上这方面的资料还真不多,而且都是写的含含糊糊.抽空总结一下自己的方法. 讨论的前提是,假设目标是在3D空间里以匀速直线方式运动. 1.直线弹道在不考虑重力和空气阻力影响的情况下,子弹的弹道呈直线运动.这种情况下,其实是个纯平面几何空间的问题,不需要微积分和线代知识.分析的情况如下图:        

3D空间中射线与三角形的交叉检测算法

引言 射线Ray,在3D图形学中有很多重要的应用.比如,pick操作就是使用射线Ray来实现的,还有诸如子弹射线的碰撞检测等等都可以使用射线Ray来完成.所以,在本次博客中,将会简单的像大家介绍下,如何进行Ray-Triangle的交叉检测. Ray-Triangle交叉检测算法 在Tomas Moller的MT97论文中,提出了一种新的算法.这种算法能够减少以前进行Ray-Triangle交叉检测所需要的内存消耗.在以前,进行Ray-Triangle交叉检测,主要是计算射线与三角形所构成的平面

在Unity中使用事件/委托机制(event/delegate)进行GameObject之

欢迎来到unity学习.unity培训.unity企业培训教育专区,这里有很多U3D资源.U3D培训视频.U3D教程.U3D常见问题.U3D项目源码,[狗刨学习网]unity极致学院,致力于打造业内unity3d培训.学习第一品牌. 一对多的观察者模式机制有什么缺点? 如果你对如何在Unity中使用事件/委托机制还不太了解,建议您查看我的前一篇文章:[Unity3D技巧]在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信 在前一篇博客里面,我们写到

unity中三种调用其他脚本函数的方法

第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage("函数名");  此种方法可以调用public和private类型函数 第三种,GameObject.Find("脚本所在物体名").GetComponent<脚本名>().函数名();此种方法只可以调用public类型函数 unity中三种调用其他脚本函数的