什么是Collider
碰撞器組件在Unity引擎中觸發(fā)物理碰撞的最基本的條件。
可以這樣說坑律,假如一個游戲中沒有物理碰撞系統(tǒng)是不可能的。
什么是Rigidbody
通過物理模擬的控制對象的位置锌妻。
Rigidbody組件添加到一個對象將其運動的控制下統(tǒng)一的物理引擎贮懈。即使沒有添加任何代碼,Rigidbody對象將由重力向下拉,將反應與傳入的對象如果正確的對撞機碰撞組件也存在。
Rigidbody也有腳本API,允許您力量應用于對象和物理現(xiàn)實的方式控制它断部。例如,一輛汽車的行為可以指定在力量方面應用的輪子猎贴。鑒于這種信息,物理引擎可以處理大多數汽車運動的其他方面,所以它將加速實際和正確應對沖突。
通常會在腳本的FixedUpdate函數中改變Rigidbody設置。原因是防止在更新時時間不配合幀更新的步驟她渴。
FixedUpdate稱為每個物理之前立即更新,所以任何更改將會有直接處理达址。
開始使用Rigidbody時常見的問題是,游戲中模擬的物理系統(tǒng)似乎在“慢運動”運行。這實際上是由于規(guī)模用于您的模型趁耗。默認的重力設置假設一個世界單元對應于一米的距離沉唠。與非現(xiàn)實的游戲,是沒有多大的區(qū)別,如果您的模型都是100單位長但使用物理時,他們將被視為非常大的對象。如果大規(guī)模用于對象應該是小,他們似乎會非常緩慢——物理引擎認為他們非常大對象摔倒非常大的距離苛败÷穑考慮到這一點,一定要保持你的對象在現(xiàn)實生活中或多或少的規(guī)模(所以汽車應該大約4單位= 4米)。
Collider的用法
碰撞器常用的方法
OnCollisionEnter
//當另一個游戲對象的剛體或者碰撞器罢屈,碰撞到本游戲對象的碰撞器組件時嘀韧,會調用這個方法...Collider.OnCollisionEnter(Collision)
例如:
voidOnCollisionEnter(Collision collision) {
//遍歷碰撞到該游戲對象的碰撞器組件的所有對象...
foreach(ContactPoint contactincollision.contacts) {
Debug.DrawRay(contact.point, contact.normal, Color.white);
}
}
OnCollisionExit
//當另一個游戲對象已經離開當前游戲對象的剛體或者是碰撞器組建時會調用這個方法...
Collider.OnCollisionExit(Collision)
OnCollisionStay
//當另一個游戲對象的碰撞器一直停留在當前游戲對象上的剛體或者碰撞器時,會調用這個方法...
Collider.OnCollisionStay(Collision)
注意:當把碰撞器Collisider組件的觸發(fā)器屬性設置為true時缠捌,在腳本中會調用如下三個方法
OnTriggerEnter
//需要注意的是乳蛾,觸發(fā)器回調方法的參數是Collider類型
Collider.OnTriggerEnter(Collider)
OnTriggerExit
Collider.OnTriggerExit(Collider)
OnTriggerStay
Collider.OnTriggerEnter(Collider)
Rigidbody的用法
Rigidbody的成員變量
成員變量名稱成員變量的作用
angularDrag游戲對象對應的角阻力
angularVelocity游戲對象的角速度向量
centerOfMass相對于游戲對象自身的坐標系統(tǒng)的重心位置
collisionDetectionMode游戲對象剛體組件的碰撞檢測模式
constraints用來約束游戲對象在某些條件上是可以自由跟隨Unity物理系統(tǒng)移動的
detectCollisions是否啟用游戲對象的碰撞檢測功能。默認都是開啟的鄙币。
drag游戲對象在運動時的阻力
freezeRotation用來約束游戲對象是否會被Unity物理系統(tǒng)影響自身的旋轉
isKinematic用來控制游戲對象的剛體是否會收到Unity物理系統(tǒng)的影響
mass用來表示游戲對象剛體的質量
maxAngularVelocity用來表示游戲對象的最大角速度
position游戲對象剛體組件所處在的位置坐標
rotation游戲對象剛體組件已經產生的坐標旋轉
sleepAngularVelocity用來表示當游戲對象的角速度小于臨界值時就停止肃叶。默認值0.14
sleepVelocity用來表示當游戲對象的運行速度小于臨界值時就停止。默認值0.14
useGravity用來表示當前游戲對象是否收到重力系統(tǒng)的影響
velocity用來表示當前游戲對象的剛體的運行速度
worldCenterOfMass相對于世界的坐標系統(tǒng)的重心位置
在Unity開發(fā)工具中使用到的組件接口面板
Rigidbody常用的方法
AddForce
//為rigidbody添加一個方向力十嘿。因此,rigidbody將開始移動因惭。
voidAddForce(Vector3 force, ForceMode mode = ForceMode.Force);
例如:
//在FixedUpdate函數中,為rigidbody添加10個單位向上的方向力
voidFixedUpdate() {
rigidbody.AddForce(Vector3.up * 10);
}
AddForceAtPosition
//在一個位置為Rigidbody添加一個力.
voidAddForceAtPosition(Vector3 force, Vector3 position, ForceMode mode = ForceMode.Force);
例如:
//ApplyForce函數是個自定義函數,用來對一個剛體對象施加一個方向力
voidApplyForce(Rigidbody body) {
//計算當前游戲對象和剛體參數游戲對象所處位置的方向
Vector3 direction = body.transform.position - transform.position;
//在當前游戲對象所處的位置绩衷,為body參數施加1個單位的方向力
body.AddForceAtPosition(direction.normalized, transform.position);
}
AddTorque
//為剛體組件添加一個力矩蹦魔,使該游戲對象產生旋轉的速度...
voidAddTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
例如:
//為游戲對象添加一個10個單位的旋轉力...
voidFixedUpdate() {
rigidbody.AddTorque(Vector3.up * 10);
}
形成的效果如下
AddRelativeTorque
//添加一個扭矩rigidbody相對rigidbody自身的坐標系統(tǒng)
voidAddRelativeTorque(Vector3 torque, ForceMode mode = ForceMode.Force);
例如:
//相對于游戲對象自身的坐標系統(tǒng),添加10個單位沿著y軸正向旋轉的力
voidFixedUpdate()
{
rigidbody.AddRelativeTorque(Vector3.up * 10);
}