Mathf.Atan2 とは

投稿者: | 2020-04-13


Mathf.Atan2(y, x)は、上の角度θをラジアンで返します。角度θは tanθ=y/x から求められます。

角度が0度のときラジアンも0で、180度のとき π(パイ)=3.14…です。

270度の場合 -1.57…なので、角度の範囲は -π < θ <= π のようです。
分母のxが0でもちゃんと使えます。

引数を transforma.forward.x と transform.forward.z にすると、真上から見下ろした時の、オブジェクトの向きとZ軸とのなす角が返るはずです。

すると、Z軸方向を向いていたオブジェクトが右を向くと、この角度は上がって、左を向くと下がります。例えば左回りをしていると、真後ろに来た時に、角度が急上昇するような段差があります。

矢印と猿をデフォルトでZ軸方向に向くように配置します。

矢印をY軸で回転させて、猿がそれについていくようにしたいです。
それには、矢印と猿のなす角θを求めて、その分猿を回転させます。矢印のtransform.forwardとZ軸とのなす角をθ1、猿のをθ2とすると、θは θ1 – θ2で求められます。

猿にスクリプトをつけます。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Atan2Script : MonoBehaviour
{
    public GameObject arrow;
    public float speed;

    // Start is called before the first frame update
    void Start()
    {
        Debug.Log("Mathf.Atan2(0, 1) = " + Mathf.Atan2(0, 1));
        Debug.Log("Mathf.Atan2(1, 0) = " + Mathf.Atan2(1, 0));
        Debug.Log("Mathf.Atan2(0, -1) = " + Mathf.Atan2(0, -1));
        Debug.Log("Mathf.Atan2(-1, 0) = " + Mathf.Atan2(-1, 0));
    }


    private void FixedUpdate()
    {
        float rad_y = Mathf.Atan2(transform.forward.x, transform.forward.z);
        float arrow_rad_y = Mathf.Atan2(arrow.transform.forward.x, arrow.transform.forward.z);

        transform.Rotate(0, (arrow_rad_y - rad_y) * speed, 0, Space.World);
    }
}

猿と矢印のtransform.forwardから、それぞれの角度を求めて、その差をtransform.RotateのY座標に入れています。
speedを上げると、猿が回転する速度が早くなります。
Mathf.Atan2を使う必要はないかもしれません。

このままでは、デフォルトの向きの真後ろで、猿が遠回りをします。

コメントを残す

メールアドレスが公開されることはありません。