unity3d-物理引擎


簡介

       物理引擎就是在游戲中模擬真實的物理效果,比如,場景中有兩個立方體對象,一個在空中,一個在地面上,在空中的立方體開始自由下落,然后與地面上的立方體對象發生碰撞,而物理引擎就是用來模擬真實碰撞的效果。

       如果需要讓模型感應物理引擎的效果,需要將剛體組件或角色控制器組件添加至該對象中。

剛體(Rigidbody)

       剛體是一個非常重要的組件,新創建的物體默認情況下是不具有物理效果的,而剛體組件可以給物體添加一些常見的物理屬性,比如物體質量、摩擦力和碰撞參數等,這些屬性可用來真實的模擬該物體在3D游戲世界中的一切行為。

     下面我們在unity中創建一個plane(平面),兩個cube(立方體),

     藍色cube默認狀態是沒有rigidbody,

     給紅色cube添加剛體組件,選擇要添加剛體的對象,

通過 “Component—>Physics—>Rigidbody”或者在Inspector窗口,選擇“AddComponent—>Physics—>Rigidbody ”

 

 

  運行后可以發現,添加了剛體的紅色cube感應到了物理效應,會從空中落下。而藍色cube依然是靜止不動的

 

 

  可以看到Inspector可以看到Rigidbody包含的屬性,簡單的看下幾個屬性的含義,詳細的可以看手冊

 

 

 

   力是物理學中一個非常重要的元素,其種類有很多,剛體組件可以受力的作用,

比如給剛體施加一個X軸方向的力,那么該剛體綁定的物體將沿X軸方向向前移動,

這就好比用力將物體仍出去一樣,該物體會以拋物線的形式移動,而不是呆板的做勻速平移 。

 

力的方式有兩種

     1:普通力,通過設定里的方向和大小,相當於把力施加在物體的重心上。

     2:位置力,需要設定目標點的位置,該物體就朝向這個目標位置施加力。

AddForce和AddForceAtPosition

還是拿之前的那個列子做演示。在Hierarchy視圖中創建兩個Sphere,紅色的添加普通力,白色的添加位置力

紅色Cube當作位置力的目標對象。即向該位置發射一個位置力

 

1:創建腳本。定義三個變量:

1     public GameObject whiteSph; //白色球體 施加普通力的對象
2     public GameObject redSph; //紅色球體 施加目標位置力的對象
3     public GameObject targetPos;//目標對象

 

 

2:GUI繪制兩個Button,分別控制“普通力”和“位置力”邏輯代碼

 1 void OnGUI()
 2     {
 3         if (GUILayout.Button("普通力"))
 4         {
 5             redSph.rigidbody.AddForce(0,1000,0); //Y軸上力的大小為1000。即向上
 6         }
 7         if (GUILayout.Button("位置力"))
 8         {
 9             //算出whiteSph到targetPos的目標向量
10             Vector3 c = targetPos.transform.position - whiteSph.transform.position;
11 
12             //在c位置施加一個位置力,targetPos將會向這個位置移動
13             whiteSph.rigidbody.AddForceAtPosition(c, targetPos.transform.position, ForceMode.Impulse);
14         }
15     }

 

3:腳本掛載到Camera上。給變量拖拽賦值。運行看效果.

 

  運行游戲,剛體會受物理效應會往下落

  1:當單擊普通力。紅色球體會往天空彈起,因為它有剛體。最終還是外往下落。

  2:當單擊位置力。白色球體會朝着紅色方塊位置添加力。最終移動到這個位置。

  3:當改變紅色cube坐標后。目標位置也跟着移動。

說了這么多。那AddForce和AddForceAtPosition到底有什么區別呢?我也是跟着學。跟着看手冊,

也許只有等以后知道了它運用在什么邏輯代碼中。就自然而然了解了。

手冊上的解釋:

1: 添加一個力到剛體。作為結果剛體將開始移動。

2:在position位置應用force力。作為結果這個將在這個物體上應用一個力矩和力。

力矩?是什么。這個我也犯迷糊。不過在手冊手看到這樣一個函數

AddTorque:添加一個力矩到剛體。作為結果剛體將繞着torque軸旋轉。

手冊上函數有很多。有興趣的可以自己去測試,等下把手冊給大家。我也是網上下載的。

 

碰撞與休眠

   剛體與物體之間是存在碰撞的,一旦剛體開始移動,就可以在系統方法中監聽剛體的碰撞狀態,碰撞分為三種:

   1:進入碰撞

   2:碰撞中

   3:碰撞結束

我們通過一張圖片來了解

 

 

 

碰撞器

  游戲對象如果需要感應碰撞,那么必須給其添加碰撞器,默認情況下,創建游戲對象時,會自動將碰撞器添加到其中。

  unity一共為對象提供了6種碰撞器

  1:Box Collider         盒子碰撞器

  2:Sphere Collider     球體碰撞器

  3:Capsule Collider    膠囊碰撞器

  4:Mesh Collider        網格碰撞器

  5:Wheel Collider      車輪碰撞器

  6:Terrain Collider     地形碰撞器

 

 

在碰撞器之間可以添加物理材質,用於設定物理碰撞后的效果,它將將開始

相互反彈,反彈的力度是有物理材質決定的。

 

 

unity標准資源包中提供了一些物理材質的資源,我們可以導入到當前工程中

 

導入成功后:

 

好。我們可以看出之前的游戲中,球體下落是立即禁止的。

現在給之前的Plane添加彈性材質,運行游戲

 

可以看到剛體在彈性材質的作用下。會反彈

 

碰撞檢測

 1:兩個游戲對象必須有Collider

 2:對於雙方都要檢測的物體,至少其中一個必須是剛體。

 3:如果剛體是運動的,那么在雙方都沒有設置碰撞體的 Is Trigger屬性的時候,

     雙方都可以通過OnCollisionEnter函數檢測碰撞

4:如果至少一個碰撞體Is Trigger被設置,那么雙方可以通過OnTriggerEnter檢測碰撞

 

剛接觸unity3d不久。這是記錄下今天學習的知識,有什么不對的地方請多多指教!!
 
unity手冊下載

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM