2016-10-26 16 views
0

私はスクリプトを使って移動することができ、簡単な円持っていると、オブジェクトの同じ旋回半径:ユニティ - 異なる速度

public float speed = 3f; 
public float rotationSpeed = 200f; 

private float horizontal = 0f; 

void Update() 
{ 
    horizontal = Input.GetAxisRaw("Horizontal"); 
} 

void FixedUpdate() 
{ 
    transform.Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self); 
    transform.Rotate(Vector3.forward * -horizontal * rotationSpeed * Time.fixedDeltaTime); 
} 

問題は、私は異なる速度で同じ旋回半径を維持したいということです。 は今、私は速度も大きくなっている半径を回す増加していたとき:

like here

私はこれをどのように行うことができますか?スピードと回転スピードを上げるためにある種の比率を使用する必要がありますか?

+0

エラーを再現する完全なコード例が役立ちます。 – Aybe

+0

私は手動で速度値を変更します(たとえば、3fから5fへ)。将来的には時間とともに速度が上がります –

+0

これは微積分に関する質問です...本質的に、半径を一定に保つために、速度に関して回転速度がどのように変化するかを計算しなければなりません。 –

答えて

1

これには2つの主な方法があります。まず、速度を基準とした回転速度の変化率の微分方程式を計算し、半径を一定に保ち、回転速度を求めます。第2の、そしておそらくより簡単な方法は以下の通りである。

粒子が移動しなければならない距離は一定であり、半円形の経路を仮定すると、これはpi*rに等しく、それ以外の場合は(theta/2pi)2pi*rである。

結果として、オブジェクトの移動時間を接線速度で除した距離に等しくなるように計算すると、(pi*r)/Vとなります。

最後に、あなたのターン数は、ターンを取る必要がある時間を2 * piで割ったものに等しく、R = 2Vpi/pi*r rads^-1となります。これは2Vr rads^-1に相殺されます。

私はそれを実装する方法の正確な詳細のかどうか分からないが、それはこのようなものになります。私はこの種の行っていないとして、それはほぼ確実に私の数学をチェックする価値ですが

void FixedUpdate() 
{ 
    const int radius = 10; 
    rotationSpeed = 2 * speed * radius; 
    transform.Translate(Vector2.up * speed * Time.fixedDeltaTime, Space.Self); 
    transform.Rotate(Vector3.forward * -horizontal * rotationSpeed * Time.fixedDeltaTime); 
} 

をしばらくの間。

あなたのパスである放物線に沿った多くの点についてVector3 positionを計算し、次にFixedUpdate()ごとに次のものに移動すると、かなり優雅なやり方があります。 dxを変更すると、速度が速いほど大きく、速度は遅くなるように変更できます。これは実装が非常に簡単であるという利点がありますが、アプリケーションの物理を完全に破壊します。

+1

ありがとうございました!それは完全に動作します! –

+0

心配はいりません!副作用として、半径を公開する価値があるかもしれませんし、実行時に変更できるようにするには、それを 'const'として持たなくてもよいでしょう。ああ、ようこそ! –

関連する問題