一、向量计算 (Vector3)
1. 基本向量操作
// 获取两点之间的方向向量
Vector3 direction = (target.position - transform.position).normalized;
// 计算两点距离
float distance = Vector3.Distance(pointA, pointB);
// 计算点积(判断角度关系)
float dotProduct = Vector3.Dot(vectorA, vectorB);
// 计算叉积(获取垂直向量)
Vector3 crossProduct = Vector3.Cross(vectorA, vectorB);
2. 向量应用示例
// 使物体朝向目标移动
void MoveTowardsTarget(Transform target)
{
Vector3 direction = (target.position - transform.position).normalized;
transform.position += direction * moveSpeed * Time.deltaTime;
}
// 判断物体是否在玩家前方
bool IsInFrontOfPlayer(Vector3 objectPosition)
{
Vector3 toObject = objectPosition - player.position;
float dot = Vector3.Dot(player.forward, toObject.normalized);
return dot > 0.7f; // 角度小于45度
}
二、角度计算
1. 角度计算方法
// 计算两个向量之间的角度
float angle = Vector3.Angle(vectorA, vectorB);
// 计算带符号的角度(指定旋转轴)
float signedAngle = Vector3.SignedAngle(vectorA, vectorB, Vector3.up);
// 限制角度范围
float clampedAngle = Mathf.Clamp(angle, minAngle, maxAngle);
2. 角度应用示例
// 平滑转向目标方向
void SmoothLookAt(Vector3 targetPosition)
{
Vector3 direction = (targetPosition - transform.position).normalized;
Quaternion targetRotation = Quaternion.LookRotation(direction);
transform.rotation = Quaternion.Slerp(
transform.rotation,
targetRotation,
rotationSpeed * Time.deltaTime
);
}
// 判断物体是否在视野范围内
bool IsInView(Vector3 targetPosition)
{
Vector3 toTarget = targetPosition - camera.position;
float angle = Vector3.Angle(camera.forward, toTarget);
return angle < fieldOfView * 0.5f;
}
三、旋转处理 (Quaternion)
1. 旋转操作方法
// 创建旋转
Quaternion rotation = Quaternion.Euler(0, 90, 0); // 绕Y轴旋转90度
// 旋转插值
Quaternion.Slerp(currentRotation, targetRotation, t);
// 创建朝向旋转
Quaternion lookRotation = Quaternion.LookRotation(direction);
// 旋转向量
Vector3 rotatedVector = rotation * Vector3.forward;
2. 旋转应用示例
// 使物体始终朝向摄像机
void FaceCamera()
{
Vector3 toCamera = camera.position - transform.position;
toCamera.y = 0; // 保持水平
transform.rotation = Quaternion.LookRotation(toCamera);
}
// 围绕点旋转
void OrbitAroundPoint(Vector3 centerPoint)
{
transform.RotateAround(centerPoint, Vector3.up, orbitSpeed * Time.deltaTime);
}
四、方向处理
1. 方向计算方法
// 获取物体前方方向
Vector3 forward = transform.forward;
// 获取物体右方方向
Vector3 right = transform.right;
// 获取物体上方方向
Vector3 up = transform.up;
// 获取水平方向(忽略Y轴)
Vector3 horizontalDirection = new Vector3(direction.x, 0, direction.z).normalized;
2. 方向应用示例
// 计算侧面接近方向
Vector3 CalculateSideApproach(Vector3 targetPosition, SideApproach side)
{
Vector3 toTarget = (targetPosition - transform.position).normalized;
Vector3 sideDirection = (side == SideApproach.Left) ?
Vector3.Cross(toTarget, Vector3.up).normalized :
Vector3.Cross(Vector3.up, toTarget).normalized;
return Vector3.Lerp(toTarget, sideDirection, 0.5f);
}
// 计算摄像机前方位置
Vector3 GetPositionInFrontOfCamera(float distance)
{
return camera.position + camera.forward * distance;
}
五、实用工具方法
1. 位置转换
// 世界坐标转局部坐标
Vector3 localPosition = transform.InverseTransformPoint(worldPosition);
// 局部坐标转世界坐标
Vector3 worldPosition = transform.TransformPoint(localPosition);
2. 射线检测
// 地面检测
bool IsGrounded()
{
return Physics.Raycast(
transform.position,
Vector3.down,
groundCheckDistance,
groundLayer
);
}
3. 平滑过渡
// 平滑移动
Vector3.SmoothDamp(current, target, ref velocity, smoothTime);
// 平滑旋转
Quaternion.SmoothDamp(current, target, ref velocity, smoothTime);
六、综合应用示例
1. 预测落点
Vector3 PredictLandingPosition(Vector3 start, Vector3 velocity)
{
// 简单抛物线预测
float time = (2 * velocity.y) / Physics.gravity.y;
return start + velocity * time + 0.5f * Physics.gravity * time * time;
}
2. 物体朝向摄像机但保持水平
void FaceCameraHorizontally()
{
Vector3 toCamera = camera.position - transform.position;
toCamera.y = 0; // 忽略Y轴差异
transform.rotation = Quaternion.LookRotation(toCamera);
}
3. 计算物体在屏幕上的位置
Vector3 GetScreenPosition(Vector3 worldPosition)
{
return camera.WorldToScreenPoint(worldPosition);
}