gpt4 book ai didi

c# - 根据 Y 值,Unity 中的跳跃不一致

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:15 25 4
gpt4 key购买 nike

我正在 Unity 中制作一款游戏,您可以使用 WASD 和跳跃空间四处移动。这是我的代码:

using UnityEngine;

public class PlayerMovement : MonoBehaviour {

public Rigidbody rb;
public bool canJump;

void FixedUpdate () {
if (Input.GetKey("w"))
{
rb.AddForce(0, 0, 750 * Time.deltaTime, ForceMode.Acceleration);
}

if (Input.GetKey("a"))
{
rb.AddForce(-750 * Time.deltaTime, 0, 0, ForceMode.Acceleration);
}

if (Input.GetKey("s"))
{
rb.AddForce(0, 0, -750 * Time.deltaTime, ForceMode.Acceleration);
}

if (Input.GetKey("d"))
{
rb.AddForce(750 * Time.deltaTime, 0, 0, ForceMode.Acceleration);
}

if (canJump)
{
if (Input.GetKeyDown("space"))
{
rb.AddForce(0, 10, 0, ForceMode.VelocityChange);
Debug.Log("jump");
canJump = false;
}
}

Vector3 v = rb.velocity;
v.y = 0;
v = Vector3.ClampMagnitude(v, 6);
v.y = rb.velocity.y;
rb.velocity = v;
}

void OnCollisionEnter(Collision other)
{
if (other.gameObject.name == "Ground")
{
canJump = true;
}
}

void OnCollisionExit(Collision other)
{
if (other.gameObject.name == "Ground")
{
canJump = false;
}
}
}

但是,当我跳的时候,它有时跳得很高,有时根本就跳不起来。我已经测试过按住空格键是否有任何不同,但事实并非如此。我已经尝试使用 ForceMode.Impulse 和 ForceMode.VelocityChange,但跳跃仍然不一致。

我还注意到,当玩家在地板上的 Y 值约为 ~0.23 时,它只会跳到空中。也可以是~0.16,像这样,根本跳不高。

这是~0.16 0.16这是~0.23 0.23

最低的跳跃使其达到约 0.7 的 Y 值,但最高的跳跃使其达到 4.83 左右。

如果有人有任何想法,我将不胜感激。

最佳答案

我通常做的是检查我是向上还是向下。如果我向下走,我只接受 groundCheck。

void OnCollisionEnter(Collision other)
{
if (other.gameObject.name == "Ground" && rb.velocity.y < 0)
{
canJump = true;
}
}

但是,您使用 getKeyDOWN 所以它与保持空间等无关。

所以接下来我可以推荐的是:在跳跃之前将 velocity.y 设置为 0。

if (Input.GetKeyDown("space"))
{
Vector3 vel = rb.velocity;
vel.y = 0;
rb.velocity = vel;
rb.AddForce(0, 10, 0, ForceMode.VelocityChange);
// ...
}

编辑:等等,我的第一个想法是“他使用 getKey 并保留空间”,我的第二个想法是:“他错过了 Time.deltaTime”。但现在我看到了:

您在 FixedUpdate 中使用了 Input.Get...!

让我解释一下:

在调用所有 Update 之前评估所有输入。 As you can see in the execution Order输入事件在更新之前处理。

现在,与(几乎)常量 FixedUpdate 相比,Update 会根据您的帧率被频繁调用或很少被调用。

因此 FixedUpdate 可以在 Update 调用之间多次调用。这意味着输入事件运行一次。

所以我必须假设 Input.GetKeyDown(Key.SPACE) 在多个 FixedUpdates 中为真!

简单修复:

bool jump_pressed = false;

void Update()
{
if(Input.GetKeyDown("space"))
{
jump_pressed = true;
}
if(Input.GetKeyUp("space"))
{
jump_pressed = false;
}
}

void FixedUpdate()
{
if(jump_pressed)
{
jump_pressed = false;
rb.AddForce(0, 10, 0, ForceMode.VelocityChange);
// etc...
}
}

因此您只需在更新中处理所有输入逻辑,并在固定更新中执行其余部分。

当然,在 FixedUpdate 中需要将 jump_pressed 设置为 false,否则它会在多个 FixedUpdates 中保持为真。

edit2:我又看了一遍你的代码。无论你做什么,无论是在 FixedUpdate 还是 Update,都不要在 AddForce 中使用 Time.deltaTime

AddForce 将操纵速度。速度在每个 PhysicsUpdate 中用于移动变换。但是 PhysicsUpdate/FixedUpdate 尝试以(几乎)固定的速率运行,而 Time.deltaTime 为您提供最后一个(更新)帧的耗时。

如果您自己移动变换 (position +=...) - 使用 Time.deltaTime。但是当你使用 AddForce 时不要使用它。

关于c# - 根据 Y 值,Unity 中的跳跃不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52112521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com