[Rigidbody 2D](https://docs.unity3d.com/Manual/class-Rigidbody2D.html):
允許你的游戲對象在物理引擎下運動
剛體允許你的游戲對象在物理引擎下運動。在現實途徑下剛體可以接受力和力矩使物體移動。任何游戲對象必須包含剛體受重力作用下的附加力,通過腳本,或與其他物體通過NVIDIA PhysX物理引擎。 添加2D剛體后可基于腳本API施力
通常, Transform變換組件定義游戲對象(及其子游戲對象)在場景中的定位、旋轉和縮放方式。更改變換組件將更新其他組件,這樣可以更新渲染對象的位置或碰撞體所在位置之類的屬性。**2D物理引擎能夠移動碰撞體并使這些碰撞體彼此交互**,因此物理引擎需要一種方法**將碰撞體的此移動狀態傳回變換組件**。此移動以及與碰撞體的連接便是2D剛體組件的**用途**。
2D剛體組件會**覆蓋變換組件**,并將其更新為2D剛體定義的**位置或旋轉**。請注意,雖然仍然可以通過自行修改變換組件來覆蓋2D剛體(因為Unity會公開所有組件上的所有屬性) ,但是這樣會導致各種問題,例如游戲對象相互穿過或嵌入等問題以及不可預測的移動。
添加到同一游戲對象或子游戲對象的任何2D碰撞體組件都隱式附加到該2D剛體。2D碰撞體附加到2D剛體時,兩者一起移動。<span style="color:red">嚴禁使用</span>變換組件或任何碰撞體偏移來直接移動2D碰撞體;而應移動2D剛體。這樣將提供最佳性能并確保正確的碰撞檢測。連接到同-2D剛體的多個2D碰撞體不會相互碰撞。這意味著可以創建一組碰撞體來有效充當單一復合碰撞體,使所有碰撞體都與2D剛體同步移動和旋轉。
設計場景時,可自由使用默認的2D剛體并開始附加碰撞體。這些碰撞體可讓連接到不同2D剛體的所有其他碰撞體相互碰撞
**Body Type選項1(默認)**

**Body Type選項2**

**Body Type選項3**

選項:
* **<span style="color:#F2711C">Body Type</span>:** 此設置中選擇的選項會影響組件上可用的其他設置。附加到2D剛體的2D碰撞體將繼承2D剛體的Body Type
* **Dynamic**
Dynamic類型的2D剛體設計為在模擬條件下移動。這種剛體類型具有可用的全套屬性(例如有限質量和阻力) ,并受重力和作用力的影響。 Dynamic剛體類型將與每個其他剛體類型碰撞,是最具互動性的剛體類型。這是需要移動的對象的最常見剛體類型,因此是2D剛體的默認剛體類型。此外,由于具有動態性并與周圍所有對象互動,因此也是性能成本最高的剛體類型。選擇此剛體類型時,所有2D剛體屬性均可用。
請勿使用變換組件來設置Dynamic類型的2D剛體的位置或旋轉。模擬系統會根據Dynamic 2D剛體的速度對該剛體重新定位;可以通過腳本施加于剛體的力來直接更改此值,也可以通過碰撞和重力來間接更改此值。
* **kinematic**
Kinematic類型的2D剛體設計為在模擬條件下移動,但是僅在非常明確的用戶控制下進行。雖然Dynamic 2D剛體受重力和作用力的影響,但Kinematic 2D剛體并不會受此影響。因此, Kinematic 2D剛體的速度很快,與Dynamic 2D剛體相比,對系統資源的需求更低。Kinematic 2D剛體按設計應通過`Bigidbody2D.MovePosition`或`Bigidbody2D.MoveRotation`進行顯式重定位。應使用物理查詢來檢測碰撞,并通過腳本確定2D剛體應該移動的位置和方式。
Kinematic 2D剛體仍然通過速度移動,但是此速度不受作用力和重力的影響。Kinematic 2D剛體不會與其他Kinematic 2D剛體和 Static 2D剛體碰撞,只會與Dynamic 2D剛體碰撞。與Static 2D剛體(見下文)相似, Kinematic 2D剛體在碰撞期間的行為類似于不可移動的對象(就像具有無限質量) 。選擇此剛體類型時,與質量相關的屬性將不可用。
* **static**
2D剛體設計為在模擬條件下**完全不動**;如果任何對象與Static 2D剛體碰撞,此類型剛體的行為類似于不可移動的對象(就像具有無限質量) 。此剛體類型也是使用資源最少的剛體類型。Static剛體只能與Dynamic 2D剛體碰撞。不支持兩個Static 2D剛體進行碰撞因為這種剛體不是為了移動而設計的。:
* **<span style="color:#F2711C">Material</span>:**
使用此屬性可為連接到特定父2D剛體的所有2D碰撞體指定公共材質。注意: 2D碰撞體使用自己的Material屬性(如果已設置) 。如果此處或在2D碰撞體中未指定材質,則默認選項為 None (Physics Material 2D),這種情況下使用可在Physics 2D Settings窗口中(菜單: Edit > Project Settings > Physics 2D)設置的默認材質。2D碰撞體使用以下優先級順序來確定要使用的Material設置: 1.在2D碰撞體上指定的2D物理材質。2.在附加的2D剛體上指定的2D物理材質。在 hysics 2D Settings中指定的2D物理材質默認材質。提示:使用此設置確保附加到同-Static Body Type 2D剛體的所有 2D碰撞體都可使用同一材質。
* **<span style="color:#F2711C">simulated</span>:**
如果希望2D剛體以及所有附加的2D碰撞體和2D關節在運行時與物理模擬系統交互,請啟用Simulated (選中復選框) 。如果禁用此功能(取消選中復選框) ,這些組件不會與模擬系統進行交互。默認情況下會選中此框。與啟用或禁用單個2D碰撞體和2D關節組件相比,對此屬性進行更改將在內存和處理方面具有更高的效率。
**注意**:取消選中2D剛體的Simulated選項時,附加的所有2D碰撞體都會有效“隱形”,即:無法被任何物理查詢(例如Physics.Raycast)檢測到。****
* **Mass**(質量):對象的質量(默認1) 值的范圍是【0.0001~1000000】0表示無限大的質量,但是這里最小值為0.0001;由此可知,不想讓某個物體有重力,就不要給他加剛體,給他一個碰撞器
* **Use Auto Mass:**
如果希望2D剛體從其2D碰撞體中自動檢測游戲對象的質量,請選中此框,選中則**Mass**選項不可用(默認沒有選中此框)。
此項可將2D剛體的質量自動設置為與2D碰撞體質量相同的值。與2D浮力效應(Buoyancy Effector 2D)結合時,此設置尤其有用,
* **Linear Drag(線性阻尼)**
一種會影響位置移動的阻力系數(默認0),0意味著沒有阻力。
* **Angular Drag(摩擦角)**:一種會影響旋轉移動的阻力系數,0意味著沒有阻尼。注意,你不能把物體的角阻力設置為無窮大,即設置此值不能使物體停止旋轉。 (默認0.05)
* **Gravity Scale**
定義游戲對象受重力影響的程度。(默認1)
* **Collision Detection(碰撞檢測):** 用于防止快速移動的物體不經過碰撞而通過其他物體。
* **Discrete**(離散):具有2D剛體和 2D碰撞體的游戲對象在物理更新期間可以重疊或穿過彼此(如果移動得足夠快) 。僅會在新位置生成碰撞觸點。(默認此項就好,當某個剛體檢測時穿透其他剛體再選擇第二項Continuous)
* **Continuous**(連續):具有2D剛體和 2D碰撞體的游戲對象在更新期間不會穿過彼此。相反, Unity會計算2D碰撞體的第一個影響點,并將游戲對象移動到該點。請注意,此設置比Discrete耗費更多CPU時間(如果[快速]移動的對象碰撞沒有問題,請使用Discrete而不使用它)。
* **Sleeping Mode:** 定義游戲對象如何在處于靜止狀態時“睡眠”以節省處理時間。
* **Never Sleep:** 禁用睡眠(應盡可能避免此設置,否則會影響系統資源)
* **Start Awake:** 游戲對象最初處于喚醒狀態。
* **Start Asleep:** 游戲對象最初處于睡眠狀態,但可以被碰撞喚醒。(默認)
* **Interpolate(插值):** 嘗試一個選項只有當你看到你的剛體運動的跳躍。
* None(沒有插值):不應用移動平滑。
* Interpolate(插值):基于前一幀的變換平滑變換 即根據游戲對象在先前幀中的位置來平滑移動。
* Extrapolate(推算):基于下一幀的估計變換平滑變換。即根據游戲對象在下一幀中的估計位置來平滑移動。
* **Constraints(約束):** 剛體運動的限制
* Freeze Position(凍結位置 ):選擇性停止2D剛體沿世界X和Y軸的移動。
* Freeze Rotation(禁止轉向 ):選擇性停止2D剛體圍繞Z軸的旋轉。
kinematic選項特有:
* **Use Full Kinematic Contacts:** (默認未勾選)如果希望Kinematic 2D剛體與所有2D剛體類型碰撞,請啟用此設置(選中復選框) 。這種情況下類似于Dynamic 2D剛體不同之處在于Kinematic 2D剛體在接觸另一個2D剛體組件時不會被物理引擎移動,而會充當一個具有無限質量的不可移動對象 。
禁用(取消選中)此設置時, Kinematic 2D剛體僅與Dynamic 2D剛體碰撞,不會與其他Kinematic 2D剛體或Static 2D剛體碰撞(請注意觸發碰撞體是此規則的例外情況) 。這意味著不會發生碰撞腳本回調(OnCollisionEnter, OnCollisionStay, OnCollisionExit)
使用物理查詢(例如Physics.Raycast)來檢測2D剛體應該移動的位置和方式時,以及需要多個Kinematic 2D剛體相互交互時,這可能會很不方便。啟用Use Full Kinematic Contacts即可讓Kinematic 2D剛體組件以此方式交互。
Use Full Kinematic Contacts允許顯式控制Kinematic 2D剛體的位置和旋轉,但是仍然允許完全碰撞回調。在需要顯式控制所有2D剛體的設置中,使用Kinematic 2D剛體來代替Dynamic 2D剛體可保留對完全碰撞回調的支持。
## **細節:**
>[danger]* 剛體允許你的游戲對象在物理引擎控制下運動。這就為真實碰撞,大量的關節和其他非常酷的行為敞開了大門。通過添加外力操縱你的游戲對象來產生一個非常不一樣的感覺和觀感,絕對比使用Transform組件更直接。通常來說,一個對象只能存在rigibody和Transform的其中一個。
>* Transform和剛體最大的不同就是剛體通過力來驅動。剛體能夠接收力和扭矩的作用,但是Transforn不能。Transform只能單純地移動和旋轉,沒有任何物理作用。你自己嘗試一下就會注意到直觀的不一樣。添加外力或者扭矩的剛體會準確地改變對象Transform的位置和面向。這就是為什么你只能在剛體和Transform中選一個。在使用物理作用會導致碰撞和其他計算的問題因此改變Transform。
>* 剛體必須在被物理引擎影響前明確添加在你的游戲對象中。你能通過菜單的Component->Physics->Rigibody添加一個剛體組件在你的對象上。現在你的對象已經準備好了。它會在重力的作用下自然下落同時還能通過腳本接收外力,但你需要加一個Collider組件或者關節來獲得你希望它的行為。
**相關**
父級:
當一個對象在物理控制下,它會跟隨著父級移動。
編輯腳本:
用來控制你的剛體,你主要使用腳本去添加外力或扭矩。通過使用AddForce()和AddTorque()。記得你不能直接改變物件的Transform當你在使用物理效果時。
碰撞體:
碰撞體是另外一些必須添加在剛體上的組件為了允許當兩個剛體碰撞時不會穿進對方身體,這個物理引擎不能計算碰撞體除非兩個對象都有碰撞體,缺少碰撞體會穿過其他對象。
>[danger]可通過兩種方法將2D剛體標記為Static:
1、對于具有2D碰撞體組件的游戲對象,不附加任何2D剛體組件。所有此類2D碰撞體在內部均視為已附加到單個隱藏的Static 2D剛體組件。
2、對于需要附加2D剛體的游戲對象,將此2D剛體設置為Static.
方法1:是創建Static 2D碰撞體的快速方法。創建大量Static 2D碰撞體時,不為具有2D碰撞體的每個游戲對象添加2D剛體是比較容易實現的。
方法2:用于提高性能。如果需要在運行時移動或重新配置Static 2D碰撞體,該碰撞體具有自己的2D剛體時完成這些操作會更快。如果需要在運行時移動或重新配置一組2D碰撞體,則將這些碰撞體全部設為一個標記為Static的父2D剛體的子代會比單獨移動每個游戲對象更快注意:如上所述, Static 2D剛體設計為不移動,因此不會考慮相交的兩個Static 2D剛體對象之間的碰撞。然而,如果Static 2D剛體和 Kinematic 2D剛體的其中一個2D碰撞體設置為觸發,兩者就會交互作用。此外,還有一個功能可改變Kinematic剛體的交互對象(請參閱下文的Use Full Kkinematic Contacts)
- C#
- 基礎 System
- 命名規范
- 變量
- 數據類型
- 值類型
- 簡單類型
- 整數類型
- 字符類型
- 浮點類型
- 布爾類型
- 枚舉類型
- 結構體類型
- 引用類型
- 類類型
- 對象(Object)類型
- 字符串(String)類型
- 方法屬性
- 動態(Dynamic)類型
- 數組類型
- 接口Interface
- 委托類型delegate
- 裝箱和拆箱
- 指針類型
- 值類型與引用類型的區別
- Var類型
- 類型轉換
- 隱式轉換
- 顯式轉換
- 常量
- 常用函數
- 流程控制
- 循環
- 跳轉語句
- 數組
- 數組查找
- 添加組元素
- 復制與克隆數組
- 刪除數組元素
- 數組排序與反轉
- 數組排序
- 冒泡排序
- 直接插入排序
- 選擇排序法
- 數組對象
- 哈希表
- 其他
- 遞歸
- 屬性與方法及方法重載
- 結構與類
- 類
- 構造函數與析構函數
- 繼承
- 多態
- 泛型
- demo
- 漢字字符(串)比較
- 創建指定大小文件與讀取大文件
- 小截屏軟件功能
- 子窗體返回主窗體
- 判斷是否為數字
- 獲得字符串實際長度(包括中文字符)
- unity
- script腳本
- 腳本的生命周期
- 調試
- Unity Manual5.4
- Unity手冊
- Working In Unity
- Unity 2D
- Graphics(圖形)
- Physics(物理系統)
- Scripting(腳本)
- Multiplayer and Networking(多玩家和聯網)
- Audio(音頻)
- Animation(動畫)
- UI
- Navigation and Pathfinding(導航和尋路)
- Unity Services(Unity服務)
- Virtual Reality(虛擬現實VR)
- Open-source repositories(開源代碼庫)
- Platform-specific(特定于平臺的信息)
- Legacy Topics(舊版主題)
- Expert Guides(專家指南)
- 重要的類
- Object
- GameObject(重要)
- Component
- Transform(重要)
- Rigidbody
- ParticleSystem
- Behaviour
- Camera
- Animator
- AudioSource
- Animation
- AudioListener
- Light
- MonoBehaviour事件行為(重要)
- Terrain
- Collider
- Renderer
- Texture
- Mesh
- material
- Time
- Prefab預制件
- 功能demo
- 層級未知查找子物體
- 查找hp最小的敵人
- 查找最近的敵人
- 小項目之英雄無敵
- 界面操作
- Scene窗口
- Game窗口
- project窗口
- Hierarchy窗口
- 動畫
- Animation重要API
- 2D
- Sprite(creator) Sprite Renderer
- Sprite Editor
- Sprite Packer(遺留功能)
- 排序組組件
- 切片精靈
- 精靈遮罩
- 精靈圖集
- Tilemap
- 2D物理系統
- 全局設置(Project setting)
- 2D剛體(Rigidbody 2D)
- 碰撞(事件)消息
- 2D碰撞體(Collider 2D)
- 2D圓形碰撞體(Circle Collider 2D)
- 2D盒型碰撞體(BoxCollider 2D)
- 2D多邊形碰撞體( Polygon Collider 2D)
- 2D邊界碰撞體(EdgeCollider 2D)
- 2D膠囊碰撞體(CapsuleCollider 2D)
- 2D復合碰撞體(Composite Collider 2D)
- 2D物理材質(摩擦和彈性)(Physics Material 2D)
- 2D關節
- 2D距離關節(Distance Joint 2D)
- 2D固定關節(Fixed Joint 2D)
- 2D摩擦關節(Friction Joint 2D)
- 2D鉸鏈關節(Hinge Joint 2D)
- 2D相對關節(Relative Joint 2D)
- 2D滑動關節(Slider Joint 2D)
- 2D彈簧關節(Spring Joint 2D)
- 2D目標關節(Target Joint 2D)
- 2D車輪關節(Wheel Joint 2D)
- 2D恒定力(Constant Force 2D)
- 2D 效應
- 2D區域效應(AreaEffector 2D)
- 2D浮力效應(BuoyancyEffector 2D)
- 2D點效應(PointEffector 2D)
- 2D平臺效應(PlatformEffector 2D)
- 2D表面效應(SurfaceEffector 2D)
- 精靈動畫
- 2D動畫事件
- 重要類
- rigidbody2d
- 小竅門
- Unity中如何查找腳本掛載在哪個物體上