Unity3D射线检测
射线检测主要用于像子弹是否打中物体,捡取物品等情况,本来面向百度想找例子看看, 不过没找到合适的,还是自己总结尝试吧。
以下测试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 表示碰撞第几层;
注:
- 这里 float maxDistance默认值无穷大;
- int layerMask默认值为DefaultRaycastLayers,所以两者均可不输入。
- 当然如果不想存打中物体的信息,只想判断打中过任意一个物体,也不用输入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射线检测相关推荐
- Unity3d 射线检测
射线碰撞单个物体: 方式1:从摄像机向世界发射一条射线,通常用于检测鼠标指针有没有选择物体 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosi ...
- Unity3D射线检测墙面前停止移动
功能: 计算角色/怪物走到目标,如果有墙就再墙前停止,防止一直怼墙走现象. 思路: 1. θ角 = 入射线(self - target) 与 法线(raycastHit.normal) 的夹角度(V3 ...
- 射线检测算法在游戏中应用
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- Unity3D 鼠标检测世界中的游戏对象
今天向大家介绍一下,如何初步的用Unity3D从摄像机到鼠标的射线,也就是鼠标检测到Unity3D世界中的游戏对象! 如何才能使射线检测到游戏对象呢,只有一个条件,那就是必须添加collider组件, ...
- 直播笔记 | Unity中射线检测详解
本文首发于洪流学堂微信公众号. 洪流学堂,学Unity快人几步 你好,我是郑洪智,你的技术探路者. 这周三我们直播剖析了Unity中射线检测的功能,以下是直播内容精华部分笔记. 完整录播:https: ...
- UE<C++>三步在C++中制作射击类游戏(射线检测、接口调用)
废话不多说 一.创建一个接口 UINTERFACE(MinimalAPI) class UHurtInterface : public UInterface {GENERATED_BODY() };/ ...
- 吃鸡空投掉落射线检测,粒子系统产生红色信号烟
1.首先将飞机和空投模型导入Unity,添加进场景视图. 2.给飞机添加飞行动画,(由于飞机只飞行一次 将Culling Mode勾选成Cull Completely) 3.给飞机和空投添加碰撞框,并 ...
- unity-2D游戏地面检测 三射线检测
2D游戏中跳跃是不可或缺的功能,要实现跳跃功能,就必须进行地面检测!常规方法是使用一根往角色下方延伸的射线检测,但是这种方法在一些复杂不规则的地面效果通常不尽人意.通过增加射线数量,即可完善这种方法的 ...
- Unity学习之Physic.Raycast(射线检测)个人理解分享
Physics.Raycast参数 public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitIn ...
- 八叉树的范围和射线检测
接typescript八叉树的简单实现 说一下typescript八叉树的范围和射线检测实现. 学习八叉树,并用自己的方式实现一下,理论联系实际 范围检测 应用场景 在3d项目中,针对场景节点较多的情 ...
最新文章
- python一点基础都没有的怎么办-为什么我会建议每个大学生都学一点python编程?...
- update 两个表关联_你真的了解全量表,增量表及拉链表吗?
- java实现责任链模式_我的Java设计模式-责任链模式
- 系统分析师考试结束了
- 拼车日滴滴派单的那些事
- CDS view里case - when - else关键字的用法
- 智能情绪分析技术_石化缘推荐:炼化企业智能机器人巡检技术应用前景分析!...
- phpcmsV9 表单向导(案例一)应用示例
- Silverlight Telerik控件学习:主题Theme切换
- linux 开放端口
- oracle update导入clob,【Oracle】给clob字段插入数据
- kafka与mysql持久化_漫游Kafka设计篇之数据持久化
- cmos和ttl_TTL和CMOS的比较
- 你的喜爱——软件测试方法和技术
- ThreadLocal原理及使用场景
- 【b站雅思笔记】Charlie有好好学习 - 雅思机经8-14
- python开发工程师是什么级别_什么条件才能成为Python开发工程师
- DataSec数据防泄密系统
- vmware虚拟机PE启动
- 鹏业软件喷淋的喷头改为上喷