2016-09-15 18 views
0

非常に単純な移​​動スクリプトがオブジェクトに添付されています。このスクリプトを使用すると、オブジェクトを勢いで上下左右に動かすことができます。昨夜、私はスクリプトが問題なく動作していると思った。私はオブジェクトの無限に小さな動きに気付きましたが、オブジェクトとして単純にフレームごとに描画されるか、コードによって「動かす」ように破棄しました。Unity C#Time.deltaTimeバグ

しかし、今日私は家に帰って、それを解雇し、オブジェクトはすぐに右に跳び上がり、非常に速く動いた。私が何かを変えなかったので、私が狂ったようにいくらかのデバッグと感覚を覚えた後、私のラップトップが差し込まれていないことに気付き、マシンのパワーを落として、バグの原因になるかもしれません。

私はこのコードを試してみましたが、改善のためにTime.Deltaを追加したり削除したりしましたが、問題を解決できないようです。すべてのTime.deltaTimesを削除すると、ずっと悪化しますが、どこにでも置いて問題を解決することはできません。

時間の問題が私に問題を通知する原因となったが、実際の問題が動きコードのどこかにある可能性があると私は思っている。私がボタンを押していなくても、 Y軸はif、else、else if文で問題になるかもしれないと私に貸し出しています。

ご協力いただければ幸いです。

私のコードは以下の通りです:私に

float speedHorz = 0;  //Horizontal starting speed. 
float maxspHorz = 5;  //Horizontal Max speed. 
float speedVert = 0; 
float maxspVert = 5; 

float acceleration = 8; //How fast the object will reach maximum speed. 
float deceleration = 12; //How fast the object will return to 0. 

void Update() 
{ 
    playerMove(); 
} 

public void playerMove() 
{ 
    //Up and Down, Acceleration 
    if ((Input.GetKey("s")) && (speedVert < maxspVert))      //If you press S and Verticl Speed is less than the max... 
    { 
     speedVert = speedVert - acceleration * Time.deltaTime;    //Lower speed by acceleration, move down... 
    } 

    else if ((Input.GetKey("w")) && (speedVert > -maxspVert)) 
    { 
     speedVert = speedVert + acceleration * Time.deltaTime; 
    } 

    //Up and Down, Deceleration 
    else 
    { 
     if (speedVert > deceleration * Time.deltaTime) 
     { 
      speedVert = speedVert - deceleration * Time.deltaTime; 
     } 

     else if (speedVert < deceleration * Time.deltaTime) 
     { 
      speedVert = speedVert + deceleration * Time.deltaTime; 
     } 

     else speedVert = 0 * Time.deltaTime; 
    } 

    //Left and Right, Acceleration 
    if ((Input.GetKey("a")) && (speedHorz < maxspHorz))     //If you are pressing the "a" key and speed is less than max speed... 
    { 
     //Move Left 
     speedHorz = speedHorz - acceleration * Time.deltaTime;   //Accelerate negatively on the X axis, ie Move Left. 

    } 

    else if ((Input.GetKey("d")) && (speedHorz > -maxspHorz)) 
    { 
     speedHorz = speedHorz + acceleration * Time.deltaTime; 
    } 

    //Left and Right, Deceleration 
    else 
    { 
     if (speedHorz > deceleration * Time.deltaTime) 
     { 
      speedHorz = speedHorz - deceleration * Time.deltaTime; 
     } 

     else if (speedHorz < deceleration * Time.deltaTime) 
     { 
      speedHorz = speedHorz + deceleration * Time.deltaTime; 
     } 

     else speedHorz = 0 * Time.deltaTime; 
    } 

    transform.position = new Vector2(transform.position.x + speedHorz * Time.deltaTime, transform.position.y + speedVert * Time.deltaTime); 

} 
+0

Time.deltaTimeはコールによって異なりますか?もしそうなら、減速コードで速度を下げるのではなく、MinまたはMaxを入力して、負の速度が正にならないようにしてください。 – Martheen

答えて

0

、顕著なビットは、お使いのプレーヤーは、あなたが入力を供給していない場合でも動くということです。私が何かを見逃していない限り、あなたの提供されたコードスニペットで加速と減速は決して変わりません。その減速が一定であり、あなたがゲームを開始するので、入力を供給していませんでしたことを、あなたのスニペットのこの部分を考慮して考える:

else if (speedHorz < deceleration * Time.deltaTime) 
{ 
    speedHorz = speedHorz + deceleration * Time.deltaTime; 
} 

あなたはこの条件speedHorizを評価する最初の時間は、(あなたのプレイヤーが残りから始まり、ゼロでありますyes?)、減速度は12、time.DeltaTimeはおそらくゼロではありません。つまり、if条件が0 < 12 * [正の数]に評価されます。これは真です。 speedHorzはゼロからゼロ以上の値になり、ボタンを押さなくてもスピードが少し遅くなります。

+0

私はTime.deltaTimeのすべての組み合わせを削除しました。私は試してみることができます。すべての組み合わせで問題が悪化します。今週末に私が時間を持っていると、私はこの問題をもっと詳しく調べてみるつもりです。 – Magnus22191

+0

上記でコピーしたコードの一部からTime.deltaTimeを削除したとしても、入力なしで動きを得ることができます。位置、速度、加速度をリアルタイムで処理したい場合は、Time.deltaTimeのようなものが必要でしょう。 –

+0

一度私は良い夜の睡眠を得たそれを考え出した。私を正しい方向に向けてくれてありがとう。問題はelseステートメントにあります。速度が>か 0 * Time.deltaTime) { speedHorz = speedHorz - Deceleration * Time.deltaTime; } else {speedHorz <0 * Time.deltaTime} } – Magnus22191