マニュアルによると、インスペクタ上のTransformコンポーネントのPosition、Rotation、Scaleは親に対する相対値だそうですので、インスペクタのRotationに値を設定することと対応するのは、「localRotationにQuaternion.Eulerで作った回転を代入する」ということになるでしょうか。
transform.Rotateですが、実際に適当なオブジェクトに下記のようなスクリプトをアタッチして試してみてはいかがでしょう。オブジェクトはあらかじめ適当に回転して傾けておくと動きが分かりやすいかと思います。
C#
1using UnityEngine;
2
3public class TestScript : MonoBehaviour
4{
5 private void Update()
6 {
7 if (Input.GetKeyDown(KeyCode.Space))
8 {
9 transform.Rotate(0.0f, 30.0f, 0.0f);
10 }
11 }
12}
おそらく、インスペクタ上の回転角に値を加減算するのとは異なった結果になるのではないでしょうか?transform.Rotateで回転すると、シーンビュー上でオブジェクトから突き出た3色のギズモを軸に回転するはずです。
また、transform.Rotate(0.0f, 30.0f, 0.0f, Space.World);
に変えてみると、今度はワールド座標の3軸周りに回転し、こちらもやはりインスペクタへの加減算とは微妙に異なるはずです(オブジェクトを別のオブジェクトの子にして、親オブジェクトもあらかじめ適当に傾けておくと違いが明確になるでしょう)。
[コメントを受けて追記]
localEulerAnglesを取得して値を加減算し、ふたたびlocalEulerAnglesに書き戻す手が考えられるかと思います。
C#
1using UnityEngine;
2
3public class TestScript : MonoBehaviour
4{
5 private void Update()
6 {
7 if (Input.GetKeyDown(KeyCode.Space))
8 {
9 var localEuler = transform.localEulerAngles;
10 localEuler.y += 30;
11 transform.localEulerAngles = localEuler;
12 }
13 }
14}
ただし、リファレンスの注意書きにあるように、このようにすると意図通りにならない場合があります。たとえば上記のlocalEuler.y += 30;
をlocalEuler.x += 30;
にすると...
Unity内部では回転をクォータニオンで持っており、オイラー角が必要になればそのクォータニオンからオイラー角が導出されますが、あるクォータニオンと同じ回転を表すオイラー角は一通りではないという特徴があるため、xだけを操作しているつもりなのにy、zも変化してしまい、最終的にめちゃくちゃな回転になってしまうかもしれません。
オイラー角からクォータニオンへ...の一方通行ならこの問題を回避できるかと思います。
コードをこのようにすると...
C#
1using UnityEngine;
2
3public class TestScript : MonoBehaviour
4{
5 private Vector3 localEuler;
6
7 private void Start()
8 {
9 this.localEuler = transform.localEulerAngles;
10 }
11
12 private void Update()
13 {
14 if (Input.GetKeyDown(KeyCode.Space))
15 {
16 this.localEuler.x += 30;
17 transform.localEulerAngles = this.localEuler;
18 }
19 }
20}
21
途中のインスペクタの表示ではやはりx、y、zが一斉に変化しており、回転が狂ってしまっているように見えるかもしれませんが、ちゃんと等価な回転になっており、12回の回転で元の向きに戻ります。
[追記]
エディタ上だとRotationに値を入れると(たとえ±360°を超えるようなものでも)、インスペクタを表示しなおしても勝手に変な値に書き換わることなく、その値が維持されるようです。編集する上では直感的で便利な機能だと思いますが、どうやらUnityは内部的にユーザが入力した、あるいはエディタ上で回転させたオイラー角をクォータニオンを経由させず、そのままの状態で保管しているみたいですね。
How are Editor Transform.Rotation values calculated? : Unity3Dを参考に下記のようにしてみると、インスペクタ上に表示されているのと同じ値を見ることができました。
C#
1using UnityEngine;
2
3[ExecuteInEditMode]
4public class TestScript : MonoBehaviour
5{
6 private Vector3 localEuler;
7
8 private void Start()
9 {
10 this.localEuler = transform.localEulerAngles;
11 #if UNITY_EDITOR
12 var serializedObject = new UnityEditor.SerializedObject(transform);
13 var serializedEulerHint = serializedObject.FindProperty("m_LocalEulerAnglesHint");
14 Debug.Log(serializedEulerHint.vector3Value);
15 #endif
16 }
17
18 private void Update()
19 {
20 if (Input.GetKeyDown(KeyCode.Space))
21 {
22 this.localEuler.x += 10;
23 this.localEuler.y += 10;
24 this.localEuler.z += 10;
25 transform.localEulerAngles = this.localEuler;
26 }
27 }
28}
実際の実行時には使えないでしょうが、エディタスクリプトでインスペクタ上の角度を意図通りに加減算させたいというようなことがあれば、このあたりをいじることになりそうです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/12/10 03:04 編集
2017/12/10 06:13 編集
退会済みユーザー
2017/12/10 09:18
2017/12/10 10:32
退会済みユーザー
2017/12/10 12:13 編集
2017/12/10 20:58
退会済みユーザー
2017/12/11 12:52
2017/12/11 22:02
退会済みユーザー
2017/12/12 02:00 編集
2017/12/12 03:12
退会済みユーザー
2017/12/12 16:53 編集
2017/12/12 20:13 編集
退会済みユーザー
2017/12/13 13:41 編集
2017/12/13 14:01
退会済みユーザー
2017/12/13 16:35