回答編集履歴

1

使い勝手の改善案を追記

2018/02/24 04:21

投稿

Bongo
Bongo

スコア10807

test CHANGED
@@ -11,3 +11,193 @@
11
11
 
12
12
 
13
13
  とのことでした。Transform.rotationによる回転は明確に禁止されているわけではないようですが、やや非効率的になる様子ですね。
14
+
15
+
16
+
17
+ ### [追記]
18
+
19
+
20
+
21
+ 確かにRotateが使えないのは不便かもしれませんね。下記のようなスクリプトを作ってみるのはいかがでしょう?
22
+
23
+
24
+
25
+ ```C#
26
+
27
+ using UnityEngine;
28
+
29
+
30
+
31
+ public static class RigidbodyExtensions
32
+
33
+ {
34
+
35
+ /// <summary>
36
+
37
+ /// Rigidbodyを回転します。
38
+
39
+ /// </summary>
40
+
41
+ /// <param name="rigidbody">回転対象のRigidbody。</param>
42
+
43
+ /// <param name="eulerAngles">オイラー角による回転量。</param>
44
+
45
+ /// <param name="relativeTo"><c>Space.Self</c>の場合はRigidbodyのローカル軸に対して、<c>Space.World</c>の場合はワールド軸に対して回転を適用します。</param>
46
+
47
+ /// <param name="isMovingMode"><c>true</c>の場合は、rotationへの回転設定の代わりにMoveRotationを使用して回転します。</param>
48
+
49
+ public static void Rotate(
50
+
51
+ this Rigidbody rigidbody,
52
+
53
+ Vector3 eulerAngles,
54
+
55
+ Space relativeTo = Space.Self,
56
+
57
+ bool isMovingMode = false)
58
+
59
+ {
60
+
61
+ rigidbody.Rotate(Quaternion.Euler(eulerAngles), relativeTo, isMovingMode);
62
+
63
+ }
64
+
65
+
66
+
67
+ /// <summary>
68
+
69
+ /// Rigidbodyを回転します。
70
+
71
+ /// </summary>
72
+
73
+ /// <param name="rigidbody">回転対象のRigidbody。</param>
74
+
75
+ /// <param name="xAngle">X軸周り回転量。</param>
76
+
77
+ /// <param name="yAngle">Y軸周り回転量。</param>
78
+
79
+ /// <param name="zAngle">Z軸周り回転量。</param>
80
+
81
+ /// <param name="relativeTo"><c>Space.Self</c>の場合はRigidbodyのローカル軸に対して、<c>Space.World</c>の場合はワールド軸に対して回転を適用します。</param>
82
+
83
+ /// <param name="isMovingMode"><c>true</c>の場合は、rotationへの回転設定の代わりにMoveRotationを使用して回転します。</param>
84
+
85
+ public static void Rotate(
86
+
87
+ this Rigidbody rigidbody,
88
+
89
+ float xAngle,
90
+
91
+ float yAngle,
92
+
93
+ float zAngle,
94
+
95
+ Space relativeTo = Space.Self,
96
+
97
+ bool isMovingMode = false)
98
+
99
+ {
100
+
101
+ rigidbody.Rotate(Quaternion.Euler(xAngle, yAngle, zAngle), relativeTo, isMovingMode);
102
+
103
+ }
104
+
105
+
106
+
107
+ /// <summary>
108
+
109
+ /// Rigidbodyを回転します。
110
+
111
+ /// </summary>
112
+
113
+ /// <param name="rigidbody">回転対象のRigidbody。</param>
114
+
115
+ /// <param name="axis">回転軸。</param>
116
+
117
+ /// <param name="angle">回転量。</param>
118
+
119
+ /// <param name="relativeTo"><c>Space.Self</c>の場合はRigidbodyのローカル軸に対して、<c>Space.World</c>の場合はワールド軸に対して回転を適用します。</param>
120
+
121
+ /// <param name="isMovingMode"><c>true</c>の場合は、rotationへの回転設定の代わりにMoveRotationを使用して回転します。</param>
122
+
123
+ public static void Rotate(
124
+
125
+ this Rigidbody rigidbody,
126
+
127
+ Vector3 axis,
128
+
129
+ float angle,
130
+
131
+ Space relativeTo = Space.Self,
132
+
133
+ bool isMovingMode = false)
134
+
135
+ {
136
+
137
+ rigidbody.Rotate(Quaternion.AngleAxis(angle, axis), relativeTo, isMovingMode);
138
+
139
+ }
140
+
141
+
142
+
143
+ /// <summary>
144
+
145
+ /// Rigidbodyを回転します。
146
+
147
+ /// </summary>
148
+
149
+ /// <param name="rigidbody">回転対象のRigidbody。</param>
150
+
151
+ /// <param name="rotation">クォータニオンによる回転。</param>
152
+
153
+ /// <param name="relativeTo"><c>Space.Self</c>の場合はRigidbodyのローカル軸に対して、<c>Space.World</c>の場合はワールド軸に対して回転を適用します。</param>
154
+
155
+ /// <param name="isMovingMode"><c>true</c>の場合は、rotationへの回転設定の代わりにMoveRotationを使用して回転します。</param>
156
+
157
+ public static void Rotate(
158
+
159
+ this Rigidbody rigidbody,
160
+
161
+ Quaternion rotation,
162
+
163
+ Space relativeTo = Space.Self,
164
+
165
+ bool isMovingMode = false)
166
+
167
+ {
168
+
169
+ var newRotation = relativeTo == Space.Self ? rigidbody.rotation * rotation : rotation * rigidbody.rotation;
170
+
171
+ if (isMovingMode)
172
+
173
+ {
174
+
175
+ rigidbody.MoveRotation(newRotation);
176
+
177
+ }
178
+
179
+ else
180
+
181
+ {
182
+
183
+ rigidbody.rotation = newRotation;
184
+
185
+ }
186
+
187
+ }
188
+
189
+ }
190
+
191
+ ```
192
+
193
+
194
+
195
+ これで下図のように、RigidbodyにRotateメソッドが追加されたかのように使えるかと思います。
196
+
197
+
198
+
199
+ ![プレビュー](978637a5ade8d42fedfb13d8cdedbd8c.png)
200
+
201
+
202
+
203
+ ※おそらくちゃんと回転してくれるとは思いますが、もし動作がおかしいなどありましたらお知らせください。