2016-09-26 2 views
-1

私はキャラクターコントローラと敵にRigidbodyを付けました。私は敵が私を囲むことができるようにして、移動できなければ私を閉じ込めるようにしたいので、私はそれに応じて大量のプロパティを設定します。Rigidbodiesと衝突してプレイヤーオブジェクトを空中に投げ込む

ちょっとした問題があります。私の質量を十分に高く設定しないと、敵が私と衝突する瞬間に、プレイヤーは空中に飛ぶことになります。私の敵の質量を十分に高く設定しなければ、私はそれらを右に歩くことができます。この問題を解決するにはどうすればよいですか?

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()(またはその変形の1つ)を使用して、プレーヤーオブジェクトを間接的に移動することをお勧めします。これにより、プレイヤーオブジェクトの動きを物理計算中に考慮に入れることができるので、敵オブジェクトにクリッピングを開始する前に敵オブジェクトと衝突したり、停止したりすることができます。

あなたが取得し、プレイヤーのRigidbody変数への参照を保存する場合は、あなたのようなものでTranslate()を置き換えることができます。

rigidbody.AddRelativeForce(strafe, 0, translation); 

・ホープ、このことができます!ご質問がある場合はお知らせください。

+0

正確な物理(衝突を含む)を実行しようとすると、力のモデルを通過しないのは非常に邪悪です。それは正しく見えることは決してありません、または特にうまく動作し、あなたは説明された種類の行動に巻き込まれます。 – PompeyPaul

1

IsKinematicがチェックされていることを確認してください。 UseGravityは、状況に応じてチェックすることも、依存させることもできません。

このようにして、剛体は力、衝突または関節の影響を受けず、スクリプトを完全に制御できます。しかし、おそらく彼らは衝突を検出する能力を失うだろうが、私はそれほど確信が持てません。私はまだそれをテストしていません。

この場合、IsKinematicのチェックを外し、代わりにFreezeRotationFreezePositionにチェックを入れます。そうすれば、物理学の制御を取り消して、自分のポジションとローテーションに影響を与えないようにすることができます。スクリプトから位置&の回転を手動で操作します(CharacterControllerを使用)。

参考文献:

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