天天看點

【Unity】第11章 第三人稱角色控制器和碰撞體

分類:Unity、C#、VS2015

建立日期:2016-05-02

一、簡介

第三人稱視角控制器涉及的相關概念有:

1、剛體(Rigidbody)。

2、碰撞體(Collider)。包括球體碰撞體(Sphere Collider)、箱體碰撞體(Box Collider)、網格碰撞體(Mesh Collider)、實體材質(Physics Material)、鉸鍊關節(Hinge Joint)、彈簧關節(Spring Joint)等。

Unity内置了 NVIDIA PhysX 實體引擎。要控制場景中的實體對象,隻需對該對象添加剛體 (Rigidbody)。執行此操作後,該對象就會受重力的影響,而且還可以将該對象與世界坐标系中的其他對象進行碰撞檢測。

二、本章要點

1、剛體

剛體 (Rigidbody) 是以實體方式模拟的對象。可将剛體 (Rigidbody) 用于玩家可以四處推動的事物(例如闆條箱或松散對象),或通過編寫腳本向剛體 (Rigidbody) 應用力來直接移動它。

如果對非運動學剛體 (non-Kinematic Rigidbody) 進行變換,則可能不會與其他對象正确碰撞,是以應通過對剛體 (Rigidbody) 應用力和扭矩來移動它。另外,還可以向剛體 (Rigidbody) 添加關節 (Joint) 以使行為更複雜。例如,可以建立具有實體門,或建立具有搖擺鍊條的起重機等。

還可使用剛體 (Rigidbody) 使車輛顯得生動,例如可以用一個剛體、四個車輪碰撞體 (Wheel Collider) 以及一個基于使用者輸入應用車輪旋轉力的腳本來建立汽車。

可以通過從腳本向剛體 (Rigidbody) 應用力來建立飛機。

剛體 (Rigidbody) 最常與基元碰撞體 (Primitive Collider) 結合使用。

重要提示:

  • 絕不應一起使用父和子剛體 (Rigidbody)
  • 絕不應縮放剛體 (Rigidbody) 的父級

2、運動學剛體 (Kinematic Rigidbody)

運動學剛體 (Kinematic Rigidbody) 是指啟用了“運動學”(is Kinematic) 選項的剛體。運動學剛體 (Kinematic Rigidbody) 不受力、重力或碰撞的影響。它們通過設定變換的位置和旋轉或對其進行動畫處理來驅動,運動學剛體還可以與其他非運動學剛體 (non-Kinematic Rigidbody) 進行互動。

運動學剛體 (Kinematic Rigidbody) 可在與其他剛體 (Rigidbody) 碰撞時正确喚醒它們,并會對置于其上的剛體 (Rigidbody) 應用摩擦力。

下面是針對運動學剛體 (Kinematic Rigidbody) 的幾個使用情況的示例:

(1)希望某個對象處于實體控制下,但是其他情況下則是通過腳本或動畫進行控制。例如,可以建立一個動畫角色,其骨骼附加了與關節 (Joint) 連接配接的剛體 (Rigidbody),以用作布娃娃。大多數時候該角色處于動畫控制下,此時會建立運動學剛體 (Kinematic Rigidbody)。但是當命中它時,又希望它變為布娃娃并受實體影響。為實作此目的,隻需禁用“運動學”選項,即讓“is Kinematic”為false即可。

(2)需要某個對象可以推動其他對象、但不推動自己移動的對象。例如,如果有一個動畫平台,并且要在其上放置一些剛體 (Rigidbody) 箱體,則應使該平台成為運動學剛體 (Kinematic Rigidbody) 而不僅僅是不帶剛體 (Rigidbody) 的碰撞器 (Collider)。

(3)可能需要某個對象有一個經過動畫處理的運動學剛體 (Kinematic Rigidbody),并使用一個可用的關節 (Joint) 讓真實剛體 (Rigidbody) 跟随其後。

3、靜态碰撞元件 (Static Collider)

靜态碰撞元件 (Static Collider)是具有碰撞體 (Collider) 而不是剛體 (Rigidbody) 的遊戲對象 (GameObject)。靜态碰撞體 (Static Collider) 用于始終保持在相同的位置并且永遠不會四處移動的水準幾何結構。

既可以将網格碰撞元件 (Mesh Collider) 添加到已存在的圖形網格,例如使用導入設定 (Import Settings) 生成碰撞體 (Generate Colliders),也可以使用其他碰撞元件。

絕不應逐幀移動靜态碰撞體 (Static Collider),或者說,隻要将其設定為靜态碰撞體,它就應該從始至終都不會在場景中移動。否則就會導緻實體引擎重新進行内部計算,這種計算成本十分高昂,還會使性能顯著下降。不僅如此,基于靜态碰撞體 (Static Collider) 喚醒其他剛體 (Rigidbody) 的行為未定義,并且移動靜态碰撞體 (Static Collider) 不會對與之接觸的剛體 (Rigidbody) 應用摩擦力。

總之,凡是在場景中移動的碰撞體 (Collider) ,都應該始終将其設定為運動學剛體 (Kinematic Rigidbody),而不是将其設定為靜态碰撞體。