Joh*_*ohn 4 c# unity-game-engine
我不知道发生了什么事。我通常会在更新功能上进行跳跃。这是我的第一个大型游戏,尽管除了我做过的其他原型或糟糕的游戏尝试之外。
这是我的跳转代码
void FixedUpdate()
{
if (isDead == false)
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (OnGround == true)
{
rb.velocity= new Vector2 (rb.velocity.x, jumpforce * Time.deltaTime);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有时会错过固定更新的一些跳转。但是当我将它放入更新功能时,它有时会跳得很低,比如两到三次,然后它又把我跳得很高。这实在是太随机和奇怪了。我能对此做些什么吗?或者我只需要处理fixedupdate?如果这很重要的话,我什至尝试了 LateUpdate 。
一般经验法则是将所有键盘/鼠标输入放入方法Update而不是FixedUpdate方法中。这样做的原因是因为FixedUpdate不是逐帧处理,而是以固定时间增量调用,在某个帧周期内可以或多或少地调用。
输入数据是每帧确定的,因此在FixedUpdate它可以在帧之间运行、跳帧等的地方,您有可能丢失输入。相反,将输入代码移至Update每帧调用的方法。您将不再丢失输入。
设置物理调用的问题Update是因为所有物理代码都应该放在FixedUpdate. 由于Update运行速度可能比游戏中的物理系统更快或更慢,因此在其中放置基于物理的调用可能会产生意想不到的结果。
统一:
处理 Rigidbody 时应使用 FixUpdate 而不是 Update。例如,当向刚体添加力时,您必须在FixedUpdate 内的每个固定帧而不是Update 内的每个帧应用力。告诉我更多...
解决方案是缓存您的输入Update,然后使用此方法的结果输入进行设置FixedUpdate以确定您的物理特性。
private bool justJumped = false;
void FixedUpdate()
{
if(justJumped)
{
justJumped = false;
rb.AddForce(Vector2.up * jumpForce);
}
}
void Update()
{
if (!justJumped && Input.GetKeyDown(KeyCode.Space) && OnGround && !isDead)
{
justJumped = true;
}
}
Run Code Online (Sandbox Code Playgroud)
我还建议不要直接设置速度,因为如果有任何其他外部力量作用于您的玩家,它们将被忽略。相反,使用AddForce. 我把你的直接速度设置换成了AddForce. 我也不会乘以Time.deltaTime。该值只是一个浮点值,表示自上一帧以来已经过去了多少时间。当进行小增量移动时(例如使用Lerp. 如果您想直接设置速度,请删除该Time.deltaTime产品并jumpforce大幅降低您的速度。你会发现结果是一样的。