2016-09-26 77 views
-1

我有一個Rigidbody附加到我的角色控制器和我的敵人。我希望敵人能夠包圍我,讓我陷入困境而不能移動,所以我相應地設置了羣衆財產。與剛體相撞將空氣中的玩家對象相撞

只有一個小問題 - 如果我沒有把我的質量設定得足夠高,當敵人與我相撞的那一刻,我的玩家就會飛入空中。如果我不把敵人的質量定得足夠高,我就可以直接穿過他們。我該如何解決這個問題?以下是播放器的移動代碼:

using UnityEngine; 
using System.Collections; 

public class CharController : MonoBehaviour { 

    public float speed; 

    void Start() { 
     Cursor.lockState = CursorLockMode.Locked; 
    } 

    void Update() { 
     float translation = Input.GetAxis ("Vertical") * speed; 
     float strafe = Input.GetAxis ("Horizontal") * speed; 
     translation *= Time.deltaTime; 
     strafe *= Time.deltaTime; 

     transform.Translate (strafe, 0, translation); 

     if (Input.GetKeyDown ("escape")){ 
      Cursor.lockState = CursorLockMode.None; 
     } 
    } 
} 
+0

如果您包含當前的移動代碼,這對用戶會有所幫助,因爲這可能是解決方案的一個組成部分。 – Serlite

+0

@Serlite我編輯它以包含我的鍵盤移動腳本。該腳本放置在膠囊碰撞器上。敵人也有一個navmesh組件連接到它。 –

+1

您是否考慮過使用像「AddForce()」這樣的物理方法,而不是直接翻譯?你得到這些巨大的物理過度反應的原因是因爲翻譯正在將玩家移動到物理計算之間的敵人身上,從而產生了一個大的反彈力量。如果您使用物理模擬間接移動播放器,則這些問題應該消失。 – Serlite

回答

2

這裏的問題是,你正在使用Transform.Translate()移動您的播放器對象。因此,在物理計算之間,玩家將被移動到與敵方物體進行裁剪 - 所以當下一次物理計算出現時,會有一個大量的排斥力來糾正這種情況。這是發送你的球員飛行。

更好的選擇是使用Rigidbody.AddForce()(或其中的一個變體)間接移動播放器對象。這允許在物理計算期間考慮玩家對象的移動,因此它可以在敵方物體開始剪切之前與敵方物體相撞並被其阻擋。

如果您檢索和存儲到播放器的Rigidbody一個變量的引用,那麼你可以用一些替代Translate()這樣的:

rigidbody.AddRelativeForce(strafe, 0, translation); 

希望這有助於!如果您有任何問題,請告訴我。

+0

如果試圖執行準確的物理(包括碰撞),不通過力模型是非常邪惡的。它永遠不會看起來不錯,或者工作得特別好,而且你會得到所描述的各種行爲。 – PompeyPaul

1

確保已選中IsKinematicUseGravity可以檢查或不依賴於你的情況。

這樣,你剛體不會受到力,碰撞或關節的影響,並且完全受你腳本的控制。但也許他們會失去檢測碰撞的能力,但我不太確定,我還沒有測試過。

如果是這種情況,請取消選中IsKinematic,而是選中FreezeRotationFreezePosition。這樣,你可以撤銷對物理位置和旋轉的控制。您將手動操作腳本中的位置&(使用CharacterController)。

參考文獻:

https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html https://docs.unity3d.com/Manual/class-Rigidbody.html