回答編集履歴

2

インスペクタ上の回転表示について追記

2017/12/10 07:50

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -165,3 +165,81 @@
165
165
 
166
166
 
167
167
  ![プレビュー3](fa50f7c9288e5386125ff1d062254599.gif)
168
+
169
+
170
+
171
+ [追記]
172
+
173
+ エディタ上だとRotationに値を入れると(たとえ±360°を超えるようなものでも)、インスペクタを表示しなおしても勝手に変な値に書き換わることなく、その値が維持されるようです。編集する上では直感的で便利な機能だと思いますが、どうやらUnityは内部的にユーザが入力した、あるいはエディタ上で回転させたオイラー角をクォータニオンを経由させず、そのままの状態で保管しているみたいですね。
174
+
175
+ [How are Editor Transform.Rotation values calculated? : Unity3D](https://www.reddit.com/r/Unity3D/comments/5vy0om/how_are_editor_transformrotation_values_calculated/)を参考に下記のようにしてみると、インスペクタ上に表示されているのと同じ値を見ることができました。
176
+
177
+
178
+
179
+ ```C#
180
+
181
+ using UnityEngine;
182
+
183
+
184
+
185
+ [ExecuteInEditMode]
186
+
187
+ public class TestScript : MonoBehaviour
188
+
189
+ {
190
+
191
+ private Vector3 localEuler;
192
+
193
+
194
+
195
+ private void Start()
196
+
197
+ {
198
+
199
+ this.localEuler = transform.localEulerAngles;
200
+
201
+ #if UNITY_EDITOR
202
+
203
+ var serializedObject = new UnityEditor.SerializedObject(transform);
204
+
205
+ var serializedEulerHint = serializedObject.FindProperty("m_LocalEulerAnglesHint");
206
+
207
+ Debug.Log(serializedEulerHint.vector3Value);
208
+
209
+ #endif
210
+
211
+ }
212
+
213
+
214
+
215
+ private void Update()
216
+
217
+ {
218
+
219
+ if (Input.GetKeyDown(KeyCode.Space))
220
+
221
+ {
222
+
223
+ this.localEuler.x += 10;
224
+
225
+ this.localEuler.y += 10;
226
+
227
+ this.localEuler.z += 10;
228
+
229
+ transform.localEulerAngles = this.localEuler;
230
+
231
+ }
232
+
233
+ }
234
+
235
+ }
236
+
237
+ ```
238
+
239
+
240
+
241
+ ![インスペクタの回転表示](a025b08c58ff9aa5509b20afb860c138.png)
242
+
243
+
244
+
245
+ 実際の実行時には使えないでしょうが、エディタスクリプトでインスペクタ上の角度を意図通りに加減算させたいというようなことがあれば、このあたりをいじることになりそうです。

1

コメントを受けて追記

2017/12/10 07:49

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -47,3 +47,121 @@
47
47
 
48
48
 
49
49
  ![World](31fb67d3f1bbe9edeaeeb17851f42bc7.gif)
50
+
51
+
52
+
53
+ [コメントを受けて追記]
54
+
55
+ [localEulerAngles](https://docs.unity3d.com/ScriptReference/Transform-localEulerAngles.html)を取得して値を加減算し、ふたたびlocalEulerAnglesに書き戻す手が考えられるかと思います。
56
+
57
+
58
+
59
+ ```C#
60
+
61
+ using UnityEngine;
62
+
63
+
64
+
65
+ public class TestScript : MonoBehaviour
66
+
67
+ {
68
+
69
+ private void Update()
70
+
71
+ {
72
+
73
+ if (Input.GetKeyDown(KeyCode.Space))
74
+
75
+ {
76
+
77
+ var localEuler = transform.localEulerAngles;
78
+
79
+ localEuler.y += 30;
80
+
81
+ transform.localEulerAngles = localEuler;
82
+
83
+ }
84
+
85
+ }
86
+
87
+ }
88
+
89
+ ```
90
+
91
+
92
+
93
+ ![プレビュー1](44d48ac11de144b7b83ac7203f077334.gif)
94
+
95
+
96
+
97
+ ただし、リファレンスの注意書きにあるように、このようにすると意図通りにならない場合があります。たとえば上記の`localEuler.y += 30;`を`localEuler.x += 30;`にすると...
98
+
99
+
100
+
101
+ ![プレビュー2](80310798d984bbd8c6e8a05aa79991d0.gif)
102
+
103
+
104
+
105
+ Unity内部では回転をクォータニオンで持っており、オイラー角が必要になればそのクォータニオンからオイラー角が導出されますが、あるクォータニオンと同じ回転を表すオイラー角は一通りではないという特徴があるため、xだけを操作しているつもりなのにy、zも変化してしまい、最終的にめちゃくちゃな回転になってしまうかもしれません。
106
+
107
+
108
+
109
+ オイラー角からクォータニオンへ...の一方通行ならこの問題を回避できるかと思います。
110
+
111
+ コードをこのようにすると...
112
+
113
+
114
+
115
+ ```C#
116
+
117
+ using UnityEngine;
118
+
119
+
120
+
121
+ public class TestScript : MonoBehaviour
122
+
123
+ {
124
+
125
+ private Vector3 localEuler;
126
+
127
+
128
+
129
+ private void Start()
130
+
131
+ {
132
+
133
+ this.localEuler = transform.localEulerAngles;
134
+
135
+ }
136
+
137
+
138
+
139
+ private void Update()
140
+
141
+ {
142
+
143
+ if (Input.GetKeyDown(KeyCode.Space))
144
+
145
+ {
146
+
147
+ this.localEuler.x += 30;
148
+
149
+ transform.localEulerAngles = this.localEuler;
150
+
151
+ }
152
+
153
+ }
154
+
155
+ }
156
+
157
+
158
+
159
+ ```
160
+
161
+
162
+
163
+ 途中のインスペクタの表示ではやはりx、y、zが一斉に変化しており、回転が狂ってしまっているように見えるかもしれませんが、ちゃんと等価な回転になっており、12回の回転で元の向きに戻ります。
164
+
165
+
166
+
167
+ ![プレビュー3](fa50f7c9288e5386125ff1d062254599.gif)