我们一步一步从最基础的来,刚开始学习Unity的时候分不清up、right、forward,用这张图就非常清晰了
Vector3.forward和transform.forward的区别
-
v3.forward:坐标系中的z轴的正方向(蓝轴),该值固定为(0,0,1)
x、y轴同理 -
transform.forward:物体自身坐标系中的z轴(蓝轴)的方面在世界坐标系中的指向。对于物体来说,该参数就是物体自身的正前方。
x、y轴同理
点乘(Dot)
点乘的数学公式为: a·b=|a|·|b|cos<a,b>(两向量的模与其夹角的余弦值相乘) 其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。
这张图就很好的解释了,我们知道向量的点乘得到的是一个数值,通过点乘的正负值,我们可以判断两个向量的方向关系。
蓝轴------------>人物的正前方
绿轴------------>目标距离人物的向量
判断目标在左还是在右(这个例子并不是很合理)
点乘判断方向 代码如下 前后左右上下已经标记清楚
public Transform target;
void SelfPos()
{
Vector3 delta = target.position - transform.position;
//判断前后
if (Vector3.Dot(transform.forward, delta)>0)
Debug.Log("在前方!!!");
else
Debug.Log("在后方!!!");
//判断左右
if (Vector3.Dot(transform.right, delta) > 0)
Debug.Log("在右方!!!");
else
Debug.Log("在左方!!!");
if (Vector3.Dot(transform.up, delta) > 0)
Debug.Log("在上方!!!");
else
Debug.Log("在下方!!!");
}
之前看到过很多这种写法:“点乘判断前后,叉乘判断左右”,很不理解为什么要这样说,如果只是判断左右问题的话感觉点乘就可以了,像跟随抛物线可以用叉乘。希望有大哥说下为什么要用叉乘来算左右,和点乘算出来的有什么区别
这个是个两个Cube画线的代码 比较简单
using UnityEngine;
public class TestStone : MonoBehaviour
{
public Transform target;
void SelfPos()
{
Vector3 delta = target.position - transform.position;
Debug.DrawLine(transform.position, target.position);
Debug.DrawLine(transform.position, transform.forward * 5);
Debug.DrawLine(transform.position, transform.up*40* Vector3.Dot(transform.right, delta));
}
void Update()
{
SelfPos();
}
}