2011-07-17 12 views
1

ヘッドアップ:Unityで作業している間にこの問題が発生したにもかかわらず、Unityに特有のことは何もなく、プログラミングロジックに関することですので、恥ずかしがり屋ではありません。アングルの境界での問題

私はUnityを使用していて、スクリプトでオブジェクトを回転しています。つまり、180度に回転させると、オブジェクトはそれほど回転しなくなり、179度から181度の間で停止する傾向があります。したがって、回転が完了したかどうかを確認するには、回転角度がtargetAngle +/- 1であることを確認します。回転角が-1と1の間にある場合

Iは、targetAngle、この場合に0である場合

lowerLimit = targetAngle-1; 
upperLimit = targetAngle + 1; 

今、問題が発生

if (transform.eulerAngles.z > lowerLimit && transform.eulerAngles.z < upperLimit) 

を使用して私のスクリプトチェックをチェック。しかし、-1は実際に359になるはずなので、角度が359と1の間にあるかどうかを確認する必要があります。

どうすれば実装できますか? つまり、ラップアラウンドナンバーシステムを実装する方法を尋ねていると思います。

編集

1つの回避策が見つかりました。 targetAngleが0の場合、私は特別扱いです。それは動作しますが、最もエレガントではありません。

あなたが行うことができ
  if (targetAngle == 0.0) 
     { 
      if ((transform.eulerAngles.z > 359.0 && transform.eulerAngles.z <= 360.0) || (transform.eulerAngles.z >= 0.0 && transform.eulerAngles.z <= 1)) 
      { 
       rotate = false;    
      } 
     } 
     else 
     { 
      if (transform.eulerAngles.z > targetAngle - 1 && transform.eulerAngles.z < targetAngle + 1) 
      { 
       rotate = false;    
      } 
     } 

答えて

2

...

lowerLimit = (targetAngle % 360) + 359; //360 - 1; 
upperLimit = (targetAngle % 360) + 361; //360 + 1; 

if (((transform.eulerAngles.z + 360) % 360) > lowerLimit 
&& ((transform.eulerAngles.z + 360) % 360) < upperLimit) 

これはゼロからチェックを移動し、あなたはポジティブ/ネガティブチェックに対処する必要はありません。 targetAngle

EDIT

%オペレータは、回転は、359度+/-するので、721の目標角度が1に降りてくるだろう、と-359の目標角が降りてくるだろう規制しますこれは私が思うすべての場合にうまくいくはずです。

EDIT 2

あなたがあなたのコメントで述べた最後のケースを修正するには、私はあなたのtransform.eulerAngles.z値に同じラッピングロジックを適用する必要があると思いますね。おそらく最高の今、余分な機能で、このラッピングを置くので、このしようとする:あなたはこれを使用する必要がどのくらいの頻度に応じて、

int wrapNumber(int input) // replace int with whatever your type is 
{ 
    // this will always return an angle between 0 and 360: 
    // the inner % 360 restricts everything to +/- 360 
    // +360 moves negative values to the positive range, and positive ones to > 360 
    // the final % 360 caps everything to 0...360 
    return ((input % 360) + 360) % 360; 
} 

lowerLimit = wrapNumber(targetAngle) + 359; //360 - 1; 
upperLimit = wrapNumber(targetAngle) + 361; //360 + 1; 

if (wrapNumber(transform.eulerAngles.z) + 360 > lowerLimit 
&& wrapNumber(transform.eulerAngles.z) + 360 < upperLimit) 

を、いくつかのケースをチェックすると、不要なオーバーヘッドを削除する場合があります。たとえば、wrapNumber内の最後の% 360は、入力が正の場合にのみ必要です。これを毎分10回呼び出す場合は、おそらく問題ではありません。毎秒100回呼び出す場合は、この状況でどのように動作するかを確認することができます。

+0

ああ、非常にいいです。この具体的なケースでは、私は180度以上回転する必要はないので、これを採用すると思います。ありがとう! – xbonez

+0

私はまだこの問題に遭遇しています。 targetAngleが0の場合、lowerLimitは359、upperLimitは361です。しかし、180から0に360度回転した場合、回転は約359で停止します。この場合、 ((359 + 360) > 359 &&(359 + 360)<361) – xbonez

+0

最後の編集をお試しください。私はモジュラスを巧みに使い、必要に応じて360を追加することでこれを修正できることを100%確信しています。これがまだそれでない場合は、私はおそらく完全にそれを爪にデバッグ環境内でこれを確認する必要があります恐れている。私が今に行かなくてはならないので、あなたがあなたの進歩を投稿するならば(今までにあなたか他の誰かがそれを修正しない限り)、今夜か明日のどちらかにもう一度これを見るでしょう。 – takrl

1

これは古いスレッドかもしれませんが、折り返しを処理しようとしている多くの異なるスニペットを見た後、私はUnityにビジネスの面倒を見る素晴らしい組み込み関数があることを発見しました。私はLerpAngleに変更しなければならなかったので、堅実な結果を返しました。

Mathf.LerpAngleはあなたの友人です。

http://docs.unity3d.com/ScriptReference/Mathf.LerpAngle.html

関連する問題