Vector3.Dot

如图: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);

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值