Unity Vector3常用变量和方法详解

一、常用变量

1、magnitude
  • 返回一个向量的长度
    void MagnitudeTemp()
    {
        Vector3 one = new Vector3(3, 4, 5);
        Debug.Log(string.Format("向量的长度:{0}", one.magnitude));
    }
2、normalized
  • 返回该向量长度为1的新向量
    void ReturenNormalizeTemp()
    {
        Vector3 one = new Vector3(3, 4, 5);
        Debug.Log(string.Format("向量归一化后:{0}", one.normalized)); //不改变原有的值
    }

二、常用方法

1、Normalize()
  • 将向量归一化,直接改变原有的向量。
  • 如果不想原来的向量改变,可以使用.normalized变量,或者Vector3.Normalize(向量) 来得到一个新的向量。
    void NormalizeTemp()
    {
        Vector3 one = new Vector3(3, 4, 5);
        one.Normalize();
        Debug.Log(string.Format("向量归一化后:{0}", one)); //原来的向量已变
    }

2、Angle()
  • 返回两个向量之间的夹角
    void AngleTemp()
    {
        Vector3 one = new Vector3(3, 5, 6);
        Vector3 two = new Vector3(3, 5, 9);
        Debug.Log(string.Format("两个向量的夹角:{0}", Vector3.Angle(one, two)));
    }
3、Lerp()
  • Lerp()方法用于在两个值之间进行线性插值
    #region Lerp平滑移动Cube
    public Transform startPos;
    public Transform endPos;
    float lerpSpeed = 1;
    void LerpMoveCube()
    {
        transform.position = Vector3.Lerp(transform.position, endPos.position, lerpSpeed * Time.deltaTime);
    }
    #endregion
    #region Lerp颜色渐变效果
    public Renderer renderer;
    public Color startColor;
    public Color endColor;
    float duration = 1;
    float colorT = 0;
    void LerpColorChange()
    {
        colorT += Time.deltaTime / duration;
        renderer.material.color = Color.Lerp(startColor, endColor, colorT);
    }
    #endregion
4、LerpUnclamped()
  • 这个方法用法和Lerp()
5、MoveTowards()
  • 用于在当前位置和目标位置之间移动。该方法返回一个新的向量,表示从当前位置到目标位置的移动。
    #region MoveTowards平滑移动Cube
    public Transform moveTowardsTarget;
    public float moveTowardsSeppd = 1;

    void MoveTowardsMoveCube()
    {
        transform.position = Vector3.MoveTowards(transform.position, moveTowardsTarget.position, moveTowardsSeppd * Time.deltaTime);
    }
    #endregion
6、Distance()
  • 返回两个位置之间的距离
    #region 限制移动距离 
    public Transform distanceTowardsTarget;
    public float distanceSeppd = 1;
    public float minDistance = 30;
    void LimitMoveDistance()
    {
        if (Vector3.Distance(transform.position, distanceTowardsTarget.position) > minDistance)
        {
            transform.position = Vector3.MoveTowards(transform.position, distanceTowardsTarget.position, distanceSeppd * Time.deltaTime);
        }
    }
    #endregion
7、Dot()
  • 点积的计算方式为:  a·b=|a|·|b|cos<a,b>  其中|a|和|b|表示向量的模,<a,b>表示两个向量的夹角。
  • 点积计算的结果为数值
  • 点积用来判断前后方向
  • 点击用来判断角度 
    #region 判断是否正面向某个物体
    public Transform dotTarget;

    void DotTowardsTarget()
    {
        var isToWards = Vector3.Dot(transform.forward, dotTarget.position) > 0;
        Debug.Log(string.Format("是否正面向:{0}", isToWards));
    }
    #endregion
    #region 通过点积的值求角度
    void DotToAngle()
    {
        var dotValue = Vector3.Dot(transform.position.normalized, dotTarget.position.normalized);
        var angle = Mathf.Acos(dotValue) * Mathf.Rad2Deg;
        Debug.Log(string.Format("两个向量之间的夹角为:{0}", angle));
    }
    #endregion
8、Cross()
  • 叉积计算的结果是向量。
  • 叉积用来判断左右
  • 叉积也能用来判断角度
    #region 通过叉积的值求角度
    public Transform crossTarget;
    void CrossToAngle()
    {
        var crossValue = Vector3.Cross(transform.position.normalized, crossTarget.position.normalized);
        var angle = Mathf.Asin(Vector3.Distance(Vector3.zero, crossValue)) * Mathf.Rad2Deg;
        Debug.Log(string.Format("两个向量之间的夹角为:{0}", angle));
    }
    #endregion
    #region 配合点积,判断敌人左右前后方位
    void CheackOrientation()
    {
        if (Vector3.Dot(transform.forward, crossTarget.position - transform.position) > 0)
        {
            if (Vector3.Cross(transform.forward, crossTarget.position - transform.position).y > 0)
            {
                Debug.Log("敌人在右前方");
            }
            else
            {
                Debug.Log("敌人在左前方");
            }
        }
        else
        {
            if (Vector3.Cross(transform.forward, crossTarget.position - transform.position).y > 0)
            {
                Debug.Log("敌人在右后方");
            }
            else
            {
                Debug.Log("敌人在左后方");
            }
        }
    }
    #endregion

三、总结

在Unity开发过程中,Vector3中的点乘、叉乘和归一化是非常基本且实用的操作,广泛应用于碰撞检测、物理模拟、光照计算、相机控制等多个领域。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值