unity中的射线碰撞检测

这篇具有很好参考价值的文章主要介绍了unity中的射线碰撞检测。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在Unity中,射线碰撞检测是一种常用的技术,通常用于确定射线与场景中的物体是否相交,并获取相交点的信息。

一.射线碰撞检测的基本步骤

1.创建射线:

使用Ray类或RaycastHit结构体创建射线。Ray表示射线的起点和方向,而RaycastHit用于存储射线与物体相交的信息,如相交点、法线等。

Ray ray = new Ray(origin, direction);
RaycastHit hit;

2.发射射线:

使用Physics.Raycast函数发射射线,并检查是否与物体相交。该函数会返回一个布尔值,表示射线是否击中物体。

if (Physics.Raycast(ray, out hit, maxDistance))
{
    // 射线击中物体
    // hit.point 是相交点的坐标
    // hit.collider 是相交物体的碰撞器
    // 其他信息如 hit.normal 可以获取相交点的法线等
}

3.Layer过滤:

可以使用layerMask参数来限制射线只与特定层的物体进行碰撞检测。这对于只关心特定类型的物体很有用。

int layerMask = 1 << LayerMask.NameToLayer("YourLayerName");
if (Physics.Raycast(ray, out hit, maxDistance, layerMask))
{
    // 只与指定层的物体相交
}

二.Physics.Raycast函数有多个重载类型

1.基本的Ray和最大射线支持的距离maxDistance

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity);
//Mathf.Infinity表示无穷大

2.Layer过滤:

使用layerMask参数来限制射线只与特定层的物体进行碰撞检测。

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers);

3.指定最小和最大碰撞体积大小:

使用minSizemaxSize参数,可以指定物体的最小和最大碰撞体积大小。

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal, float minSize = 0.0f, float maxSize = Mathf.Infinity);

这里出现了QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal,下面是对他的解释 

在Unity中,物体可以有两种类型的碰撞器:实体碰撞器(Collider)和触发器(Trigger)。实体碰撞器用于物体之间的物理碰撞,而触发器则用于检测物体是否进入某个区域,但触发器本身不会引起物理碰撞反应。

在进行射线碰撞检测时,有一个参数叫做 QueryTriggerInteraction,它的作用是告诉Unity在检测碰撞时是否要考虑触发器。

  • 如果设置为 QueryTriggerInteraction.UseGlobal,则会根据全局设置(Physics.queriesHitTriggers)来决定是否考虑触发器。
  • 如果设置为 QueryTriggerInteraction.Ignore,则不考虑触发器,即使全局设置允许考虑触发器。
  • 如果设置为 QueryTriggerInteraction.Collide,则始终考虑触发器,即使全局设置不允许考虑触发器。

4.返回所有相交信息:

使用RaycastHit[]数组返回所有相交信息。

public static RaycastHit[] RaycastAll(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

5.指定射线起点和方向:

这种重载允许你直接提供射线的起点和方向而不是创建Ray对象。

public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);

三.FPS游戏个人用过的方法

 if (Physics.Raycast(muzzle.position, muzzle.forward, out hit, range)) // 判断是否击中物体
        {
            if (hit.rigidbody) // 如果击中的物体有刚体的话
            {
                hit.rigidbody.AddForce(-hit.normal * impactForce); // 对击中的物体沿法线的反方向施加一个力
            }

            Enemy enemy = hit.transform.GetComponent<Enemy>();
            if (enemy)
            {
                enemy.TakeDemage(impactForce / 10);//这里是检测如果是敌人,就造成伤害
                return;
            }
        }

1首先在枪口前方定义一个空对象,用作发射点也就是代码中的muzzle.position.

2调整发生点的正方向,用作射线的方向。

3.hit是定义的RaycastHit,储存相交的物体信息。

4.range是定义的射程。

有帮助,有建议,请评论,还在学习中。文章来源地址https://www.toymoban.com/news/detail-840793.html

到了这里,关于unity中的射线碰撞检测的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [Unity学习日志]用Collider2D.IsTouchingLayers()进行碰撞检测

    [Unity学习日志]用Collider2D.IsTouchingLayers()进行碰撞检测

    复健,跟麦扣老师的教程注意到的新方法 Unity2018教程2D入门:07 跳跃动画 LayerMask_哔哩哔哩_bilibili 目的是检测玩家是否落地,然后切换动画 自己的实现就是简单的检测速度: 麦扣老师的方法:检测玩家是否与地面这个Layer产生碰撞,产生碰撞即落地 具体步骤: 1.将Tilemap图层设

    2023年04月22日
    浏览(10)
  • 【unity学习笔记-如何给动态的人物添加碰撞体】

    【unity学习笔记-如何给动态的人物添加碰撞体】

    前景提要 如题,项目中想实现和人物进行简单的互动,比如点击他的手臂的时候他会播放手臂的动作,点击脚的时候播放预设的和脚有关的动画 之前我的实现方式是十分暴力的在人物模型中对应的部位添加一个子物体,给子物体添加正方体/圆体这种规则的碰撞体,然后因为他是在

    2023年04月08日
    浏览(8)
  • Unity 的射线检测

    Unity 的射线检测

    Unity版本2020.3.32f1c1 目录 Ray RaycastHit Physics.Raycast() RaycastHit[]   Layer 应用 1.对Bad层级的物体进行着色 2.从相机发射射线与地面进行射线交互 3.运动的物体在场景中进行避障 总结 参考资料 原理是发射一条射线,传入起始点和起始方向当做射线的起点和方向。 在OnDrawGizmos()函数中

    2024年02月07日
    浏览(13)
  • Unity---2d射线检测

    Unity---2d射线检测

    目录 1.目标物体加对应的collider碰撞体  2.调节ProjectSetting里的time 帧速 3.LayerMask设置 4.避坑代码 1.目标物体加对应的collider碰撞体  2.调节ProjectSetting里的time 帧速 ⚠️按需使用 3.LayerMask设置 Layers通常被摄像机用来渲染部分场景,和灯光照射部分场景使用。但是它们也可以用来

    2024年02月11日
    浏览(10)
  • Unity 射线检测

    Unity 射线检测

    在Unity中,射线检测(Raycasting)是一种常用的技术,用于检测射线是否与场景中的物体相交。这在游戏开发中用于实现点击物体、射线武器的碰撞检测、角色与环境的交互等方面非常有用。 定义:表示从一个点沿着特定方向延伸的虚拟线段 属性: direction 射线的方向。 orig

    2024年02月13日
    浏览(11)
  • Unity之射线检测

    Unity之射线检测

    目录 📕一、射线检测原理 📕1.2、实现实例  📕二、导航 📕2.1 导航网格的使用 📕2.2 创建角色,在地形上移动 📕2.3 动态障碍物  📕2.4 网格链接  📕2.5 自定义网格链接  📕2.6 区域 不知道大家有没有玩过红色警戒 —— 一款即时战略游戏,和罪恶都市一样小编小学的时

    2024年01月20日
    浏览(7)
  • 【超级入门】Unity如何实现画射线+射线检测+NavMeshAgent结合

    【超级入门】Unity如何实现画射线+射线检测+NavMeshAgent结合

           “射线检测 是在3D数字世界里选择某个特定物体常用的一种技术,如在3D、VR游戏中检测子弹命中敌人情况或者从地上捡起一支枪,这都要用到 射线检测 , 射线检测 是在3D数字空间中选择虚拟物体的最基本方法。 ” 效果: 我们先创建一个物体,挂脚本 RayTest ,代码

    2024年02月15日
    浏览(11)
  • Unity Physics2D 2d物理引擎游戏 笔记

    Unity Physics2D 2d物理引擎游戏 笔记

    2d 材质 里面可以设置 摩擦力 和 弹力 Simulated:是否在当前的物理环境中模拟,取消勾选该框类似于Disable Rigidbody,但使用这个参数更加高效,因为Disable会销毁内部产生的GameObject,而取消勾选Simulated只是禁用。 Kinematic 动力学刚体 动力学刚体不受重力和力的影响,而受用户的

    2023年04月24日
    浏览(35)
  • 第二十八章 Unity射线检测

    第二十八章 Unity射线检测

    本章节我们介绍一下射线。射线就是从一个固定点向一个方向发射出一条直线,在发射过程中需要判断该射线有没有与游戏物体发送碰撞。射线既可以用来检测射击游戏中武器指向目标;又可以判断鼠标是否指向游戏物体。射线的创建方式,一般使用代码来实现。接下来,我

    2024年02月11日
    浏览(14)
  • Unity3d 射线检测

    Unity3d 射线检测

    射线碰撞单个物体: 方式1:从摄像机向世界发射一条射线,通常用于检测鼠标指针有没有选择物体 方式2:创建从一个点到一个方向的射线 声明一个射线碰撞信息类 //进行碰撞检测并返回结果,检测信息会写入碰撞信息类 射线碰撞多个物体: 例:可以用射线检测人物与地面

    2024年02月08日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包