2017-12-16 22 views
1

私は四角いオブジェクトの摩擦がプレイヤーによってプッシュされた後のために作業しています。ブロックの動きは、transform.Translate(ベロシティ)の各フレームとboxCollider2Dのみを使用して、スクリプトを通して純粋に制御されます。私は、ブロックの動きを手動で制御しているため、手動で各フレームがboxcolliders2Dの物理材料の2D摩擦を働かせるように見えない理由があると推測しています。ユニティ2Dスクリプト摩擦式

基本的に、私は剛体に似た組み込みの物理学をtransform.translateを使って再現しようとしています。あるいは可能であれば組み込みの物理を使っています。これまでのところ、私はこのようなものに上陸しました。

newVelocity.x -= (1/(newVelocity.x * newVelocity.x)); 速度と各フレームが0になるまで短くするために、フレームを短くしようとしました。明らかに、velocity.xが10進数になると、これは分断されます。私は剛体に似た摩擦を達成するために何をしなければならないのか分かりませんが、最初は少し減速し、その後停止するにつれてはるかに速くなります。すべての助けがありがとう、事前に感謝!

newVelocity.x -= (1/(newVelocity.x * newVelocity.x)); 
if(Mathf.Sign(previousVelocity.x) != Mathf.Sign(newVelocity.x)) { 
    newVelocity.x = 0f; 
} 

一つのことは、しかし、通常のことである。そのような符号変化、とき

+0

、より効率的でしょうか?それはあなたに摩擦、重力などを与えます。 – EvilTak

答えて

3

あなたが前と速度の変化を計算した後、速度の兆候を比較し、ゼロに速度を設定することができます摩擦は、上記の式を用いて計算されていない、次のように計算されています:

newVelocity.x -= frictionCoefficient*Time.fixedDeltaTime; 

と速度が低い場合にはあなただけ言うことができるようこれで、あなたはそれがだ、前の速度に速度を比較する必要はありませんゼロ。あなたががしたい場合、あなたはまだ前の速度記号のものを比較することができますが、手動でなぜ `Rigidbody2D`を使用し、その速度を変更しないで、とにかく速度を使用しているので、これはおそらく

if(newVelocity.x < 0.01f) { 
    newVelocty.x = 0f; 
}