我想从Unity上的一个小平台游戏开始。当我移动时,我希望角色看向移动的方向。所以当我按下左/" A"我希望角色立即左转并向前走。其他方向相同。问题是当我离开钥匙时,角色会回到默认旋转状态。
重要代码:
private void FixedUpdate()
{
float inputX = Input.GetAxis("Horizontal"); // Input
float inputZ = Input.GetAxis("Vertical"); // Input
if (GroundCheck()) // On the ground?
{
verticalVelocity = -gravity * Time.deltaTime; // velocity on y-axis
if (Input.GetButtonDown("Jump")) // Jump Key pressed
{
verticalVelocity = jumpPower; // jump in the air
}
}
else // Player is not grounded
{
verticalVelocity -= gravity * Time.deltaTime; // Get back to the ground
}
Vector3 movement = new Vector3(inputX, verticalVelocity, inputZ); // the movement vector
if (movement.magnitude != 0) // Input given?
{
transform.rotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z)); // Rotate the Player to the moving direction
}
rigid.velocity = movement * movementSpeed; // Move the character
}
第二件事是,
transform.rotation = Quaternion.LookRotation(new Vector3(movement.x, 0, movement.z));
y轴上有0。它说观察向量为零。当我传递另一个数字movement.y
时,角色会向地板倾斜。所以我不知道该在那里传递什么。
答案 0 :(得分:0)
关于放开钥匙时的重置:你的行
if (movement.magnitude != 0) // Input given?
是一个好主意,但是你的控制器很有可能略微偏离0,所以即使你实际上没有移动,你的角色的方向也会改变。我会把它改成
if (movement.magnitude >.1f) // Input given?
或接近(但不完全)为零的其他数字。在处理此问题时,我会将Debug.Log(movement.magnitude);
添加到此函数中,并确保值在您期望的范围内。
关于第二个主题: 虽然在运动矢量中使用verticalVelocity非常重要,因为当你将它应用于rigidBody.velocity时,你不希望它面向你的角色向量。如果你想让你的角色只在一个平面上看,那么只考虑两个维度是完全合理的。如上所述,添加第三维可以让它看到天空或地面。此外,我还会更改您的输入检查行以使用它,因为您只想根据角色是否水平移动来改变面部。这将使您的代码看起来像这样:
Vector3 movement = new Vector3(inputX, verticalVelocity, inputZ); // the movement vector
Vector3 horizontalMovement = new Vector3(inputX, 0f, inputZ);
if (horizontalMovement.magnitude != 0) // Input given?
{
transform.rotation = Quaternion.LookRotation(horizontalMovement); // Rotate the Player to the moving direction
}
rigid.velocity = movement * movementSpeed; // Move the character
最后一点,当你接地时,你可能想将verticalVelocity设置为0,而不是-gravity * deltaTime。这个错误可能不可见(物理引擎会将你的角色从地板上抬起来),但是如果用户使用alt-tabs并且框架之间的距离太长,你的角色将会传送到地板!
祝你好运。