我的問題看起來像這樣:我有一個靜止的物體墻和第二個正在移動射彈的物體。我希望彈丸在與墻壁碰撞時停止。但是我的嘗試以射彈穿過墻壁而告終。
只有影響射彈運動的腳本:
public Transform trans;
void Update()
{
trans.Translate(0, 0, speed * Time.deltaTime, Space.Self);
}
彈丸的所有組成部分:
墻的所有組成部分:
注意:我已經在專案設定中正確設定了圖層。
我嘗試了許多剛體、對撞機、圖層等的組合,但彈丸總是穿過墻壁。
uj5u.com熱心網友回復:
一般來說,您提供的設定是正確的。接觸的物體有一個剛體組件,你可以碰撞的物體至少有一個碰撞器(不是觸發器)。
第一個可能的問題:您的剛體設定為運動學。您是否啟用了所有碰撞模式Project Settings > Physics > Contact Pairs Mode
?
第二個問題是transform.Translate
在Update
. Translate 將忽略 physic 并在您告訴它這樣做時僅移動物件,并且Update
可能與 physic 回圈不同步,建議在其中使用FixedUpdate
. 即使使用 FixedUpdate,Translate 也不會做正確的作業。它將迫使物體移動,而物理可以抱怨或不抱怨(它可以將物體移回,出現故障,或者它可以忽略并讓物體通過)。
如Unity 檔案rigidbody.MovePosition
中所述,移動 Kinematic 剛體的正確方法是通過。對于非運動物件,您可以使用. 有些教程還教設定剛體,不建議這樣做,因為它可能會產生不良影響。如果您知道副作用并且真的想要它們,請執行此操作。AddForce
velocity
uj5u.com熱心網友回復:
我以前也有類似的問題。我可以建議銷毀彈丸嗎?然后,您將不得不使用OnCollisionEnter()
.
首先,創建一個腳本并將其附加到您的射彈游戲物件。之后,給你的墻一個標簽,比如“墻”。然后,做這樣的事情:
void OnCollisionEnter(Collision collision)
{
// Gets information about the game object the projectile collided with
GameObject objectCollided = collision.gameObject;
if (objectCollided.tag == "wall'){
// Do something with either the wall/enemy
}
// Destroy the projectile
Destroy(gameObject);
}
注意:如果目的不是破壞彈丸而是粘在墻上,我建議您使用 Raycast 檢測碰撞。Raycast 有一個 hitInfo 引數并存盤有關它擊中的游戲物件的資訊,以及光線擊中游戲物件的位置。
因此,您可以使用它來相應地移動您的彈丸。在我之前的專案中,我使用了我的彈丸的剛體組件并用來.AddForce()
將其射出,然后檢測與OnCollisionEnter()
.
也許你可以做同樣的事情,但有一個單獨的功能來消除進入碰撞時的力量。我從未嘗試過,所以我不知道它是否會起作用。
uj5u.com熱心網友回復:
Transform.Translate
覆寫統一的物理引擎。如果您想利用游戲物件的剛體和對撞機組件,您需要使用rigidbody.Velocity
or (如統一在檔案中推薦的那樣)rigidbody.AddForce
,并確保您在兩個剛體上都設定IsKinematic
為False
,以便它們可以在物理上相互互動。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/511529.html
標籤:C#unity3d
上一篇:如何洗掉我的背景實體?