質問するログイン新規登録

回答編集履歴

1

追記

2018/01/16 06:07

投稿

fiveHundred
fiveHundred

スコア10480

answer CHANGED
@@ -16,4 +16,75 @@
16
16
  - Vector4がどうたらこうたら言っておりますが、そもそもVector4は向きや位置を示すのには使われておりません。
17
17
  QuaternionかVector3の間違いだと思います。
18
18
 
19
- 回転しているかどうかの判定については、``transform.rotation``を比較するだけだと、完全に止まっていないと回転していないと判断されないため、[Quaternion.Angle()](https://docs.unity3d.com/2017.3/Documentation/ScriptReference/Quaternion.Angle.html)を使って角度を取得し、それが一定値以下かどうかで処理を分けるのがよろしいかと思います。
19
+ 回転しているかどうかの判定については、``transform.rotation``を比較するだけだと、完全に止まっていないと回転していないと判断されないため、[Quaternion.Angle()](https://docs.unity3d.com/2017.3/Documentation/ScriptReference/Quaternion.Angle.html)を使って角度を取得し、それが一定値以下かどうかで処理を分けるのがよろしいかと思います。
20
+
21
+ ---
22
+
23
+ 追記:
24
+
25
+ > コルーチンは、void updateはあまり使わないほうが良いと書いていたので、コルーチンで動作を区切るために使っております。
26
+
27
+ そうであったとしても、``yield return``で待ち合わすという処理をしていないのであれば、コルーチンでも関数でも同じです。
28
+
29
+ また、Update()を重い処理を避ける理由は、毎フレーム処理されるためですが、そう考えると
30
+
31
+ - 毎フレーム、コルーチンを呼び出している場合は、そもそも意味がない
32
+ - そうでない場合、フレーム間の時間を表す``Time.deltaTime``を使うのは不適切
33
+
34
+ となるので、素直にUpdate()内に書いてしまったほうがよろしいかと思います。
35
+
36
+
37
+ > Quaternion.Angle()を使う具体的な方法がわかる方、もしおられましたらご一報ください。
38
+
39
+ 以下のようにすればよいです。
40
+
41
+ ```C#
42
+ Quaternion targetRotation; // 追加
43
+
44
+ // …(中略)
45
+
46
+ void Update()
47
+ {
48
+ //全てのアニメーションをリセット
49
+ moveResaet();
50
+
51
+ //初期値からいくつ回転したのかを調べる
52
+ float angle = Quaternion.Angle(transform.rotation, targetRotation); // 変更
53
+
54
+ //ターゲットへ旋回
55
+ rb.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation
56
+ (targetP.transform.position - transform.position), Time.deltaTime * 10f);
57
+ //見るだけなので動かない
58
+ rb.velocity = Vector3.zero;
59
+
60
+ if (angle < 10f * Time.deltaTime)
61
+ {
62
+ animator.SetBool("Idle", true);
63
+ }
64
+ else
65
+ {
66
+ animator.SetBool("Walk", true);
67
+ }
68
+
69
+ targetRotation = transform.rotation; // 追加
70
+ }
71
+ ```
72
+
73
+ ちなみに、以下のようにした場合は、transformのインスタンス=targetのインスタンスとなり、transformの変更がtargetにも反映されてしまうため、うまくいきません。
74
+
75
+ ```C#
76
+ Transform target;
77
+
78
+ // …(中略)
79
+
80
+ void Update()
81
+ {
82
+ // …(中略)
83
+
84
+ float angle = Quaternion.Angle(transform.rotation, target.rotation);
85
+
86
+ // …(中略)
87
+
88
+ target = transform;
89
+ }
90
+ ```