我們在開發(fā)的時候會遇到這個問題:兩個帶有剛體和collider的靜止物體相互接觸,在掛有OnCollisionStay()函數(shù)中debug,只有程序剛運行的時候會有二十多個log,之后就再也沒有輸出。原以為是unity版本bug,后來查詢資料發(fā)現(xiàn)這是unity的優(yōu)化機制。
When a Rigidbody moves at a slower speed than the Sleep Threshold (see the Physics Project Settings), Unity sets the Rigidbody to “sleep”, which means that the physics system does not include it in physics calculations. When a sleeping Rigidbody receives a collision or force, Unity “wakes up” the Rigidbody and continues to include it in physics calculations.
當剛體的移動速度低于休眠閾值(在project setting里),
文章來源:http://www.zghlxwxcb.cn/news/detail-653167.html
unity就讓此剛體休眠,不在將對他進行物理計算,節(jié)省性能。當休眠的剛體接收到碰撞或者外力,unity就喚醒剛體開始繼續(xù)計算了。所以就不難理解了,上面的測試log只有二十多個。此種狀況見于傳送帶傳送物體。傳送帶本質(zhì)上是靜止的,只是貼圖做移動表現(xiàn),所以解決方案就是在update里寫移動控制,在OnCollisionEnter,OnCollisionExit兩個函數(shù)里收集在傳送帶上的物體。文章來源地址http://www.zghlxwxcb.cn/news/detail-653167.html
void Update()
{
//在Update里控制移動吧 因為傳送帶可能停止 停止剛體就會休眠不會觸發(fā)stay函數(shù) 實際上傳送帶沒有動的行為 觸發(fā)不了喚醒
if (Speed > 0)
{
AllObjects.ForEach(x=>x.transform.Translate(moveDir * Time.deltaTime * Speed, Space.World));
}
}
到了這里,關(guān)于Unity3D開發(fā)之剛體休眠問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!