unity --24 物理引擎--剛體,碰撞體

剛體

物理引擎:模擬真實世界中物體的物理特性。
帶有剛體組件的遊戲物體,剛體組件可使遊戲對象受物理引擎控制,在受到外力時產 生真實世界中的運動。

在這裏插入圖片描述
質量Mass:物體的質量。
•阻力Drag:當受力移動時物體受到的空氣阻力。0表示沒 有空氣阻力,極大時可使物體停止運動
•角阻力Angular Drag:當受扭力旋轉時物體受到的空氣阻 力。0表示沒有空氣阻力,極大時使物體停止旋轉。
•使用重力Use Gravity:若激活,則物體受重力影響。
•是否是運動學Is Kinematic:若激活,該物體不再受物理 引擎控制,即自身不受作用力。

插值Interpolate:用於緩解剛體運動時的抖動。

Collision Detection:碰撞檢測模式。快速移動 的剛體在碰撞時有可能互相穿透,可以設置碰撞檢測頻率, 但頻率越高對物理引擎性能影響越大。
不連續Discrete:不連續碰撞檢測。適用於普通碰撞(默 認模式)。
連續Continuous:連續碰撞檢測。
動態連續Continuous Dynamic:連續動態碰撞檢測,適用 於高速物體。

碰撞體

使剛體具有碰撞效果,可以單獨作用於物體,但是要使移動的物體具有碰撞效果 必須附加剛體組件。

分類
•靜態碰撞器Static Collider :只有碰撞器沒有剛體的物體
現象:保持靜止或者輕微移動,如:平面/樹木
•剛體碰撞器RigidbodyCollider:具有剛體和碰撞器的物體; 現象:完全受物理引擎影響。
•運動學剛體碰撞器: 帶剛體,且勾選Is Kinematic,此碰撞器 不能添加力,只能通過transform移動。

在這裏插入圖片描述
物理引擎會工作有兩個條件:
①物體A有剛體
②剛體所屬的物體A在運動

當物體A去碰撞物體B時,滿足條件,物理引擎持續檢測,直到碰撞發生。
反之,如果物體B去碰撞物體A,因爲物體B沒有剛體,如果物體A靜止,物理引擎不會工作。
在這裏插入圖片描述
只有當碰撞發生後,纔會有碰撞事件:

①void OnCollisionEnter(Collision collOther) 當進入碰撞時執行,除非重複碰撞,否則只執行一次

②void OnCollisionStay(Collision collOther) 當碰撞體與剛體接觸時每幀執行,會執行N次

③void OnCollisionExit(Collision collOther) 當停止(退出)碰撞時執行,除非重複碰撞,否則只執行一次

同時,該碰撞事件的腳本可以掛載物體A上,也可以掛載物體B上。

在這裏插入圖片描述

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] 第一個接觸點
    }
}

在這裏插入圖片描述
所以參數 collision代表的是被撞的那個物體的碰撞器。

碰撞發生的必備條件:
① 物體有剛體
②該物體在運動
③兩者都具有碰撞體

觸發器

帶有碰撞器組件,且Is Trigger屬性被勾選的物體。
•現象:無碰撞效果。
一但點選Is Trigger,該碰撞器就變成了觸發器,沒有碰撞效果。
在這裏插入圖片描述

void OnTriggerEnter(Collider cldOther) 當Collider(碰撞體)進入觸發器時執行

void OnTriggerStay(Collider cldOther) 當碰撞體與觸發器接觸時每幀執行

void OnTriggerExit(Collider cldOther) 當停止觸發時執行
在這裏插入圖片描述

觸發器產生的必備條件:
①兩者一個具有碰撞體組件,另一個具有觸發器組件
②其中之一帶有剛體組件

可見觸發器的條件比碰撞器要寬泛,沒那麼嚴格。
參數cldOther和前面的collision不同,前者就是碰撞體組件,等價於collision.collider。
一個觸發器和一個碰撞體是互斥的,有了觸發,就沒有碰撞效果,也就不會調用OnCollision系列函數。

當然一個物體可以綁多個碰撞體,比如物體A綁了兩個碰撞體,其中一個修改爲觸發器。
在這裏插入圖片描述
那麼物理引擎會分別計算:
物體A的碰撞體+剛體與物體B的碰撞體有碰撞效果。
物體A的觸發器+剛體與物體B的碰撞體有觸發效果。

適用範圍

什麼時候用碰撞體? 物體非背景,要有“阻擋”效果的時候,如牆壁,桌椅,地板等等。
什麼時候用剛體? 物體非背景,即有“阻擋”效果,又有物理受力效果。
什麼時候使用觸發器?物體可以是背景,也可以非背景,強調“接觸”效果。如生命球,能拾取的金幣等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章