2017-11-01 12 views
2

私はUnityで(おそらく愚かな)初心者の問題を抱えています。C#条件がトリガーされない

私は周回惑星に添付スクリプトのUpdateでこのコードを持っている:

条件は明らかにトリガされることはありません
Debug.Log(this.transform.position.x); 
if (!Math.Sign(this.transform.position.x).Equals(Math.Sign(lastx)) { 
    Debug.Log("Bang!"); 
} 
this.transform.RotateAround(Vector3.zero, Vector3.up, OrbitSpeed * Time.deltaTime); 
lastx = this.transform.position.x; 

。球がy = 0の軸を横切るたびにトリガされるはずです。別名、記号が変わります。

ただし、デバッグログ出力はXの符号が変化していることを確認します。私は何らかの明白な誤りをしていますか?

+1

['Mathf.Approximately'](https://docs.unity3d.com/ScriptReference/Mathf.Approximately.html)を使用してください。 'もし(Mathf.Approximately(this.transform.position.x、lastx))..... ..... – Programmer

+1

@Programmerいいえ、彼は2つの値を比較していません。彼は2つの値の兆候を比較している。 (私の答えを参照してください) – DodgyCodeException

+0

うん、私は 'Math.Sign'のパスを逃した。 – Programmer

答えて

3

lastx = this.transform.position.xの前に、の右側を変更することをお勧めします。今のように、比較すると、lastxは常にthis.transform.position.xに等しくなります。

また、.Equals()を使用する必要はありません。ちょうど!=を使用してください。

Debug.Log(this.transform.position.x); 
if (Math.Sign(this.transform.position.x) != Math.Sign(lastx) { 
    Debug.Log("Bang!"); 
} 
lastx = this.transform.position.x; 
this.transform.RotateAround(Vector3.zero, Vector3.up, OrbitSpeed * Time.deltaTime); 
+0

これが解決策です。私はJava-ish ==オブジェクト比較の問題について心配していましたが、それは原因ではありませんでした。 – dylhunn

+0

Javaとは異なり、C#には演算子のオーバーロードがあります。文字列(および他の多くの型)とともに '=='を使用することさえできます。 – DodgyCodeException

関連する問題