前言
RTS单位旋转至目标单位,发动攻击,或施法。
1 旋转
- 获取两单位间的方向向量
- 获取方向向量的旋转四元数
- 插值旋转值,并赋值给旋转单位
public static Quaternion RotateToTargetLerp(Transform startTransform, Transform targetPosition,
float angleSpeed)
{
Vector3 targetDirection = (targetPosition.position - startTransform.position).normalized;
Quaternion targetRotation = Quaternion.LookRotation(targetDirection);
Quaternion ret = Quaternion.Lerp(startTransform.rotation, targetRotation, Time.deltaTime * angleSpeed);
return ret;
}
2 2D下判断是否转向目标角度
2.1 欧拉角判断
public static bool IsRotateToAngleByEluer2D(Vector3 forwardEluerAngles, Vector3 targetEluerAngles, float errorRadian)
{
return Mathf.Abs(forwardEluerAngles.y - targetEluerAngles.y) < errorRadian;
}
2.2 向量投影
单位朝向和方向向量可以不是标准化
public static bool IsRotateToAngleByVector(Vector3 forward, Vector3 targetDirection, float errorRadian)
{
Vector2 start = Vector3ToVector2XZ(forward);
Vector2 end = Vector3ToVector2XZ(targetDirection);
return Vector3.Angle(start, end) < errorRadian;
}
public static Vector2 Vector3ToVector2XZ(Vector3 changeV3)
{
return new Vector2(changeV3.x, changeV3.z);
}