如何在保持空气控制的同时,在不造成无限速度增益的情况下向 RidgedBody 增加力?

How to add force to a RidgedBody without causing infinite velocity gain while keeping air-control?

提问人:ErraticSignal 提问时间:11/16/2023 最后编辑:ErraticSignal 更新时间:11/16/2023 访问量:35

问:

我是一个相当新的编码员,我遇到了一些大问题,我无法通过搜索找到一个好的修复程序。从本质上讲,我遵循了此处链接的基于 RigidBody 的运动教程:

(https://www.youtube.com/watch?v=f473C43s8nE&t=1s)。

在其中,它通过使用 rb 创建玩家的移动方式。此外,为了阻止玩家在空中移动得太快和/或创造无限速度,它有一个系统,如果刚体的大小超过最大速度,它会做一些事情来阻止玩家移动得更快。我正在尝试实现一种“Boost/Dash”,这将为玩家提供大量的垂直和水平动量,我目前通过 rb 来做到这一点。添加力。但问题是,由于速度控制系统,我无法让玩家以我想要的速度移动,但如果我移除速度控制,玩家将能够在半空中无限快地移动。

我尝试过一些事情,例如将移动速度添加到持有者 RidgedBody 中,然后在将其添加到玩家速度之前对其进行限制。我还尝试过在旅行时停止所有 wasd 运动,它能够允许在没有任何无限速度增益的情况下进行助推,但它也停止了所有空中控制,这感觉真的很糟糕。

基本上总结一下整个问题,我需要玩家不要仅仅通过空中飞行来获得大量速度,尽管我需要玩家仍然能够比基本移动速度上限更快,只是他们只能通过简单的移动而不是简单的移动(如wasd和跳跃)的力量来跑得那么快。

 private void Dash()
{
    rb.velocity = new Vector3(0,0,0);
    rb.angularVelocity = new Vector3(0,0,0);
    rb.AddForce(orientation.forward * hDashForce, ForceMode.Impulse);
    rb.AddForce(transform.up * vDashForce, ForceMode.Impulse);
}

private void MovePlayer()
{
    moveDirection = orientation.forward * vInput + orientation.right * hInput;
        if (grounded)
        {
            rb.AddForce(moveDirection.normalized * 10f * movespeed, ForceMode.Force);
        }
        else
        {
            rb.AddForce(moveDirection.normalized * 10f * movespeed * airMultiplier, ForceMode.Force);
        }
}

private void SpeedControl()
{
    Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
    if (flatVel.magnitude > maxspeed)
    {
        Vector3 limitedVel = flatVel.normalized * maxspeed;
        rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
    }
}
C# unity-游戏引擎 -物理 游戏 开发

评论

0赞 Jakob Tinhofer 11/16/2023
欢迎使用 Stack Overflow。没有代码很难提供帮助,因此您可能希望将其添加到您的问题中。
0赞 hijinxbassist 11/16/2023
看起来你可以简单地增加变量,从而提高上限,然后在完成后将其设置回原始值。movespeed

答:

0赞 이성규 11/16/2023 #1

你能使用状态吗?(https://en.wikipedia.org/wiki/Finite-state_machine) 我认为在破折号和正常移动之间划分状态。

所以。。。我更改的代码略有不同......

private void SpeedControl(){
Vector3 flatVel = new Vector3(rb.velocity.x, 0f, rb.velocity.z);
float dashMaxSpeed = ??f;
if (state == dash)
maxspeed = dashMaxSpeed;
else
maxspeed = normalMaxSpeed;

if (flatVel.magnitude > maxspeed)
{
    Vector3 limitedVel = flatVel.normalized * maxspeed;
    rb.velocity = new Vector3(limitedVel.x, rb.velocity.y, limitedVel.z);
}

} 喜欢这个。。。 这不是一个好的代码,但我希望能给你一点想法。