为什么transform.forward当等于0乘以不等于0?

Why does transform.forward when equal to 0 when multiplied not equal to 0?

我正在为我的相机统一移动。我的相机的起始位置是 0,0,0。当我按下 W 键时,我获取当前位置的代码将其乘以移动速度并等于另一个向量 3,然后更新相机位置的位置。效果很好,但我想不明白为什么。

如果我的相机初始化为 0,0,0 那么为什么 transform.forward * movementSpeed 并不总是等于 0? 这对所有方向都是一样的我只是以W为例

任何帮助将不胜感激,因为我是 Unity 的新手。谢谢

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMovement : MonoBehaviour
{
    private Vector3 newPosition;
    [SerializeField] private float movementSpeed;
    [SerializeField] private float movementTime;
    // Start is called before the first frame update
    void Start()
    {
        newPosition = transform.position; 

        Debug.Log(transform.position); //prints 0.0,0.0,0.0
        Debug.Log(transform.forward * movementSpeed); //prints 0.0,0.0,0.3
    }

    // Update is called once per frame
    void Update()
    {
        handleKeyboardInput();
    }

    void handleKeyboardInput()
    {
        if (Input.GetKey(KeyCode.W))
        {
            newPosition += (transform.forward * movementSpeed);
        }

        if (Input.GetKey(KeyCode.A))
        {
            newPosition += (transform.right * -movementSpeed);
        }

        if (Input.GetKey(KeyCode.S))
        {
            newPosition += (transform.forward * -movementSpeed);
        }

        if (Input.GetKey(KeyCode.D))
        {
            newPosition += (transform.right * movementSpeed);
        }
        
        transform.position = Vector3.Lerp(transform.position, newPosition, Time.deltaTime * movementTime);

    }
}

你的代码是乘transform.forward(0,0,1) or transform.right,它们都不是零向量,而是代表指定的方向。

Vector3.forward 是 (0,0,1) 如果你想零使用 Vector3.zero.

您的代码之所以有效,是因为 transform.forwardtransform.right 指的是玩家的前进方向和右侧方向。当您将 transform.forward * speed 添加到您的 newPosition 时,您添加的是玩家的前进方向,但具有速度的幅度(长度)。

如果你想更好地理解它,你可以使用 print(transform.forward)print(transform.forward * speed) 或者做 Debug.drawRay(transform.position, transform.forward)