向量

public class L4 : MonoBehaviour
{
    public Transform target;
    private Vector3 startPos;
    private float time;
    private Vector3 nowTarget;
    // Start is called before the first frame update
    void Start()
    {
        startPos = transform.position;
        //Vector3
        //位置 - 代表一个点

        //向量 - 代表一个方向

        //向量模长
        Vector3 A= new Vector3(1,1,1);
        print(A.magnitude);

        //单位向量(x/模长,y/模长,z/模长)
        print(A.normalized);

        //向量相加首位相连

        //位置+向量=位置 位置和向量相加=平移位置

        //向量相减 头连头,尾连尾 A-B=B头指A头

        //向量点乘=标量
        //AB=(XA*XB+YA*YB+ZA*ZB) A点乘B得到B在A上的投影长度
        //AB>0 两个向量的夹角为锐角
        //AB=0 两个向量夹角为为直角
        //AB<0 两个向量的夹角为钝角
        //用这个规律判断敌方大致方位

        //向量夹角
        //Cos C = 单位向量A 点乘 单位向量B
        //C = Acos(单位向量A 点乘 单位向量B)

        //向量叉乘=向量
        Vector3.Cross(target.position, transform.position);
        //叉乘几何意义 得到平面法向量
        //A x B = -(B x A)
        //A x B = C
        //C.y > 0 代表B在A的右侧
        //C.y < 0 代表B在A的左侧

    }

    // Update is called once per frame
    void Update()
    {
        //调试画线
        //起始点,结束点,颜色
        Debug.DrawLine(this.transform.position, transform.forward + transform.position, Color.cyan);
        //起始点,方向,颜色
        Debug.DrawRay(transform.position,transform.forward, Color.magenta);

        //通过点乘判断对象方位
        float dotResult = Vector2.Dot(transform.forward, target.position - transform.position);
        if (dotResult > 0)
        {
            print("在前方");
        }

        //通过点乘算出夹角
        dotResult = Vector3.Dot(transform.forward, (target.position - transform.position).normalized);
        print(Mathf.Acos(dotResult)*Mathf.Rad2Deg);

        //Vector3中提供了计算两个向量之间夹角的方法
        print(Vector3.Angle(transform.forward,(target.position-transform.position)));

        //向量插值运算
        //线性插值
        //先快后慢 每帧改变start的位置
        transform.position = Vector3.Lerp(transform.position, target.position, Time.deltaTime);

        //匀速 每帧改变t 当t>=1时 得到结果
        //因为time一直在累加,所以不清零的话就会直接移动到目标位置
        if(nowTarget!=target.position)
        {
            nowTarget = target.position;
            time = 0;
            startPos = transform.position;
        }
        time += Time.deltaTime;
        transform.position = Vector3.Lerp(startPos, nowTarget,time);

        //球形插值
        transform.position = Vector3.Slerp(Vector3.right*10,Vector3.forward*10,time);
    }
}

posted @ 2025-03-21 09:08  cannedmint  阅读(18)  评论(0)    收藏  举报