質問: false; } ``` 数字の取得方法がわからなかったので、教えてもらったとおりに角度を取得。 完全に見たい方向に向いてるときが359fだったので、20fほど余裕を持たせて、それ以上だったら振り向きモーションを動作するようにしました。 今回は、もう疲れに疲れ切って、質問に書いたコードが、途中も途中でムチャクチャだったので、回答していただいた方には、本当に申し訳ないと思っております。すいませんでした。
回答: 突っ込みどころ満載です。 どのような本かは分かりませんが、本の内容を理解していないとしか思えないレベルのものもあります。 * コルーチンにしている理由はなんでしょうか? 最後に`yield return null;`しているだけであり、それ以外に`yield return`を使われているところはないので、関数にしても問題ないように思えます。 * `transform.position`は向きではなく位置を指します。 向きを取得したい場合は`transform.rotation`(Quaternion型)か`transform.eulerAngles`(オイラー角を示すVector3型)を使い分けてください。 * `transform.TransformDirection()`も使い方がおかしいです。 ワールド同士orローカル同士で比較すればよいので、そもそも今回の場合は使う必要はないと思います。 * `animator.SetBool("~", true);`で、animatorのパラメータをtrueにしていますが、その後falseに戻しておりますでしょうか? もし、そうでない場合は永遠にtrueのままなので、正しくanimatorが動作しないのではないかと思います。 * Vector4がどうたらこうたら言っておりますが、そもそもVector4は向きや位置を示すのには使われておりません。 QuaternionかVector3の間違いだと思います。 回転しているかどうかの判定については、`transform.rotation`を比較するだけだと、完全に止まっていないと回転していないと判断されないため、Quaternion.Angle()を使って角度を取得し、それが一定値以下かどうかで処理を分けるのがよろしいかと思います。 追記: > > コルーチンは、void updateはあまり使わないほうが良いと書いていたので、コルーチンで動作を区切るために使っております。 > > > そうであったとしても、`yield return`で待ち合わすという処理をしていないのであれば、コルーチンでも関数でも同じです。 また、Update()を重い処理を避ける理由は、毎フレーム処理されるためですが、そう考えると * 毎フレーム、コルーチンを呼び出している場合は、そもそも意味がない * そうでない場合、フレーム間の時間を表す`Time.deltaTime`を使うのは不適切 となるので、素直にUpdate()内に書いてしまったほうがよろしいかと思います。 > > Quaternion.Angle()を使う具体的な方法がわかる方、もしおられましたらご一報ください。 > > > 以下のようにすればよいです。 ``` Quaternion targetRotation; // 追加 // ...(中略) void Update() { //全てのアニメーションをリセット moveResaet(); //初期値からいくつ回転したのかを調べる float angle = Quaternion.Angle(transform.rotation, targetRotation); // 変更 //ターゲットへ旋回 rb.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation (targetP.transform.position - transform.position), Time.deltaTime * 10f); //見るだけなので動かない rb.velocity = Vector3.zero; if (angle < 10f * Time.deltaTime) { animator.SetBool("Idle", true); } else { animator.SetBool("Walk", true); } targetRotation = transform.rotation; // 追加 } ``` ちなみに、以下のようにした場合は、transformのインスタンス=targetのインスタンスとなり、transformの変更がtargetにも反映されてしまうため、うまくいきません。 ``` Transform target; // ...(中略) void Update() { // ...(中略) float angle = Quaternion.Angle(transform.rotation, target.rotation); // ...(中略) target = transform; } ```