1.Transform組件的運動特點
使用Transform字段.Translate();
方法移動物體的位置,特點如下:
①移動的物體若沒有剛體組件,則會 直接“穿透” 場景中其他的物體模型;
②移動的物體若沒有剛體組件,則物體不會受重力影響(到達場景邊緣外,不會下落)。
③移動的物體若有剛體組件,則物體會受重力影響,偶爾會發生不規則運動和碰撞, 大部分情況下會直接“穿透” 場景中其他的物體模型。
因為Translate則是直接的位置position賦值,會破壞剛體環境。
而剛體方法則會模擬物理狀態來達到一些接近于現實世界的物理效果。
2.剛體組件簡介
剛體簡介
剛體:Rigidbody,屬于物理類組件。
作用: 添加了剛體組件的游戲物體,就有了重力,就會做自由落體運動。也就意味著可以像現實中的物體一樣運動。給物體添加剛體組件
先選中游戲物體-->菜單Component-->Physics-->Rigidbody剛體組件屬性
Inspector 面板中
屬性 | 詳情 |
---|---|
Mass[質量] | 設置物體的質量,也就是重量。質量單位是KG。 |
Drag[阻力] | 空氣阻力,0 表示無阻力,值很大時物體會停止運動。 |
Angular Drag[角阻力] | 旋轉時受到扭曲力時的空氣阻力,0 表示無阻力,值很大時物體會停止運動。 |
Use Gravity[使用重力] | 是否使用重力。 |
角阻力測試方法:
將兩個物體放置在空中,并且設置剛體,然后下方物體設置空氣阻力為5,讓其下降慢些。然后分兩次設置角阻力為 0 和 10。會發現角阻力越大,碰撞后的物體旋轉的速度越來越慢。
2.剛體的幾個相關方法
2.1.MovePosition()
-
相關方法
Rigidbody字段.MovePosition( Transform字段.position + Vector3);
:使用剛體方法移動物體的位置。
但是由于 MovePosition 也是直接修改位置。所以速度過快還是會發生穿模。
注意: 同時該變量也要先被賦值
Rigidbody字段 = gameObject.GetComponent<Rigidbody>();
其次
使用剛體移動物體,物體是只能根據世界坐標系的方向移動的。
使用剛體移動物體,物體會觸發物理相關的事件。
-
參數
MovePosition 中的 參數 要使用 “當前position”+ Vector3 的方式。
所以要先用Transform字段 = gameObject.GetComponent<Transform>();
獲取并儲存組件信息,再使用Transform字段.position
——屬性當前物體的位置。
其中MovePosition()方法也可以用 Translate() 方法改變運動速度的格式來改變速度——*幾倍
,其中 幾倍 也不能為 double 。
-
特點
使用Rigidbody變量.MovePosition( Transform變量.position + Vector3.方向);
移動物體,特點如下:
①速度慢時會與場景中的物體發生碰撞。速度太快時,會直接穿透物體。
②MovePosition直接改的是位置。 所以還是會發生穿模現象。
③會模擬物理狀態來達到一些接近于現實世界的物理效果。
④物體是只能根據 世界坐標系 的方向移動的。
⑤剛體要配合碰撞器使用
移動方式最好用加力的方式——AddForce方法
2.2.AddForce()
作用
給 剛體 施加一個力,讓剛體按 “世界坐標系” 進行運動。代碼
Rigidbody字段.AddForce(Vector3,ForceMode);
Vector3:力的方向和大小,也可以通過 * 幾倍
改變力的大小;
ForceMode:力的模式[enum 類型]:一個枚舉類型
-
ForceMode 參數
類型為枚舉類型,以什么樣的方式添加力給剛體。
枚舉值說明:
枚舉值 | 說明 |
---|---|
Acceleration | (加速度) |
Force:(力) | 這種模式通常用于設置真實的物理 |
Impulse:(沖擊力) | 這種模式通常用于瞬間發生的力 |
VelocityChange | (速度的變化) |
2.3.AddRelativeForce()
作用
給剛體添加一個力,讓剛體按 “自身坐標系” 進行運動。代碼
Rigidbody字段.AddRelativeForce(Vector3,ForceMode);
Vector3:力的方向和大小,也可以通過 * 幾倍
改變力的大小;
ForceMode:力的模式[enum 類型]。
-
AddRelativeForce()實例演示
編寫下面這個腳本給一個Sphere 物體,運行并切換Scene 視圖選中該物體,觀察它的坐標系。
void Update()
{
m_Rigdbody.AddRelativeForce(Vector3.forward , ForceMode.Force);
}
因為物體是滾動前進的,所以自身坐標系會不斷變化,使它來回滾動,由于力很小只有一倍,所以到最后幾乎停止。(注意看藍色的軸向最后垂直指向地板)
2.4.FixedUpdate()固定更新方法。
-
所有和物理相關的操作 ,代碼都要寫在 FixedUpdate() 方法體內。
固定默認的更新時間間隔是0.02 秒,1 秒執行50 次。
可以在 Fixed Timestep 中 修改, 步驟如下:
Edit-->Project Settings-->Time 面板中的 Fixed Timestep 參數設置。
Fixed Timestep 而Update() 方法是每幀執行一次。
畫面每渲染完一次,就是一幀,而每幀的時間是不固定的,因為畫面渲染的速度是不固定的。
其次,若在 Update() 方法中執行物理操作,會出現卡頓的情況。