スクリプトから取得したオイラー角についてXだけでなくY、Zも観察していただきますと、姿勢によってはいきなり180°回転したりする様子を見ることができるかと思います。
下記のようなコードを実行してみましたら...
C#
1using System;
2using System.Collections;
3using UnityEngine;
4
5public class PrintRotation : MonoBehaviour
6{
7 private float angle;
8
9 private IEnumerator Start()
10 {
11 var interval = new WaitForSeconds(0.1f);
12 while (true)
13 {
14 yield return interval;
15
16 this.angle += 1.0f;
17 var inputAngles = new Vector3(this.angle, 0.0f, 0.0f);
18 transform.eulerAngles = inputAngles;
19 var resultAngles = transform.eulerAngles;
20 Debug.Log($"Input : {inputAngles}, Result:{resultAngles}");
21 }
22 }
23
24 private void OnGUI()
25 {
26 var eulerAngles = transform.eulerAngles;
27 GUILayout.Label($"A {this.angle:F0}");
28 GUILayout.Label($"X {eulerAngles.x:F0}");
29 GUILayout.Label($"Y {eulerAngles.y:F0}");
30 GUILayout.Label($"Z {eulerAngles.z:F0}");
31 }
32}
下図のように途中からY、Zがひっくり返ってXが減少に転じ、さらに回転を続けるとまたY、Zがひっくり返り、Xが再び増加し始める様子が撮影できました。
たとえば入力値として(135, 0, 0)
を与えると、それを再び取り出したときには(45, 180, 180)
に変わっています。ですが、3D空間上の姿勢はどちらも同じになっている様子がお分かりいただけますでしょうか?
Transform-eulerAngles - Unity スクリプトリファレンスに注釈があるように...
Do not set one of the eulerAngles axis separately (eg. eulerAngles.x = 10; ) since this will lead to drift and undesired rotations. When setting them to a new value set them all at once as shown above. Unity will convert the angles to and from the rotation stored in Transform.rotation.
eulerAnglesの軸の一つだけを個別に設定(たとえばeulerAngles.x = 10;)するのは値のドリフトや意図しない回転につながりますので避けてください。上に示したように、新しい値を設定するときはすべての軸を一度に設定します。Unityは角度を回転に変換してTransform.rotationに格納、あるいはTransform.rotationの回転を角度に変換して取り出します。
このような挙動は、回転の表現形式としてQuaternionが使われる都合上しかたないところがありますので、X軸周りの連続した角度が欲しい場合は自前でオイラー角状態のまま(Quaternion型を経由させずに)角度を持っておくか、あるいは独自に計算する必要があるかと思います。
インスペクター上の角度表示ではこのような一見奇妙な動きは起こりませんが、これは内部的にQuaternionに変換されていないオイラー角も一緒に保存しているためのようです(エディタスクリプトではこの生の角度にアクセスすることもできなくはなさそうですが、ゲーム実行時には無理かと思います。)。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/15 14:53