c# - ¿Por qué transform.forward cuando es igual a 0 cuando se multiplica no es igual a 0?

CorePress2024-01-24  10

Estoy haciendo movimientos para mi cámara en unidad. La posición inicial de mi cámara es 0,0,0. Cuando presiono la tecla W, el código tomo la posición actual y la multiplico por una velocidad de movimiento y la igualo a otro vector 3 para luego actualizar la posición de la cámara. Funciona muy bien, pero no puedo entender por qué cuando lo pienso.

Si mi cámara se inicializa en 0,0,0, ¿por qué transform.forward * motionSpeed ​​no siempre es igual a 0? Esto es lo mismo para todas las direcciones. Solo usé W como ejemplo.

Cualquier ayuda sería muy apreciada ya que soy nuevo en Unity. Gracias

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);

    }
}


------------------------------------

La razón por la que su código funciona es porque transform.forward y transform.right se refieren a las direcciones hacia adelante y hacia la derecha de su reproductor. Cuando agregas transform.forward * speed a tu newPosition, estás agregando la dirección de avance del jugador pero con una magnitud (longitud) de tu velocidad.

Si quieres intentar entenderlo mejor, puedes usar print(transform.forward) o print(transform.forward * speed) o hacer Debug.drawRay(transform.position, transform.forward)

1

Muchas gracias, aclaraste mi problema. EraPensar que transform.forward se refería a una coordenada que cambiaba dependiendo de la posición de la cámara en lugar de un valor constante, por lo que incluso esperaba que se acelerara cuanto más me alejara del centro del mundo.

- JCoder38

27/03/2021 a las 11:10



------------------------------------

Tu código está multiplicando transform.forward(0,0,1) o transform.right, ambos no son vectores cero, sino que representan la dirección especificada.



------------------------------------

Vector3.forward es (0,0,1) si no quieres usar Vector3.zero.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare