unity --24 物理引擎--刚体,碰撞体

刚体

物理引擎:模拟真实世界中物体的物理特性。
带有刚体组件的游戏物体,刚体组件可使游戏对象受物理引擎控制,在受到外力时产 生真实世界中的运动。

unity --24 物理引擎--刚体,碰撞体_第1张图片
质量Mass:物体的质量。
•阻力Drag:当受力移动时物体受到的空气阻力。0表示没 有空气阻力,极大时可使物体停止运动
•角阻力Angular Drag:当受扭力旋转时物体受到的空气阻 力。0表示没有空气阻力,极大时使物体停止旋转。
•使用重力Use Gravity:若激活,则物体受重力影响。
•是否是运动学Is Kinematic:若激活,该物体不再受物理 引擎控制,即自身不受作用力。

插值Interpolate:用于缓解刚体运动时的抖动。

Collision Detection:碰撞检测模式。快速移动 的刚体在碰撞时有可能互相穿透,可以设置碰撞检测频率, 但频率越高对物理引擎性能影响越大。
不连续Discrete:不连续碰撞检测。适用于普通碰撞(默 认模式)。
连续Continuous:连续碰撞检测。
动态连续Continuous Dynamic:连续动态碰撞检测,适用 于高速物体。

碰撞体

使刚体具有碰撞效果,可以单独作用于物体,但是要使移动的物体具有碰撞效果 必须附加刚体组件。

分类
•静态碰撞器Static Collider :只有碰撞器没有刚体的物体
现象:保持静止或者轻微移动,如:平面/树木
•刚体碰撞器RigidbodyCollider:具有刚体和碰撞器的物体; 现象:完全受物理引擎影响。
•运动学刚体碰撞器: 带刚体,且勾选Is Kinematic,此碰撞器 不能添加力,只能通过transform移动。

unity --24 物理引擎--刚体,碰撞体_第2张图片
物理引擎会工作有两个条件:
①物体A有刚体
②刚体所属的物体A在运动

当物体A去碰撞物体B时,满足条件,物理引擎持续检测,直到碰撞发生。
反之,如果物体B去碰撞物体A,因为物体B没有刚体,如果物体A静止,物理引擎不会工作。
unity --24 物理引擎--刚体,碰撞体_第3张图片
只有当碰撞发生后,才会有碰撞事件:

①void OnCollisionEnter(Collision collOther) 当进入碰撞时执行,除非重复碰撞,否则只执行一次

②void OnCollisionStay(Collision collOther) 当碰撞体与刚体接触时每帧执行,会执行N次

③void OnCollisionExit(Collision collOther) 当停止(退出)碰撞时执行,除非重复碰撞,否则只执行一次

同时,该碰撞事件的脚本可以挂载物体A上,也可以挂载物体B上。

unity --24 物理引擎--刚体,碰撞体_第4张图片

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class aaa : MonoBehaviour 
{

    public Transform cube;
  
  
	void Update () 
	{

     
      
    }
    private void OnCollisionEnter(Collision collision)
    {
        print(" OnCollisionEnter");
       print( collision.collider.name);
       //collision.contacts 接触点的数组集合
       //collision.contacts[0] 第一个接触点
    }
}

unity --24 物理引擎--刚体,碰撞体_第5张图片
所以参数 collision代表的是被撞的那个物体的碰撞器。

碰撞发生的必备条件:
① 物体有刚体
②该物体在运动
③两者都具有碰撞体

触发器

带有碰撞器组件,且Is Trigger属性被勾选的物体。
•现象:无碰撞效果。
一但点选Is Trigger,该碰撞器就变成了触发器,没有碰撞效果。
unity --24 物理引擎--刚体,碰撞体_第6张图片

void OnTriggerEnter(Collider cldOther) 当Collider(碰撞体)进入触发器时执行

void OnTriggerStay(Collider cldOther) 当碰撞体与触发器接触时每帧执行

void OnTriggerExit(Collider cldOther) 当停止触发时执行
unity --24 物理引擎--刚体,碰撞体_第7张图片

触发器产生的必备条件:
①两者一个具有碰撞体组件,另一个具有触发器组件
②其中之一带有刚体组件

可见触发器的条件比碰撞器要宽泛,没那么严格。
参数cldOther和前面的collision不同,前者就是碰撞体组件,等价于collision.collider。
一个触发器和一个碰撞体是互斥的,有了触发,就没有碰撞效果,也就不会调用OnCollision系列函数。

当然一个物体可以绑多个碰撞体,比如物体A绑了两个碰撞体,其中一个修改为触发器。
unity --24 物理引擎--刚体,碰撞体_第8张图片
那么物理引擎会分别计算:
物体A的碰撞体+刚体与物体B的碰撞体有碰撞效果。
物体A的触发器+刚体与物体B的碰撞体有触发效果。

适用范围

什么时候用碰撞体? 物体非背景,要有“阻挡”效果的时候,如墙壁,桌椅,地板等等。
什么时候用刚体? 物体非背景,即有“阻挡”效果,又有物理受力效果。
什么时候使用触发器?物体可以是背景,也可以非背景,强调“接触”效果。如生命球,能拾取的金币等等。

你可能感兴趣的:(游戏引擎)