如图:cube在cube(2)的前方、
public class DotTest : MonoBehaviour
{
public GameObject a;
public GameObject b;
// Start is called before the first frame update
void Start()
{
var v=Vector3.Dot(a.transform.forward,b.transform.position
-a.transform.position);
Debug.Log(v);
}
}
结果显示:
unity官方文档这样描述:
这里我将两个向量传入,第一个为cube本身的正方向,第二个为cube指向cube(2)的方向,由于向量点乘等于其各自模长相乘再乘上二者之间的余弦值,所以Vector3.Dot返回值的正负取决于其夹角。
可以看到测试时夹角大于90°,可以试想一下,对于a.transform.forward和b.transform.position
-a.transform.position这两个向量,当cube(2)在自身(cube)的前方时,其夹角永远小于90°,在后方时,永远大于90°,如此可依据点乘来判断“敌人”相对于自身的位置(前方or后方)
那么如何得到角度的具体值呢?我们可以利用反三角函数,其API为
同理还有其它三角函数的这里就只考虑这个,既然返回的是弧度,那就需要弧度转角度,再乘一个Mathf.Rad2Deg即可。
public class DotTest : MonoBehaviour
{
public GameObject a;
public GameObject b;
// Start is called before the first frame update
void Start()
{
var v=Vector3.Dot(a.transform.forward,b.transform.position-a.transform.position);
Debug.Log(v);
var v1=Mathf.Acos(v/((b.transform.position-
a.transform.position).magnitude))*Mathf.Rad2Deg;
Debug.Log(v1);
}
}
值得注意的是:Acos里应传入角度,也就是要用v除去两向量的模长,但是forward模长为1可以不用考虑
结果为:
或者:
public class DotTest : MonoBehaviour
{
public GameObject a;
public GameObject b;
// Start is called before the first frame update
void Start()
{
var v=Vector3.Dot(a.transform.forward,(b.transform.position-a.transform.position).normalized);
Debug.Log(v);
var v1=Mathf.Acos(v)*Mathf.Rad2Deg;
Debug.Log(v1);
}
}
或者
var x=Vector3.Angle(a.transform.forward,b.transform.position-a.transform.position);
Debug.Log(x);