物理碰撞介绍

1. 刚体(RigidBody)概述

刚体是使游戏物体(GameObject)拥有物理行为的主要组件(Component)。添加刚体时,物体会立即响应重力(gravity)。如果还添加了一个或多个碰撞器(Collider)组件,游戏物体将接受物理碰撞
由于RigidBody组件接管了它所附加的游戏物体的运动系统,所以不应该再在脚本中通过Transform属性来移动它。而应该使用力的作用去推动游戏物体,让物理引擎计算运动结果。
在某些情况下,开发者可能希望游戏物体拥有一个刚体,但物理引擎不去控制它的运动。例如,开发者可能希望直接从脚本代码控制角色,但仍然允许通过触发器(Trigger)来检测角色。由脚本产生的这种非物理性质的运动被称为Kinematic(动力学)运动。Rigidbody组件具有一个名为Is Kinematic的属性,该属性将其从物理引擎的控制中移除,并允许以脚本的方式移动它。开发者可以通过脚本将Is Kinematic的值更改为开启或者关闭,但这会带来性能开销。

2. 碰撞器(Collider)

碰撞器(Collider)组件定义了物体在计算物理碰撞时的形状。碰撞器是不可见的,不需要与游戏对象的网格形状(Mesh Filter)完全相同。事实上,一个碰撞器的形状只需要粗略地近似游戏对象的网格形状,在游戏中往往发现不了区别而且更有效率。
最简单(和最低处理器损耗)的碰撞器是所谓的原始型碰撞器(Primitive Collider)。在3D系统中,它们是盒子碰撞器(Box Collider),球形碰撞器(Sphere Collider)和胶囊碰撞器(Capsule Collider),在2D系统中,它们是二维盒形碰撞器(Box Collider 2D)和圆形碰撞器(Circle Collider 2D)。可以将多个原始型碰撞器添加到同一个游戏对象上来创建混合型碰撞器(compound colliders)。
混合型碰撞器往往可以通过仔细地定位和调节大小来得到近似物体的形状,这样可以使处理器开销水平较低。开发者也可以通过在子对象添加碰撞器来使碰撞更加灵活。如果这样做,应该只有一个刚体组件,而且需要放置在层次结构中的根(root)对象上。
注意,原始型碰撞器不能很好地适应游戏对象的变换,比如扭曲、旋转等。这意味着如果开发者使用复杂的动作和变换,产生的形状不再匹配原始形态,原始型碰撞器将无法正确表达。
然而某些情况下,即使混合型碰撞器也不够准确表达开发者需要的碰撞效果。在3D系统中,可以使用网格碰撞器(Mesh Collider)完全匹配对象的网格形状。在2D系统中,多边形碰撞器(Polygon Collider 2D)虽然不能完美匹配精灵图形(Sprite)的形状,但可以任意细化形状的细节。然而,这些碰撞器比原始型碰撞器更加损耗处理器性能,所以需要谨慎地使用它们以保持良好的性能。同时,网格碰撞器无法与另一个网格碰撞器碰撞(即它们不会检测到彼此)。在某些情况下,可以通过在检视面板中标记网格碰撞器为“凸面的(Convex)”来解决这个问题。这将产生形状为“凸面的”碰撞器,和原来的网格一样,但凹的发生碰撞。然而,普遍的规则是使用网格碰撞器来实现场景的几何形状,使用混合型碰撞器实现运动物体的近似形状。
碰撞器可以添加到没有刚体组件的游戏对象上,用来创造地板、墙壁和其他静止场景元素。这些被称为静态碰撞器(Static Colliders),一般来说不应该在脚本中对静态碰撞器进行变换处理,因为这将严重影响物理引擎的性能。碰撞器可以添加到有刚体组件的游戏物体上,此时被称为动态碰撞器(Dynamic Colliders)。静态碰撞器可以与动态碰撞器相互作用,但是如果两个碰撞器都没有刚体,它们将不响应碰撞事件。

3. 物理材质(Physics material)

当碰撞器相互作用时,它们的表面需要模拟它们所代表的物质的性质。例如,一块冰会很滑,而橡胶球则会产生很多摩擦力(Friction),而且非常有弹性(Bounciness)。虽然碰撞时碰撞器的形状并没有改变,但它们的摩擦和反弹可以用物理材质来配置。

4. 触发器(Trigger)

当发生碰撞时,脚本系统可以检测到并触发OnCollisionEnter函数。然而,也可以使用物理引擎来检测当一个碰撞器进入另一个的空间而非产生碰撞的情况。一个碰撞器配置为触发器(使用Is Trigger属性)后并不表现为一个实体对象,只会让其他碰撞器通过。当碰撞器进入空间时,在触发对象的脚本上调用OnTriggerEnter函数。

5. 脚本操作上采取的碰撞

当发生碰撞时,物理引擎会在涉及对象的脚本上调用具有特定名称的某些函数。开发者可以将任何代码放置在这些函数中,以响应碰撞事件。例如,当一辆车撞到障碍物时,需要播放碰撞音效。
在探测到碰撞的第一帧,调用OnCollisionEnter函数。在保持接触后的每一帧,会调用OnCollisionStay。最后,OnCollisionExit表示这一帧离开接触。触发器碰撞器调用类似的OnTriggerEnter、OnTriggerStay和OnTriggerExit函数。注意,对于二维物理,有等价的函数,例如OnCollisionEnter2D。
在正常的非触发器碰撞中,有一个额外的细节,那就是涉及碰撞的对象中至少有一个必须具有非运动学刚体(即Is Kinematic必须关闭)。如果两个物体都是运动学刚体,OnCollisionEnter就不会被唤起。但是触发碰撞中并没有这种限制,运动学和非运动学刚体都将在进入触发碰撞器时调用OnTriggerEnter。

注:所有组件及代码都需在物体的属性界面进行搜索添加。

unity物理碰撞介绍相关推荐

  1. unity物理碰撞操作方案

    经unity官方网站资料改写整理书写本博客,原网址方案链接如下: Lesson 2.4 - Collision Decisions - Unity Learn 首先  1.先创建两个物体 然后   2 ...

  2. Unity 物理系统 -- 碰撞体简介(碰撞、触发条件)

    Unity 物理系统 -- 碰撞体简介(碰撞.触发条件) 几个常用的碰撞体: Box Collider:盒碰撞体,盒碰撞体是一个立方体外形的基本碰撞体,该碰撞体可以调整为不同大小的长方体,可用作门.墙 ...

  3. Unity物理系统中碰撞体、刚体、isKinematic、isTrigger的关系(附动画演示)

    Unity物理系统中碰撞体.刚体.isKinematic.isTrigger的关系 写在前面 产生碰撞的条件 产生触发的条件 实验一:蓝块(碰撞体).红块(碰撞体) 实验二:蓝块(碰撞体).红块(碰撞 ...

  4. 【Unity探究】物理碰撞实验

    这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就是物理碰撞.以前没有好好研究过,一直模糊不清,到底什么条件下才可以产生物理碰撞呢?只要其中一个有Rigidbody就可以了吗?所以进 ...

  5. 【Unity】物理碰撞实验

    http://www.cnblogs.com/javawebsoa/archive/2013/05/18/3085818.html 这几天为了准备面试,所以决定对平时学习中的盲点扫盲一下,首先想到的就 ...

  6. [Unity][2D][物理碰撞]同一层级碰撞体忽略碰撞

    3D碰撞体和2D碰撞体的原理 ,代码差不多.参考资料3 参考资料2,一个2D碰撞体忽略另外一个碰撞体. 参考资料1,一个层级的 碰撞体 忽略 另外一个 层级的 碰撞体. Edit-ProjectSet ...

  7. Unity 物理系统

    Unity物理系统 ##1.人机交互 ++1.1.外部输入设备 ++++键盘 ++++触屏 ++++摇杆 ++++鼠标 ++1.2.Input类简介 ++++Input类是输入系统的接口,使用这个类能 ...

  8. Unreal Engine 4 物理模拟之物理碰撞、重叠与射线检测

    1.碰撞组件基本属性 碰撞组件的属性如图 属性简要介绍: Simulation Generates Hit Events:是否对碰撞事件进行通知 Phys Material Override:指定该M ...

  9. 开发实现物理加速度移动_Cocos Creator 3D 物理模块介绍

    为提升阅读体验,[参考链接]统一放在文末! 设计思路简单易用为了让游戏开发更加简单.友好和高效,Cocos Creator 3D 在研习和摸索中设计了一套比较基础的物理组件,并且还在持续完善中.尽管当 ...

最新文章

  1. win7如何更改文件类型_教你win7局域网设置方法
  2. 家庭装修里最大的问题
  3. c++问题,EOF eofbit eof() 请问他们的区别是什么?
  4. win10虚拟机下载安装安全狗(Apache版本)
  5. 【ZOJ - 4024】Peak(模拟,水题)
  6. Java笔记-通过注解和插件自动生成get/set和toString方法,使代码结构清晰
  7. Validator验证Ajax提交表单的方法
  8. 在iOS项目中,这样才能完美的修改项目名称
  9. Word如何自动多级编号
  10. word2019如何清除折叠黑色三角形的方法
  11. 【矩阵论】广义特征值问题
  12. All clients has disconnected from. You can graceful shutdown now., dubbo version: , current host
  13. 如何解决微信小程序加载慢的问题?
  14. ubuntu无法清空回收站解决办法
  15. android media player实现一个可手势滑动控制 + 可以调节分辨率|字幕|倍速的视频播放器(MediaPlayer + ExoPlayer实现)
  16. 微信支付宝扫码支付简介
  17. 文字盘点:当今社会十句最恶俗的流行书面中文
  18. Python——爬虫+词云+数据库
  19. Tomcat优化操作
  20. CocosCreator项目实战(15):动画与音效

热门文章

  1. 3G无线网络对规划优化软件技术分析(转)
  2. Android音视频开发之音频录制和播放
  3. 抖音运营经验与抖音机制分享!
  4. vCenter纳管ESXI主机出错
  5. 首师大计算机技术报考人数,2020首都师范大学招生计划及人数
  6. vCenter6.0安装笔记
  7. linux虚假唤醒(spurious wakeup)
  8. 百度老年搜索:毫无意义
  9. 通过百度接口实现图片表格文字提取并输出EXCEL
  10. 全球73.9TB卫星影像需要COPY多久?