为什么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.forward
和 transform.right
指的是玩家的前进方向和右侧方向。当您将 transform.forward * speed
添加到您的 newPosition
时,您添加的是玩家的前进方向,但具有速度的幅度(长度)。
如果你想更好地理解它,你可以使用 print(transform.forward)
或 print(transform.forward * speed)
或者做 Debug.drawRay(transform.position, transform.forward)
我正在为我的相机统一移动。我的相机的起始位置是 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.forward
和 transform.right
指的是玩家的前进方向和右侧方向。当您将 transform.forward * speed
添加到您的 newPosition
时,您添加的是玩家的前进方向,但具有速度的幅度(长度)。
如果你想更好地理解它,你可以使用 print(transform.forward)
或 print(transform.forward * speed)
或者做 Debug.drawRay(transform.position, transform.forward)