草庐IT

Unity 3D学习笔记(5)物体的碰撞/触发检测

Z_羊羊 2023-08-14 原文

前言

在学习了刚体组件后,我们看到了物体的物理效果,比如重力,碰撞等等,那么该如何检测他们之间的碰撞呢?
在Unity中,有碰撞检测和触发检测两种类型,他们的简单概括如下:


一、碰撞检测

1.如何使用碰撞检测

在3D物体上,添加刚体组件,即可实现该物体的碰撞,但地面,障碍物等往往不需要添加刚体就可以与你的对象发生碰撞,为什么不直接将所有物体都加上刚体组件呢,是为了减少计算机的开销,这样只需要设置一半的刚体组件就可以实现碰撞检测。
刚体碰撞可以模拟一定的物理效果,比如速度快的时候可以撞飞起来等等,但是无论撞什么那碰撞的一瞬间都会有物理效果,会对当前速度造成一定损失。

碰撞检测的条件:

  • 发生碰撞的两个物体至少有一个带有刚体组件。
  • 发生碰撞的两个物体都必须带有碰撞器组件。
  • 持续碰撞的回调方法需要有相对运动才有调起。
    如果带有刚体的物体不发生运动,刚体会处于休眠状态,系统不会进行碰撞检测的,如果带有刚体的物体运动,刚体会一直处于活动状态,碰撞检测才会进行。

2.检测碰撞的方法

unity中检测碰撞的方法如下,enter为碰撞一瞬间时会调用的函数,stay为碰撞持续过程中会调用的函数,exit为碰撞结束的一瞬间会调用的函数。

     // 碰撞开始
     void OnCollisionEnter(Collision collision) {
       
     }
 
     // 碰撞结束
     void OnCollisionExit(Collision collision) {
 
     }
 
     // 碰撞持续中
     void OnCollisionStay(Collision collision) {
 
     }

碰撞检测基本用于所有的物理效果模拟上,在碰撞的不同阶段去实现不同的游戏逻辑。

二、触发检测

1.如何使用触发检测

触发检测的条件:

  • 两个物体都需要有碰撞器。
  • 至少有一个物体是挂载刚体。
  • 其中一个的box collider组件勾选Is Trigger。

触发检测和碰撞检测虽然都可以检测到两个物体是否发生接触,但是有一些区别,比如碰撞发生时,两个物体会模拟物理效果,会弹开等等,但触发发生时,运动的物体会直接穿过对方。

还有上文提到碰撞会让两个物体有物理效果,所以在设计一些吃豆豆等行为时,当游戏对象触碰到豆豆时,豆豆被销毁,但玩家还是会受到物理效果,会明显地顿一下,这并不是我们想要的结果,因为我们只要玩家在吃到豆豆时销毁豆豆并加分就可以,所以这是就需要触发检测,这样触碰到豆豆销毁他的同时,玩家角色的行动还不会受到碰撞影响。

2.触发检测的方法

触发检测的函数方法与碰撞检测基本相同,使用的参数不同,需要注意,如下所示:

     // 开始接触
      void OnTriggerEnter(Collider collider) {
        
     }
 
     // 接触结束
     void OnTriggerExit(Collider collider) {
         
     }
 
     // 接触持续中
     void OnTriggerStay(Collider collider) {
        
     }

总结

碰撞的检测是unity中很重要的一个知识点,基本上所有的游戏都离不开碰撞的检测,无论是2D还是3D游戏,只是3D中碰撞器的设置可能比2D复杂一点。

有关Unity 3D学习笔记(5)物体的碰撞/触发检测的更多相关文章

  1. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

    请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

  2. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  3. ruby-on-rails - Rails - 乐观锁定总是触发 StaleObjectError 异常 - 2

    我正在学习Rails,并阅读了关于乐观锁的内容。我已将类型为integer的lock_version列添加到我的articles表中。但现在每当我第一次尝试更新记录时,我都会收到StaleObjectError异常。这是我的迁移:classAddLockVersionToArticle当我尝试通过Rails控制台更新文章时:article=Article.first=>#我这样做:article.title="newtitle"article.save我明白了:(0.3ms)begintransaction(0.3ms)UPDATE"articles"SET"title"='dwdwd

  4. ruby-on-rails - 如何在 Rails Controller Action 上触发 Facebook 像素 - 2

    我有一个ruby​​onrails应用程序。我按照facebook的说明添加了一个像素。但是,要跟踪转化,Facebook要求您将页面置于达到预期结果时出现的转化中。即,如果我想显示客户已注册,我会将您注册后转到的页面作为成功对象进行跟踪。我的问题是,当客户注册时,在我的应用程序中没有登陆页面。该应用程序将用户带回主页。它在主页上显示了一条消息,所以我想看看是否有一种方法可以跟踪来自Controller操作而不是实际页面的转化。我需要计数的Action没有页面,它们是ControllerAction。是否有任何人都知道的关于如何执行此操作的gem、文档或最佳实践?这是进入布局文件的像素

  5. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  6. Unity 热更新技术 | (三) Lua语言基本介绍及下载安装 - 2

    ?博客主页:https://xiaoy.blog.csdn.net?本文由呆呆敲代码的小Y原创,首发于CSDN??学习专栏推荐:Unity系统学习专栏?游戏制作专栏推荐:游戏制作?Unity实战100例专栏推荐:Unity实战100例教程?欢迎点赞?收藏⭐留言?如有错误敬请指正!?未来很长,值得我们全力奔赴更美好的生活✨------------------❤️分割线❤️-------------------------

  7. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  8. unity---接入Admob - 2

    目录1.AdmobSDK下载地址2.将下载好的unityPackagesdk导入到unity里​编辑 3.解析依赖到项目中

  9. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  10. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

随机推荐