我试图从第二章末尾的"团结行动"一书中理解示例的物理含义。在此代码中,对象正在移动到帧中的"增量"Vector3。这里的矢量3是一个速度矢量吗?如果是,为什么作者在同一向量中使用重力变量和重力加速度值 (9.8(?
public class FPSInput : MonoBehaviour {
public float speed = 6.0f;
public float gravity = -9.8f;
private CharacterController _charController;
void Start() {
_charController = GetComponent<CharacterController>();
}
void Update() {
float deltaX = Input.GetAxis("Horizontal") * speed;
float deltaZ = Input.GetAxis("Vertical") * speed;
Vector3 movement = new Vector3(deltaX, 0, deltaZ);
movement = Vector3.ClampMagnitude(movement, speed);
movement.y = gravity;
movement *= Time.deltaTime;
movement = transform.TransformDirection(movement);
_charController.Move(movement);
}
}
Vector3 移动是游戏一帧(更新(中角色移动差异的矢量。
因此,要移动,他首先采用 X 轴和 Z 轴的用户控件,将它们乘以速度。
然后你需要施加重力,因为没有它,你将飞到任何你想飞的地方而不是步行,所以你需要对垂直轴Y应用重力。
然后,您需要将所有内容(此移动矢量(乘以增量时间,增量时间表示帧更新和渲染所花费的时间。如果没有增量时间,您将在不同的帧速率下获得不同的结果。
然后他将"运动"向量(正如我所说的一帧中的运动差异(应用于角色的当前位置。
在统一中有两种移动对象
- 向单位添加一个力并推动它移动
- 每次经过时设置单元位置(也称为幻灯片单元(
在您的情况下,它是类型 2,因此您的Vector3
运动指示移动单元的位置。
在您的代码中,移动是通过具有速度值的多个Input.GetAxis()
(值范围:[0, 1](计算的,然后将最大距离作为单位可以移动的间隔movement = Vector3.ClampMagnitude(movement, speed);
。它仅用于单位在地面上移动(左,右,向前,向后(
接下来是对于单位高度,移动应用 y 轴等于重力值 (9,8( 乘以 deltaTime。这意味着每 1 秒单位高度将减少 9.8
毕竟,将movement
从本地转换为世界,然后按movement
设置移动单元的位置。
希望我的回答可以解决您的问题。