Unity3D --对撞机/碰撞器 介绍
碰撞器一般都用作触发器而用,刚体一般用作真实碰撞。
静态对撞机:一个对象有对撞机组件,没有刚体组件。
这种情况在场景中的静态物体应用较多,比如墙体,房屋等静止不动的物体。
物理引擎假设静态对撞机是不会被移动的,所以不要尝试移动他们。
否则会产生性能开销,或者引发一个错误。
静态对撞机是不能“唤醒”刚体的。
如果真的想移动对象的话,就给他添加一个刚体组件。
刚体对撞机:一个对象有对撞机组件,而且有刚体组件。(no-kinematic)
这个对象既可以参与碰撞检测,也可以受到物理力的影响。
运动学刚体对撞机:一个对象有对撞机组件,有刚体组件,而且勾选了is kinematic。
什么是对撞机?
1. 对撞机组件定义对象形态上的物理碰撞.
2. 不可见的对撞机不需要与对象的网格, 具有完全相同的形状
3. 事实上,粗略的近似通常在游戏中更有效率和不可区分。
1. 最简单(最少的处理器密集型)碰撞器是所谓的原始对撞机类型
2. 在3D中,这些是箱子对撞机,球体对撞机和胶囊对撞机
3. 在2D中,您可以使用Box Collider 2D和Circle Collider 2D
4. 单个对象可以添加任意数量的这些对撞机 , 以创建复合碰撞器。
5. 通过仔细的定位和调整大小,复合碰撞器通常可以很好地逼近对象的形状,同时保持较低的处理器开销。
6. 通过在子对象上增加碰撞器可以获得更多的灵活性(例如,盒子可以相对于父对象的局部轴线旋转)
7. 当创建这样的复合对撞机时,应该只有一个Rigidbody刚体组件放置在层次结构中的根对象上。
请注意,原始碰撞器在transform变换中无法正常工作 -
这意味着如果在transform转换层次结构中使用旋转和非均匀尺度的组合,
以使生成的形状不再匹配原始形状,则原始对撞机不会能够正确地表示它。
然而,在某些情况下,甚至复合对撞机也不够准确。
在3D中,您可以使用Mesh Colliders网格碰撞器来精确匹配对象网格的形状。
在2D中,多边形对撞机2D通常不会完美匹配sprite图形的形状,
但您可以将形状细化到任何您喜欢的细节水平。
然而,这些对撞机的处理器密度要比原始类型多得多,所以请谨慎使用它们来保持良好的性能
此外,网格碰撞机通常不能与另一个网格碰撞机碰撞(即,当它们接触时不会发生任何事情)。
在某些情况下,您可以通过在检查器中将网格对撞机标记为凸面来解决此问题.
这将产生一个像“原始网格”一样的“凸包”的对撞形状,其中填充有任何底切.
这样做的好处是,一个凸起的网格对撞机可以与其他网格对撞机相撞,
这样您就可以使用这个特征当您具有适合形状的移动角色时。
然而,一个很好的一般规则是使用网格碰撞器进行场景几何,并使用复合原语对撞机近似移动对象的形状。
1. 可以将对角线添加到没有Rigidbody组件的对象上,以创建场景的楼层,墙壁和其他不动的元素。
这些被称为静态对照。
一般来说,您不应该通过更改“变换”位置重新定位静态对齐框架,因为这将严重影响物理引擎的性能。
一个对象上对撞机确实具有刚体被称为动态撞机。
静态对撞机可以与动态碰撞器进行交互,但是由于它们没有刚体,所以它们不会响应碰撞而移动。
"没有刚体的对撞机 碰撞时不会发生移动"
物理材料 Physics materials
1. 当碰撞者相互作用时,他们的表面需要模拟他们应该表示的材料的属性
2. 例如,一片冰将会滑动,而橡胶球会提供大量的摩擦力并且非常有弹性。
获得正确的参数可能涉及到一些尝试和错误,但冰材料,
例如将具有零(或非常低)的摩擦力和具有高摩擦力和接近完美的波峰的橡胶材料。
触发器 Triggers
触发器: 检测对象何时发生碰撞.
触发器只是碰撞器身上的一个属性,碰撞器是触发器的载体。
1. 脚本系统可以检测何时发生碰撞冲突,并使用该OnCollisionEnter功能启动操作
2. 也可以简单地使用物理引擎来检测何时一个对撞机进入另一个的空间而不产生碰撞冲突
3. 配置为触发器的对撞机(使用Is Trigger属性)不表现为固体对象,只允许其他碰撞器通过。
4. 当碰撞器进入其空间时,触发器将调用OnTriggerEnter触发器对象的脚本上的函数。
碰撞时采取的脚本动作 Script actions taken on collision
1. 当发生碰撞时,物理引擎会在附加到所涉及对象的任何脚本上调用具有特定名称的功能。
2. 可以在这些功能中放置任何您喜欢的代码来应对碰撞事件。
3. 例如,当汽车碰到障碍物时,您可能会发生碰撞音效。
1. 在检测到碰撞的第一个物理更新中,OnCollisionEnter调用该函数。
2. 在维护接触关联的更新期间,OnCollisionStay被调用,
3. 最后OnCollisionExit指出接触关联已被破坏。
4. 触发对撞机调用类似OnTriggerEnter,OnTriggerStay和OnTriggerExit功能
5. 对于2D物理,具有附加到名称的2D的等效功能,例如OnCollisionEnter2D
1. 对于正常的非触发碰撞,还有一个额外的细节,
2. 所涉及的对象中至少有一个必须具有非运动学刚体(即运动学必须关闭)。
3. 如果两个对象都是运动刚体,那么OnCollisionEnter就不会被调用
4. 触发碰撞时,这种限制不适用,因此运动学和非运动学刚体都将OnTriggerEnter在进入触发对撞机时
对撞机互动 Collider interactions
1. 根据他们的Rigidbody组件的配置方式,碰撞器会相互影响。
2. 三个重要的配置是静态碰撞器(即,根本没有连接刚体),刚体对撞机和运动刚体对撞机。
静态对撞机 Static Collider
/*静态对撞机: 具有对撞机但没有刚体的GameObject。*/
静态对撞机用于水平几何,它始终保持在同一个地方,永远不会移动。
进入的刚体物体将与静态碰撞器碰撞,但不会移动。
物理引擎假设静态对撞机不会移动或改变,并可以根据这一假设进行有用的优化。
因此,在游戏过程中不应禁用/启用,移动或缩放静态对撞机。
如果您更改了静态对撞机,那么这将导致物理引擎的额外的内部重新计算,导致性能下降。
更糟糕的是,这些变化有时可能使对撞机处于产生错误物理计算的未定义状态。
例如,针对改变的静态对撞机的射线可能无法检测到,或者在空间中的随机位置检测它。
此外,由移动的静态对撞机击中的刚体不一定是“唤醒”,静态对撞机不会施加任何摩擦。
由于这些原因,只有刚体对撞机才能改变。
如果您想要一个不受传入刚体影响但仍可以从脚本中移动的对撞机对象,
则应将运动学刚体组件附加到它, 而不是根本没有刚体。
刚体对撞机 Rigidbody Collider
/*刚体对撞机: 具有对撞机和非运动学正常刚体的GameObject。*/
刚体对撞机 = Collider+ (no-Kinematic Rigidbody GameObject)
1. 这是一个具有对撞机和正常的非运动学刚体的GameObject。
2. 刚体对撞机由物理引擎完全模拟,并可以对从脚本应用的碰撞和力量做出反应。
3. 它们可能与其他物体(包括静态碰撞器)发生碰撞,并且是使用物理学的游戏中最常用的对撞机配置。
运动刚体对撞机 Kinematic Rigidbody Collider
/*运动刚体对撞机: 具有对撞机和运动学刚体的 GameObject(即,刚体的IsKinematic属性已启用)*/
运动刚体对撞机 = Collider+ ( IsKinematic Rigidbody GameObject)
1. 这是一个具有对撞机和运动学刚体的 GameObject(即,刚体的IsKinematic属性已启用)。
2. 您可以通过修改其转换组件从脚本移动运动刚体对象,但不会像非运动学刚体那样响应碰撞和力。
3. 运动刚体应该用于可以偶尔移动或禁用/启用的碰撞器,但是否则应该像静态碰撞器一样。
4. 一个例子是一个滑动门,通常应作为一个不动的物理障碍,但必要时可以打开。
5. 与静态碰撞器不同,移动的运动刚体会将摩擦力与其他物体相互碰撞,并在接触时“唤醒”其他刚体。
1. 即使不动,运动刚体碰撞器与静态碰撞物具有不同的行为。
2. 例如,如果将碰撞器设置为触发器,那么您还需要向其添加一个刚体,以便在脚本中接收触发事件。
3. 如果您不希望触发器具有重力或受物理影响,则可以在其刚体上设置IsKinematic属性。
4. 使用IsKinematic属性,可以随时在正常和运动行为之间切换Rigidbody组件。
一个常见的例子是“抹布”效果,其中角色通常在动画下移动,但是由于爆炸或重型碰撞而物理地投掷。
默认情况下,角色的肢体每个都可以被赋予自己的刚体组件,并启用IsKinematic。
肢体将通过动画正常移动,直到IsKinematic关闭所有它们,并立即表现为物理对象。
在这一点上,一个碰撞或爆炸力将以令人信服的方式将四肢的飞翔发出。
碰撞动作矩阵 Collision action matrix
当两个对象碰撞时,可能会发生许多不同的脚本事件,这取决于碰撞对象的刚体的配置。
下面的图表基于附加到对象的组件来提供哪些事件功能被调用的细节。
一些组合只会导致两个对象中的一个受碰撞影响,但通常的规则是物理不会应用于没有连接刚体部件的对象。
物体发生碰撞的必要条件?
答:需要检测碰撞的物体身上存在刚体组件(或被检测物体),也要碰撞器collider
Unity3d脚本从唤醒到销毁有着一套比较完整的生命周期,请列出系统自带的几个重要的方法。
Reset——> Awake——>Start——>Update——>FixedUpdate——>LateUpdate——>OnGUI——>OnDisable——>OnDestroy
角色控制器
The Character Controller is mainly used for third-person or first-person player control that does not make use of Rigidbody physics.
角色控制器 : 主要用于第三人称或第一人称的播放器控制,不使用刚体物理。
Slope Limit -- 坡度限制--- 限制对撞机仅能爬低于此坡度限制的斜坡.
Step Offset -- 台阶偏移---角色将迈上台阶,当此显示值,更接近地面, 此值不能大于角色控制器的高度,否则会出现错误.
Skin width – 皮肤宽度 --- 两个碰撞物可以穿透彼此的皮肤宽度, / 较大的皮肤宽度可减少抖动. 低于皮肤宽度可能导致角色卡住. / 一个好的设置是使这个值达到半径的10%
Min Move Distance – 最小移动距离 --- 低于此值,角色更本不会动,最好设置为0.
Center – 中心 – 这将偏移世界空间中的胶囊对撞机,不会影响角色的转动
Radius – 半径 -- 胶囊对撞机半径的长度, 这基本上是对撞机的宽度
Height --- 高度 – 胶囊对撞机的高度. 改变它将沿着Y轴在正向和负向两个方向缩放对撞机。
胶囊形的对撞机,可以告诉你从一个脚本沿某个方向移动。
然后,控制器将执行运动,但受碰撞约束。它将沿着墙壁滑行,走上楼梯(如果它们低于阶梯偏移),并在斜坡限制内的斜坡上行走。
控制器本身并不会对力量作出反应,也不会自动将刚体推离
如果要使用角色控制器推送刚体或对象,则可以通过脚本将强制应用于与OnControllerColliderHit()函数相撞的任何对象。
另一方面,如果你想让你的玩家角色受物理影响,那么你最好不要使用Rigidbody而不是角色控制器。
Fine-tuning your character 微调你的角色
可以修改Height和Radius以适应您的Character的网格。
建议总是使用大约2米的人类角色。您还可以修改胶囊的中心,以防止您的枢轴点不在字符的确切中心。
步进偏移也可以影响这一点,确保对于2米尺寸的人来说,该值在0.1和0.4之间