一、常用变量
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中的点乘、叉乘和归一化是非常基本且实用的操作,广泛应用于碰撞检测、物理模拟、光照计算、相机控制等多个领域。