Rigidbody組件剛體(Rigidbody)是Unity物理引擎中的重要組件,一個游戲對象添加了剛體組件以后就開始接受物理力學的影響了,比如重力、空氣摩擦力、碰撞產生的推力
Learn
相同高度不同重量物體下落時間
相同重量不同空氣阻力對物體的影響
碰撞相關的三個事件
觸發器相關的三個事件
創建一個場景Gary,新建四個Cube,一個作為地面,另外三個作為測試方塊
給Cube添加材質球(材質Material)
三個測試方塊后改名 A、B、C
給Cube添加Rigidbody組件
Mass:質量
Drag:空氣阻力
Angular Drag:角阻力
Use Gravity:使用重力
Is Kinematic:是否使用動力學
Interpolate:插值
Collision Detection:碰撞檢測
Constraints:約束
相同高度不同重量物體下落時間
修改A、B、C物體Mass的值
A:Mass修改為10
B:Mass修改為50
C:Mass修改為100
結論:不同質量的物體從同一高度自由落體至地面,到達地面的時間相同,最后的速度相同,但動能不相同,
相同重量不同空氣阻力對物體的影響
保持A、B、C物體Mass的值相同(10),修改其Drag(空氣阻力)的值
A:Drag修改為1
B:Drag修改為10
C:Drag修改為50
結論:相同重量物體,空氣阻力越小物體下落快,當物體重量和空氣阻力相同時物體會保持下落,當物體重量小於空氣阻力時,物體保持不動
(當我把B物體空氣阻力改為45時B物體還會保持下落,改為48時,B物體只會下滑0.0033高度,C物體空氣阻力為50時在空中y軸值保持不變)
給A物體添加一個RigidTest.cs腳本
AddForce()施加力
AddTorque()施加力矩
AddForceAtPosition()在指定位置施加力
//AddExplosionForce()施加爆炸力
(測試時建議將A物體重力設置低一些,按1給物體施加力,按2給物體施加力矩,按3在指定位置給物體施加力)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class RightText : MonoBehaviour { private Rigidbody r; // Use this for initialization void Start() { r = GetComponent<Rigidbody>(); } // Update is called once per frame void Update() { if (Input.GetKey(KeyCode.Alpha1)) { //施加力 r.AddForce(new Vector3(0f, 10f, 0f)); } if (Input.GetKey(KeyCode.Alpha2)) { //施加力矩 r.AddTorque(new Vector3(0f, 10f, 0f)); } if (Input.GetKey(KeyCode.Alpha3)) { //在指定位置施加力 r.AddForceAtPosition(new Vector3(0f, 10f, 0f), new Vector3(0.5f, 0.5f, 0.5f)); } } }
Collider的主要功能是進行碰撞檢測 使用剛體時,一般都會和Collider共同使用
碰撞事件
發生碰撞的兩個物體必須都帶有Collider
發生碰撞的兩個物體至少有一個帶有剛體
發生碰撞的兩個物體必須有相對運動
碰撞相關的三個事件
碰撞開始時調用一次void OnCollisionEnter(Collision other)
碰撞持續發生時調用void OnCollisionStay(Collision other)
碰撞結束時調用void OnCollisionExit(Collision other)
(A物體與地面進行了碰撞檢測)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliderText : MonoBehaviour { void OnCollisionEnter(Collision other) { print("碰撞開始!!!"); } void OnCollisionStay(Collision other) { print("碰撞中!!!"); } void OnCollisionExit(Collision other) { print("開始結束!!!"); } }
觸發器相關的三個事件
剛剛進入觸發范圍時調用一次void OnTriggerEnter(Collider other)
持續在觸發范圍內會一直調用void OnTriggerStay(Collider other)
離開觸發范圍時會調用一次void OnTriggerExit(Collider other)
勾選A物體Box Collider下的Is Trigger屬性(無視碰撞觸發函數)
(因為A物體不會和地面進行碰撞,所以就直接穿過去了)

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ColliderText : MonoBehaviour { //剛剛進入觸發范圍時調用一次_ void OnTriggerEnter(Collider other) { print("觸發開始!!!"); } //持續在觸發范圍內會一直調用_ void OnTriggerStay(Collider other) { print("觸發器檢測中!!!"); } //離開觸發范圍時會調用一次 void OnTriggerExit(Collider other) { print("觸發結束!!!"); } }
物理材質
物理材質能夠給物體添加摩擦力和彈力
物理材質只能添加到帶有Collider的對象上