2016-11-15 28 views
2

我需要一些轉換附帶撞機移動到特定位置,然後檢查是否其中一人被擊中光線投射。光線投射的瞬間感動撞機

我已經做了用簡單的方式(僞代碼):

foreach(object in objects){ 
    actual_position = object.transform.position 
    object.transform.position = object.new_position 
} 
if(Physics.Raycast(...)) objectHit(); 
// Then I revert each of them them back to their actual_position 

(測試之間的相同位置的每個對象)用同樣的情況下測試多次後,光線投射有時會錯過,有時不(約50/50)。

做了一些研究,發現在光線投射文檔頁面:

如果從腳本或動畫中移動對撞機,需要有 被至少一個FixedUpdate執行,使得物理庫能 更新其數據結構,在Raycast將撞擊對撞機 它是新的位置。

因此,我平息了我的憤怒,開始尋找解決方案。 這個討論有使用協程,等待下一步打勾的方式:我affraid它不會爲我工作,因爲我需要的對象要回自己的真實位置瞬間 Raycast doesn't work properly

。 這個過程每幀可能發生多次(每次玩家發射他的武器)

有沒有辦法強制碰撞器更新?

如果不是......我應該讓我自己的光線投射和對撞機? :(

感謝

+1

您是否嘗試過使用類似'Bounds.IntersectRay'?如果你的物體上有一個簡單的對撞機(或者你的raycast不需要100%準確),那麼你可以使用'object.GetComponent ().bounds'獲得邊界,並且將邊界對象移動到新的位置,檢查它,然後只在對象不移動時才移動對象,這樣做的性能也會比移動兩次更好,因爲如果它不應該移動它,https: //docs.unity3d.com/ScriptReference/Bounds.IntersectRay.html –

+0

看起來像一個聰明的解決方案,我的對撞機目前是簡單的膠囊,但我想這也適用於更復雜的MeshCollider。我看到的唯一問題是,我將不得不測試每個對象,並確保它們和射線源之間沒有隔離牆。這比投射光線投影更復雜,但爲什麼不呢。非常感謝你的幫助。 – FLX

+0

看着你鏈接的答案我在想,也許你可以嘗試使用'yield return new WaitForFixedUpdate();',因爲它會在每次物理更新之前調用? – Kardux

回答

0

也許你可以試試這個(添加到您的僞代碼):

foreach(object in objects) 
{ 
    actual_position = object.transform.position; 
    object.transform.position = object.new_position; 

    StartCoroutine(CheckToRevertOnNextFixedUpdate(object, actual_position)); 
} 

IEnumerator CheckToRevertOnNextFixedUpdate(object, actual_position) 
{ 
    yield return new WaitForFixedUpdate(); 

    if(Physics.Raycast(...)) objectHit(); 
    // Then I revert each of them them back to their actual_position 
} 

本質上講,這延遲的每個對象檢查下一FixedUpdate() - 和恢復我希望這不是過於複雜,因爲你只需添加幾行代碼

我還假設移動對象的位置爲1 FixedUpdate()框架將不會有一個視覺效果物體被傳送到新的位置 然後回來。但是,您始終只能移動碰撞器,然後在固定更新()後移動其餘的變換。

+0

這就是他們在鏈接線程中的表現,但如果其他玩家在移動時射擊,actual_position可能是錯誤的(我對此有何看法?)。 Paradox的解決方案在性能方面似乎更好 – FLX

+0

@FLX使用協程的想法與該線程相似,但細節有所不同,適用於您的上下文。如果其他玩家在移動時發射,則無關緊要,因爲碰撞位置在下一個FixedUpdate()中尚未更新。是的,如果您可以將碰撞形狀逼近邊界框,並且如果這樣做的過程不會產生顯着的開銷,Paradox的解決方案可能會更有效率 – Lincoln