Unity 3D物理学
-
12-11-2019 - |
質問
統一3Dの物理学に問題があります。私は壁から跳ね返って別の方向に行くために私のボールを望んでいます。ボールが壁に当たったとき、それはまっすぐに戻って跳ね返る。私はそれが壁に当たる方向に直交するように方向を変えることを試みましたが、それは方向を変えません。これにより、ボールは壁にぶつかってまっすぐに跳ね返るだけです。
第二に、時にはボールが壁を通過します。ボールに球の衝突器がある間、壁にはボックス衝突があります。それらはすべて衝突検知モードとして連続的な動的を持ちます。
解決
これは似たようなスレッドへのリンクです:
他のヒント
あなたの球とあなたの壁の間の衝突点を手に入れようとし、それからあなたの強固なベロシティを捕まえて衝突点の正常でそれを元に戻すようにしてください。
それをするスクリプトの例--->(このスクリプトを壁に壁に置く)
c#スクリプト:
public class WallBumper : MonoBehaviour
{
private Vector3 _revertDirection;
public int speedReflectionVector = 2;
/***********************************************
* name : OnCollisionEnter
* return type : void
* Make every gameObject with a RigidBody bounce againt this platform
* ********************************************/
void OnCollisionEnter(Collision e)
{
ContactPoint cp = e.contacts[0];
_revertDirection = Vector3.Reflect(e.rigidbody.velocity, cp.normal * -1);
e.rigidbody.velocity = (_revertDirection.normalized * speedReflectionVector);
}
}
.
public class WallBumper : MonoBehaviour
{
private Vector3 _revertDirection;
public int speedReflectionVector = 2;
/***********************************************
* name : OnCollisionEnter
* return type : void
* Make every gameObject with a RigidBody bounce againt this platform
* ********************************************/
void OnCollisionEnter(Collision e)
{
ContactPoint cp = e.contacts[0];
_revertDirection = Vector3.Reflect(e.rigidbody.velocity, cp.normal * -1);
e.rigidbody.velocity = (_revertDirection.normalized * speedReflectionVector);
}
}
私は最近、速度のためにターゲットを通過するロケットを通過する問題があり、継続的な動的衝突検出でさえ、私はこれをたくさん起こるのを防ぐことができなかった。
これはスクリプトを使用してこれを解決しました「DontgoTroughthings」 Wikiで投稿されました。 Unity3D.comこれは現在と前の位置との間のRaycastを使用してから、メッセージに接続されたコリッダーがOnTriggerイベントに接続されているようにフレームが終了します。それ以来毎回働いてきました。
物理学会は、他の人がドラッグを持つ複数のコンポーネントを使用することをお勧めしていると思いますが、通常は親の単一のリジッドボディだけが欲しいと思います。 transform.lookatを使用して方向の代わりにQuateRnion.Lookrotationを使用してrigidbody.velocityを使用して試して計算できます。それからVector3.Angleを使用していくらオフのものを見つけます。角度の異なるが大きいほど、力を経験してから剛体を使用する必要があります。罪(角度参照)*を使用することができます。
ここに私のロケットで使ったコードはいくつかありますが、私が固定ターゲットを指していたようにいくつかのことを置き換える必要がありますが、あなたはあなたの速度を使いたいです。
var rotationDirection = Quaternion.LookRotation(lockedTarget.transform.position - this.transform.position);
var anglesToGo = Vector3.Angle(this.transform.rotation.eulerAngles, rotationDirection.eulerAngles);
if (anglesToGo > RotationVelocity)
{
var rotationDirectionToMake = (rotationDirection * Quaternion.Inverse(this.transform.rotation)).eulerAngles.normalized * RotationVelocity;
transform.Rotate(rotationDirectionToMake);
}
.