我的问题是它知道转动,因为我添加了 debug.log 语句,但即使我有 quaternion.RotateTowards 函数,它仍然不会转动。
起初我尝试用transform.Rotation替换Quaternion.RotateTowards,它有效,但它是即时旋转。我有一种感觉,你可以使用 lerping,但我不确定如何使用 lerp。这是我的代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class missileScript : MonoBehaviour
{
public Transform player;
public float moveSpeed = 2f;
public float turnSpeed = -30f; // Turn speed in degrees per second
private float distanceToPlayer;
private float moveX;
private float moveY;
public float turnQuaternionSpeed;
void Start()
{
}
void FixedUpdate()
{
distanceToPlayer = Vector3.Distance(player.transform.position, transform.position);
if (distanceToPlayer < 8.58f)
{
fire();
}
}
void fire()
{
float direction = player.position.y - transform.position.y;
// Ensure direction is not zero to prevent division by zero
if (direction !=0.5)
{
direction = direction / Mathf.Abs(direction); // Normalize direction to -1 or 1
Debug.Log(direction);
float currentZRotation = transform.rotation.z;
float targetZRotation = currentZRotation + (direction * turnSpeed);
Quaternion targetRotation = Quaternion.Euler(0, 0, targetZRotation);
// Use RotateTowards for smoother rotation
Quaternion.RotateTowards(transform.rotation, targetRotation, turnQuaternionSpeed);
// Calculate movement direction
float rotationInRadians = transform.eulerAngles.z * Mathf.Deg2Rad;
moveY = Mathf.Sin(rotationInRadians);
moveX = Mathf.Cos(rotationInRadians);
Vector2 moveDirection = new Vector2(-moveX, -moveY).normalized * moveSpeed * Time.fixedDeltaTime;
transform.Translate(moveDirection, Space.World);
}
}
}
我不太明白你对目标旋转的计算。
但首先请注意,旋转是一个
Quaternion
,不是 3 个而是 4 个分量 x, y, z, w
在 -1 到 1 的范围内移动。所以
float currentZRotation = transform.rotation.z;
在大多数用例中绝对不是您想要访问的东西。
要获得 Z 轴上的旋转,有几种方法 - 如果您从不围绕任何其他轴旋转,最简单的方法是检查全局向上向量并执行例如
float currentZRotation = Vector3.SignedAngle(Vector3.up, transform.up);
另一种方法可能是穿过
Euler
空间并做
float currentZRotation = transform.eulerAngles.z;
但请注意
当您读取 .eulerAngles 属性时,Unity 会将四元数的旋转内部表示转换为欧拉角。因为使用欧拉角表示任何给定旋转的方法不止一种,因此您读回的值可能与您分配的值有很大不同。如果您尝试逐渐增加值来生成动画,这可能会导致混乱。
为了避免此类问题,建议使用旋转的方法是在读取 .eulerAngles 时避免依赖一致的结果,特别是在尝试逐渐增加旋转以生成动画时。有关实现此目的的更好方法,请参阅四元数 * 运算符。