射线检测主要用于像子弹是否打中物体,捡取物品等情况,本来面向百度想找例子看看, 不过没找到合适的,还是自己总结尝试吧。

以下测试Unity3D版本:2017.4.2f2

射线的检测步骤如下:

1.Ray

这个类为了产生一个射线,如果我们想要场景中某个物体产生一个射线,只需要定义一个ray,给予一个初始位置,以及方向便可以了。

public Ray(Vector3 origin, Vector3 direction);

2.RaycastHit

这个类就是为了存储发射射线后产生的碰撞信息。

Unity内部该类的代码,该函数可以存储如下信息:(中文是我个人翻译,仅供参考)

public struct RaycastHit
{//The barycentric coordinate of the triangle we hit.//打中三角形的重心坐标public Vector3 barycentricCoordinate { get; set; }//The Collider that was hit.//打中的碰撞体public Collider collider { get; }//The distance from the ray's origin to the impact point.//打中后与原始位置的距离public float distance { get; set; }//The uv lightmap coordinate at the impact point.//在碰撞点处的uv坐标public Vector2 lightmapCoord { get; }// The normal of the surface the ray hit.//射线撞击处的表面法线public Vector3 normal { get; set; }//The impact point in world space where the ray hit the collider.//打到碰撞体后,碰撞点的世界坐标public Vector3 point { get; set; }// The Rigidbody of the collider that was hit. If the collider is not attached to// a rigidbody then it is null.//达到的刚体,若没有刚体组件,返回空public Rigidbody rigidbody { get; }//The uv texture coordinate at the collision location.//碰撞点的uv纹理坐标public Vector2 textureCoord { get; }[Obsolete("Use textureCoord2 instead")]public Vector2 textureCoord1 { get; }//The secondary uv texture coordinate at the impact point.//碰撞点的第二个uv纹理坐标public Vector2 textureCoord2 { get; }//The Transform of the rigidbody or collider that was hit.//打中刚体或者碰撞体的Transformpublic Transform transform { get; }//The index of the triangle that was hit.//打中三角形的索引public int triangleIndex { get; }
}

有了这个类存储信息,我们便能跟Ray结合起来一起用。怎么结合呢?这就需要找一个函数把Ray打中的物体信息存储到RaycastHit里面,那么就需要找到Physics.Raycast()函数。

3.Physics.Raycast()

这个函数返回bool类型,表示打没打中。有多种方法尝试,常见的如下;

public static bool Raycast(Ray ray, RaycastHit hitInfo, float maxDistance , int layerMask);

public static bool Raycast(Ray ray, float maxDistance , int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance , int layerMask);

public static bool Raycast(Vector3 origin, Vector3 direction, RaycastHit hitInfo, float maxDistance ,int layerMask );

ray:射线;RaycastHit hitInfo 存储信息; float maxDistance 是射线检查碰撞的最大距离;int layerMask 表示碰撞第几层;

注:

  1. 这里 float maxDistance默认值无穷大;
  2. int layerMask默认值为DefaultRaycastLayers,所以两者均可不输入。
  3. 当然如果不想存打中物体的信息,只想判断打中过任意一个物体,也不用输入RaycastHit hitInfo。

4.例子

代码如下:

public class emitRay : MonoBehaviour {public GameObject origin_1;public GameObject target_1;void Start () {rayTest(origin_1.transform.position, target_1.transform.position);}void rayTest(Vector3 origin_pos, Vector3 target_pos)//初始位置,检测位置{Vector3 direction = direction = (target_pos - origin_pos).normalized; //方向Ray r1 = new Ray(origin_pos, direction);// Debug.DrawLine(origin_pos, origin_pos + direction_1 * 10, Color.red);RaycastHit hit;if(Physics.Raycast(r1, out hit, 10f))//out关键字主要为了不用初始给hit形参赋值{Debug.Log("打中");GameObject m1 = hit.collider.gameObject;//...这里就可以提取RaycastHit存储的信息做各种操作了}else{Debug.Log("未打中");}}
}

Unity3D射线检测相关推荐

  1. Unity3d 射线检测

    射线碰撞单个物体: 方式1:从摄像机向世界发射一条射线,通常用于检测鼠标指针有没有选择物体 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosi ...

  2. Unity3D射线检测墙面前停止移动

    功能: 计算角色/怪物走到目标,如果有墙就再墙前停止,防止一直怼墙走现象. 思路: 1. θ角 = 入射线(self - target) 与 法线(raycastHit.normal) 的夹角度(V3 ...

  3. 射线检测算法在游戏中应用

    笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...

  4. Unity3D 鼠标检测世界中的游戏对象

    今天向大家介绍一下,如何初步的用Unity3D从摄像机到鼠标的射线,也就是鼠标检测到Unity3D世界中的游戏对象! 如何才能使射线检测到游戏对象呢,只有一个条件,那就是必须添加collider组件, ...

  5. 直播笔记 | Unity中射线检测详解

    本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 你好,我是郑洪智,你的技术探路者. 这周三我们直播剖析了Unity中射线检测的功能,以下是直播内容精华部分笔记. 完整录播:https: ...

  6. UE<C++>三步在C++中制作射击类游戏(射线检测、接口调用)

    废话不多说 一.创建一个接口 UINTERFACE(MinimalAPI) class UHurtInterface : public UInterface {GENERATED_BODY() };/ ...

  7. 吃鸡空投掉落射线检测,粒子系统产生红色信号烟

    1.首先将飞机和空投模型导入Unity,添加进场景视图. 2.给飞机添加飞行动画,(由于飞机只飞行一次 将Culling Mode勾选成Cull Completely) 3.给飞机和空投添加碰撞框,并 ...

  8. unity-2D游戏地面检测 三射线检测

    2D游戏中跳跃是不可或缺的功能,要实现跳跃功能,就必须进行地面检测!常规方法是使用一根往角色下方延伸的射线检测,但是这种方法在一些复杂不规则的地面效果通常不尽人意.通过增加射线数量,即可完善这种方法的 ...

  9. Unity学习之Physic.Raycast(射线检测)个人理解分享

    Physics.Raycast参数 public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitIn ...

  10. 八叉树的范围和射线检测

    接typescript八叉树的简单实现 说一下typescript八叉树的范围和射线检测实现. 学习八叉树,并用自己的方式实现一下,理论联系实际 范围检测 应用场景 在3d项目中,针对场景节点较多的情 ...

最新文章

  1. python一点基础都没有的怎么办-为什么我会建议每个大学生都学一点python编程?...
  2. update 两个表关联_你真的了解全量表,增量表及拉链表吗?
  3. java实现责任链模式_我的Java设计模式-责任链模式
  4. 系统分析师考试结束了
  5. 拼车日滴滴派单的那些事
  6. CDS view里case - when - else关键字的用法
  7. 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...
  8. phpcmsV9 表单向导(案例一)应用示例
  9. Silverlight Telerik控件学习:主题Theme切换
  10. linux 开放端口
  11. oracle update导入clob,【Oracle】给clob字段插入数据
  12. kafka与mysql持久化_漫游Kafka设计篇之数据持久化
  13. cmos和ttl_TTL和CMOS的比较
  14. 你的喜爱——软件测试方法和技术
  15. ThreadLocal原理及使用场景
  16. 【b站雅思笔记】Charlie有好好学习 - 雅思机经8-14
  17. python开发工程师是什么级别_什么条件才能成为Python开发工程师
  18. DataSec数据防泄密系统
  19. vmware虚拟机PE启动
  20. 鹏业软件喷淋的喷头改为上喷

热门文章

  1. java解码acc音频文件_(JAVA)将(acc/m4a)音频转换成Mp3格式
  2. Linux 备份与恢复
  3. 计算机access基础操作,计算机基础--ACCESS-要求与操作步骤.pdf
  4. 如何快速获取CSDN积分
  5. textarea高度自适应且不出现滚动条
  6. 局域网服务器共享文件夹设置,局域网服务器共享文件访问权限管理方法
  7. visio 2007使用实例图文教程【转】
  8. java web导出excel_Web项目中数据导出Excel的实现方案
  9. SpringBoot整合Mybatis详细教程
  10. 华为路由器交换机基本配置方法