2016-05-01 9 views
2

私は船のホイールを持っています。プレーヤーは回転できます。私は現在、角度の変化を記録しており、これは合計角度に加えられます。私は船のホイールが何度回ったかを調べることができます。これはすべて正常に動作します。時間差の平均としての回転の差異を見つけるC#

void Update() 
     { 
      //Record Amount of Wheel Turns 
      currentAngle = wheelRectTransform.transform.rotation.eulerAngles.z; 
      angleChange = Mathf.DeltaAngle(currentAngle, previousAngle); 

      if ((Mathf.Abs(angle + angleChange)/360) <= wheelTurnsUntilRudderAtMaxAngle) 
      {    
       angle += angleChange;    
      } 

      totalWheelTurns = angle/360; 
      shipStats.RudderAngle = totalWheelTurns/wheelTurnsUntilRudderAtMaxAngle; 

      previousAngle = currentAngle; 
     } 

しかし、私はまた、時間をかけて平均角度変化を記録したいと思います。そうすれば、ホイールが左右に回転しているかどうかを正確に知ることができます。

私は実際にこの

if (angleChange < 0) 
{ 
    // Going Left 
} 
else if (angleChange > 0) 
{ 
    // Going Right 
} else 
{ 
    // Not moving 
} 

のような単純なもののプレーヤーは非常に、非常にゆっくりとホイールを回転している場合しかし、時折フレームの角度差が0であると「移動しない」として記録さを試してみました。

平均的な角度の変化を短時間で見つけることができると思うので、時間の経過とともに角度を0に設定しようとしました。

newAngleDifference = Mathf.Lerp(angleChange, 0, Time.deltaTime * 0.2f); 

これは、私はとにかく0することができ「angleChange」を使用しているとして、それは私に同じフィードバックを与え、動作しませんでした。

ありがとうございます!

ジム

+0

私はいくつかの動きを試作しているので、コード全体が混乱しています。しかし、私はあなたのためにここに入れました。私は現在、何らかのLerpを使用して方向を確認していますが、完璧ではありませんが、それは可能です。 http://pastebin.com/kGLrUYVu – Jim

+0

はい、z方向です。剛体はありません。 – Jim

答えて

1

最後に、平均を得るためにLerpを使用しました。

public enum WheelDirection { Left, Right, Still } 

    [Header("Average Wheel Direction")] 
    public float lerpTime = 0.5f; // How many seconds average over 
    private WheelDirection wheelDirection; 
    private float wheelDeltaX; 
    private float wheelDirectionInterpolated; 
    private float currentLerpTime; 

void Update() 
    { 
     // Get DeltaX of objects rotation 
     // I'm interested in the Z axis, but you could change this to x/y   
     float currentAngle = transform.rotation.eulerAngles.z; 
     wheelDeltaX = (currentAngle - previousAngle); 

     // Reduce the Lerp percentage 
     currentLerpTime += Time.deltaTime; 
     if (currentLerpTime > lerpTime) 
     { 
      currentLerpTime = lerpTime; 
     } 
     float perc = currentLerpTime/lerpTime; 

     // Lerp! 
     wheelDirectionInterpolated = (Mathf.Lerp(wheelDirectionInterpolated, wheelDeltaX, perc)); 

     // Wheel has finished rotating, so reset the Lerp 
     if (wheelDirectionInterpolated == 0) currentLerpTime = 0; 

     // Store Direction in an Enum 
     if (wheelDirectionInterpolated > 0) wheelDirection = WheelDirection.Left; 
     if (wheelDirectionInterpolated < 0) wheelDirection = WheelDirection.Right; 
     if (wheelDirectionInterpolated == 0) wheelDirection = WheelDirection.Still; 

     //This should always be at the end 
     previousAngle = currentAngle; 
    } 
1

あなたは、車輪の方向を検出するために何かを平均化する必要はありません。古い変数と新しい変数を使用して、ホイールがどちらの方向に向いているかを調べるだけです。

void Start() 
{ 
     StartCoroutine(wheelDIRCalculator(_wheelTransform)); 
} 


bool continueWheelCalculation = false; 

IEnumerator wheelDIRCalculator(Transform wheelTransform) 
{ 
    yield return null; 

    continueWheelCalculation = true; 

    float oldZAngle = 0; 
    float newZAngle = 0; 
    bool isIdle = false; 

    oldZAngle = Mathf.Abs(wheelTransform.rotation.eulerAngles.z); 


    while (continueWheelCalculation) 
    { 

     //Get new rotation 
     newZAngle = Mathf.Abs(wheelTransform.rotation.eulerAngles.z); 

     if (oldZAngle < newZAngle) 
     { 
      isIdle = false; 
      oldZAngle = newZAngle; 
      Debug.Log("Left"); 

      //Do something 

     } 
     else if (oldZAngle > newZAngle) 
     { 
      isIdle = false; 
      oldZAngle = newZAngle; 
      Debug.Log("Right"); 

      //Do something 

     } 
     else if (!isIdle) 
     { 
      isIdle = true; 
      oldZAngle = newZAngle; 
      Debug.Log("Idle"); 

      //Do something 

     } 


     yield return null; 
    } 
} 

void stopWheelDIRCalculator() 
{ 
    continueWheelCalculation = false; 
} 
関連する問題