Unity 射线与碰撞范围检测【踩坑记录】

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

射线检测

射线检测在2D和3D的区别比较大

  • 一定要加上对应的Collider组件

  • 对应的函数只检测对应的Collider,Physics.Raycast是不会检测到Collider 2D的(这个让我有一次debug了好久才发现)

  • 对应API如下

Physics.Raycast(Vector3 origin,Vector3 direction,out RaycastHit hitinfo,float distance,int LayerMask);
//origin:射线的起始点,因为是位置坐标所以使用Vector3表示
//direction:射线的方向,因为是方向坐标所以使用Vector3表示
//hitinfo:一个结构体,可以储存碰撞体的所有信息。你可以声明一个空的然后直接代入就可以
//下面是可选参数:
//distance:射线检测的距离
//LayerMask:图层,如果输入图层的序号就可以只检测这个图层的相应物体,

可以使用Debug.DrawLine(Vector3 origin,Vector3 destination,Color color)Debug.DrawRay(Vector3 origin,Vector3 direction,Color color)来使射线可视化

此外因为Ray都是由两个Vector3变量构造而成的,而2D世界都是Vector2,只能用Vector2变量表示了。

当从物体中心点发出时,检测到的第一个碰撞体却是自己。

那我们该怎么解决这个问题呢?答案是Physics2D.queriesStartInColliders = false;这样如果碰撞体是我们射线所在起点的内部时,我们不让它返回该碰撞体。

为什么LayerMask是int

LayerMask的形式是int。它表示的是你图层的序号的二次方倍

就是相当于一个二进制数,需要检测的图层的对应位置为1,其余为0

  • 1 << 10 打开第10的层。 等价于1 << LayerMask.NameToLayer(“Ground”); 也等价于LayerMask.GetMask((“Ground”);
  • ~(1 << 10) 打开除了第10之外的层。(取反符号)
  • ~(1 << 0) 打开所有的层。
  • (1 << 10) | (1 << 8) 打开第10和第8的层。

2D碰撞检测

Unity的物理引擎是基于PhysX的,但有时候游戏需要可配置的物理效果,按帧或者是时间线的方式来产生类似的效果。

Rigidbody 2D

选用了Rigidbody 2D组件的话,不能修改transform.position,而是要使用Rigidbody2D.positionRigidbody2D.rotation

Body Type

  • Dynamic: 表示动态刚体,完全模拟物理效果,与任何Rigidbody 2D都会发生物理效果,但是效率最低,只适合角色使用
  • Kinematic: 表示运动学,只能和Dynamic刚体碰撞,如果需要和其他类型碰撞或者是需要触发碰撞事件,需要勾选Use Full Kinematic Contacts.
  • Static: 和Dynamic发生碰撞效果,和Kinematic只能发生碰撞事件(需要勾选Use Full Kinematic Contacts

碰撞事件

我们除了可以在碰撞者和被碰撞者上监听碰撞事件外,如果监听碰撞的元素比较多,还能将碰撞事件抛出去由外部统一处理。

void Start()
{
    CollisionLi1stener.onCollisionEnter2D.AddListener(delegace (GameObject g1, GameObject g2) {
    	Debug.LogFormat ( "{0}开始碰撞{1}",g1.name , g2.name);
    });
                                                      
    CollisionLi1stener.onCollisionStay2D.AddListener(delegace (GameObject g1, GameObject g2) {
    	Debug.LogFormat ( "{0}碰撞中{1}",g1.name , g2.name);
    });
                                                      
    CollisionLi1stener.onCollisionExit2D.AddListener(delegace (GameObject g1, GameObject g2) {
    	Debug.LogFormat ( "{0}结束碰撞{1}",g1.name , g2.name);
    });
                                                      
}

碰撞方向

Unity2D并没有提供方法来判断方向,但是提供了碰撞发生的坐标点,需要我们自己来计算碰撞方向。

void OnCollisionStav2D(Collision2D coll){
    foreach (ContactPoint2D contact in coll.contacts)
    {
        //绘制线
        Debug.DrawLine ( contact.point, transform.position, Color.red);
        var direction = transform.InverseTransformPoint (contact.point);
        if(direction.x > 0f){ 
            print( "右碰撞");
        }
        if(direction.x < 0f){
        	print("左碰撞");}
        if(direction.y > 0f){
       	 	print ("上碰撞");
        }
        if(direction.y < 0f){
       		 print ("下碰撞");
        }
    }
}

Effector

unity可以给Collider 2D组件添加的额外效果

  • Platform Effector 2D: 单向板地面,能从下往上跳,却掉不下来
  • Surface Effector 2D: 传输带一样带摩擦移动
  • Point Effector 2D: 类似炸弹,爆炸后可以把周围东西炸开
  • Buoyancy Effector 2D: 模拟浮力
  • Area Effector 2D: 区域力

不依赖物理引擎

我们可以不依赖物理引擎,可以极大的优化效率,比如我们可以利用射线检测实现碰撞检测

射线检测

Unity 射线与碰撞范围检测【踩坑记录】

可以看出只用一根射线检测是不行的,在2D-Epic-Controller中就使用了10个射线检测来判断地面和前提碰撞

这种方法手感非常的完美,不过实现起来有些许麻烦

Physical.Overlap

我们可以直接使用下面几种:

  • Physics.OverlapBox
  • Physics.OverlapCapsule
  • Physics.OverlapSphere

可以在此基础上使用Gizmos 辅助线框来实现在Scence中更好的视觉效果

如果是2D则使用Physics2D.开头的一系列函数

3D碰撞检测

碰撞检测穿透

只要是跟碰撞相关的基本都是离不开Rigidbody这个组件,当中的Collision detection参数可以选择碰撞检测方式

Unity 射线与碰撞范围检测【踩坑记录】

主要用于处理高速s运动的物体,会有时候直接穿过其他物体的时候
Unity 射线与碰撞范围检测【踩坑记录】

(上图每个箭头两端均指的是两个即将碰撞的物体的Collision Detection属性的值,箭头中间的属性值所指的是这两个物体时间碰撞所用的碰撞检测模式)

  • Discrete(离散型检测模式)就是普通的默认状态;

  • Continuous(连续检测)则是更加精细的碰撞检测,但是很耗资源;

  • Continuous和Continuous Dynamic的共同点在于,对待没有刚体和设置为Continuous Dynamic的物体都使用连续碰撞检测,对待刚体设置为Discrete的物体都使用离散碰撞检测。

  • 不同点在于,Continuous Dynamic在检测另一个设置为Continuous的物体使用的仍然是连续碰撞检测模式,而Continuous检测另一个Continuous的物体时使用的却是离散碰撞检测。

Unity 射线与碰撞范围检测【踩坑记录】

此两类方法由于依赖于连续(线性)扫描,所以会忽略物体的角速度,当物体迅速旋转时,仍然会有穿墙的情况发生

之后又出了一个Continuous Speculative **(基于推测式)**这里官方的API解释是要比Continuous和Dynamic的方式这两种方式更加的节省性能,是扫描方式的进行连续碰撞检测。

使用连续碰撞检测(Continuous和Continuous Dynamic)前提:

刚体和非刚体(静态碰撞器): 刚体物体的碰撞器必须是Box,Sphere,Capsule,非刚体物体的碰撞器必须是Mesh。

不使用物理引擎

不使用刚体 Rigidbody的方式,采用发射子弹之前,先发射射线,记录碰撞点(判断是否会发生碰撞),然后在发射子弹。文章来源地址https://www.toymoban.com/news/detail-402578.html

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

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

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

相关文章

  • Unity 射线检测

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

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

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

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

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

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

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

    2024年02月15日
    浏览(26)
  • 第二十八章 Unity射线检测

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

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

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

    2024年02月08日
    浏览(30)
  • Unity 之`Physics.Raycast()`方法,射线检测

    当你在Unity中使用 Physics.Raycast() 方法时,你实际上是在进行一种射线检测,以查看一条射线是否与场景中的碰撞体相交。这可以用来实现很多不同的功能,如点击选择物体、射击命中检测等。以下是 Physics.Raycast() 方法的详细介绍: 参数解释: origin :射线的起点(3D世界坐标

    2024年02月11日
    浏览(31)
  • Unity 中检测射线穿过的所有的物体

     在开发中 有个需求,射线要检测所有穿过的物体。 代码如下:   运行结果  

    2024年02月14日
    浏览(27)
  • Unity在物体内部发射射线检测不到物体的解决方式

    在Unity2018.1.18上不大好用。

    2024年02月15日
    浏览(24)
  • 【Unity】Unity碰撞检测(3D和2D)

    碰撞检测可以说时学习Unity中最重要的一个部分,以为在游戏中,想要游戏进行交互,碰撞时非常重要的,而我在网上查了很多教程,但是都没有成功,后来经过我的仔细检查代码与修改,终于成功了 简单Unity跑酷游戏 简单跑酷游戏 在 zhong_dot 和 Player 两个实体都加上 碰撞体

    2024年02月20日
    浏览(24)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包