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を使う必要はないかもしれません。
このままでは、デフォルトの向きの真後ろで、猿が遠回りをします。