为什么我的代码应该针对并转向玩家不起作用?顺便说一句,我填写了所有变量

问题描述 投票:0回答:1

我的问题是它知道转动,因为我添加了 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);
            
        }
    }




}
unity-game-engine quaternions
1个回答
0
投票

我不太明白你对目标旋转的计算。

但首先请注意,旋转是一个

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 时避免依赖一致的结果,特别是在尝试逐渐增加旋转以生成动画时。有关实现此目的的更好方法,请参阅四元数 * 运算符。

© www.soinside.com 2019 - 2024. All rights reserved.