如何向 RidgedBody 添加力而不导致无限速度增益,同时保持空中控制?

问题描述 投票:0回答:1

我是一个相当新的编码员,我在某些方面遇到了一些大问题,并且仅通过搜索无法找到很好的解决方案。本质上,我遵循了此处链接的基于 RigidBody 的运动教程:

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

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

我尝试过将移动速度添加到持有者 RidgedBody 中,然后在将其添加到玩家速度之前对其进行限制。我还尝试过在旅行时停止所有 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-game-engine game-physics game-development
1个回答
0
投票

你能利用国家吗? (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);
}

} 像这样... 这不是一个好的代码,但我希望能给你一点帮助。

© www.soinside.com 2019 - 2024. All rights reserved.