Unity 2019 射線檢測失效

  • 之前在做畢設的一個FPS遊戲時,遇到了使用射線檢測失效的情況,特此記錄以下。

前因

在FPS遊戲中,對於子彈的發射主要通過兩種方式來實現。
一種可以通過實例化子彈的GameObject對其施加物理效果從而達到發射的目的。在玩過的絕地求生中,可以清楚看到子彈的發射軌跡,這裏應該就是使用的這種方法。但是使用碰撞檢測的問題就是如果一方速度過快撞擊到另一碰撞體會有直接穿透的可能性存在(面試題),還有就是性能的消耗比較大。
而另一種則是射線檢測,通過發射出一條射線來模擬子彈的運動軌跡,這種方法相較於前者而言更節省性能,計算量下來了,但是真實性(物理軌跡)卻缺失了。

我在FPS遊戲中就使用了最簡單的射線檢測來進行子彈的發射,附上基礎代碼

void BulletFired()
{
    // 子彈減少
    weaponManager.GetCurrentSelectedWeapon().SubtractBullet();

    float shootDistance = weaponManager.GetCurrentSelectedWeapon().shootDistance;

    RaycastHit hit;
    bool isHit = Physics.Raycast(mainCamera.transform.position, mainCamera.transform.forward, out hit, 
        shootDistance, LayerMask.GetMask(LayerName.Enemy));

    if(isHit)
    {
        float damage = weaponManager.GetCurrentSelectedWeapon().damage;
        hit.transform.GetComponent<HealthScript>().ApplyDamage(damage);
    }
}

代碼其實很容易閱讀,主要就是對於Physics.Raycast()射線檢測方法的使用,可是在遊戲測試時,時常會失效。比如有的時候會觸發兩次,之後再也沒有成功過。

解決方案

起初,我通過Debug.DrawLine()方法在Scene窗口下繪製射線來觀察是不是射線的問題,結果射線是穿透敵人的,排除該種情況。
接着我去查看了Physics.Raycast()的官網API解釋,看是否是自己的參數設置有問題,經過一一排查測試,也都沒有解決。

最終我想了想是否是Unity自身的Physics中設置問題,所以去查詢了相關資料找到了問題所在,如下圖
在這裏插入圖片描述
默認情況下 Auto Sync Transforms是未被勾選上的。(從Unity 2018.2開始,Physics.autoSyncTransforms將默認設爲"False".)

這個解釋起來就是,如果禁用AutoSyncTransforms,移動碰撞體,然後調用光線投射,使光線的方向爲碰撞體新位置的話,光線投射可能不會擊中碰撞體。這是因爲光線投射會作用於物理場景的上一次更新版本,而那時物理場景還沒有使用碰撞體的新位置來更新。勾選此選項會對性能有一定的損失,這裏我沒做過測試,請根據實際情況進行勾選。

附上Unity官網解釋 Physics.autoSyncTransforms
還有查詢到的Unity平臺對其中的一些解釋性能優化

結語

Physics.autoSyncTransforms 主要是針對物理場景中是否能及時更新物體Transform中數據情況,而在使用射線檢測時碰巧遇到了這個奇奇怪怪的bug。花了好長時間找到了這個Bug…因爲使用的Unity 2019的版本,好像2018之前都是默認勾選上的…歡迎探討交流。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章