【问题标题】:Unity C# Player going too fast with Rigidbody2D.AddForceUnity C# Player 使用 Rigidbody2D.AddForce 的速度太快了
【发布时间】:2016-04-20 13:51:34
【问题描述】:

所以我尝试在 Unity 5 中制作游戏。这是一个2D 游戏,我希望我的角色自动前进。但我的问题是,由于我使用 Rigidbody2D.AddForce,它会不断增加每一帧的力,我不希望这样。我希望我的 速度 保持在 5.0f,而不是或多或少。有没有办法设置限制或保持恒定速度?

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

public Rigidbody2D player;

public bool grounded = false;
private bool hasJumped = false;

public float movementspeed = 5.0f;
public float jumpforce = 450.0f;

// Use this for initialization
void Start () {
    player = GetComponent<Rigidbody2D>();
}

// Update is called once per frame
void Update () {

    player.AddForce(transform.right * movementspeed);

    // (JumpScript)
}

void FixedUpdate(){

    // (JumpScript)

}
}

【问题讨论】:

  • 答案是(1)你必须使用实数单位,单位1米是“真的”1米,单位一公斤真的是一公斤(2)不可能成为物理游戏程序员除非您 .................... 是物理学方面的专家。考虑一下。想象一下你对某人说“我要编程物理”。他们当然会认为你是物理学、机械工程等方面的专家。
  • @Icevx1 你可能想看一些统一的教程here

标签: c# vector unity3d 2d unity5


【解决方案1】:

我对这里的答案感到非常惊讶,他们离得太远了。你的问题是你在更新中增加了力量,这被称为每一帧。这意味着游戏的每一帧对象将获得 5 更多的力并无限加速。

如果您希望对象获得 5 力然后保持该速度,只需将添加力放在开始而不是更新。像这样:

// Use this for initialization
void Start () {
    player = GetComponent<Rigidbody2D>();
    player.AddForce(transform.right * movementspeed);
}

// Update is called once per frame
void Update () {

    // (JumpScript)
}

【讨论】:

  • @Icevx1 作为新用户,如果有用并解决了问题,请记住将答案“勾选”为已接受。谢谢!
  • 代码中的问题是对象会加速 1 帧然后停止。我希望它以固定的速度移动每一帧。
  • 我提供的代码将使该项目仅在一帧内获得额外的力,但该力将保持向后,并且该项目将继续随着该力移动,直到有东西阻止它。你可以把它想象成推一个溜冰者。你只推他一次,他就会随着推力滑出,直到停止。如果这不是您想要达到的结果,请告诉我,我可以帮助您按照您想要的方式完成。
  • 啊...您的代码确实有效,我很抱歉!问题是当我的物体(立方体)触地时它停止了。我通过使用 PhysicsMaterial2D(类似的东西)和未经检查的摩擦来修复它!我很快就会切换到精灵,只是想降低基本机制。
  • 啊,我明白了。很高兴知道你让它工作了。请记住将答案勾选为已接受以关闭问题:)
【解决方案2】:

您可以将 Rigidbody.velocity 设置为 5。

不过,了解一些物理知识迟早会派上用场。绝对最低要求是了解牛顿定律。

在您的情况下,如果您绝对致力于使用AddForce(),您可以使用ForceMode.Impulse 作为第三个参数,以立即推动您的对象(而不是逐渐加速)。这样您就必须只调用一次AddForce(),而不是重复调用。您可以通过动能公式计算出您需要的确切力量:

力 = 0.5f * 质量 * 速度^2

【讨论】:

    【解决方案3】:

    我也在统一编写一个像你这样的 2D 游戏。我使用if 来检查速度并使用另一个变量来表示这样的力:

    public float acel = 50, speed = 5;
    Rigidbody2D rbody;
    void FixedUpdate () {
        // As you want to move right, we don't have to calculate the absolute value
        if (rbody.velocity.x < speed)
            rbody.AddForce(Vector2.right*acel);
    }
    

    速度并不总是 5,但也许这并不重要。

    【讨论】:

      【解决方案4】:

      如果您想使用物理以恒定速度移动您的玩家,那么您需要在开始时施加力,直到达到您想要的速度,然后才将力改为 0。为了使其按预期工作,我还会在角色的碰撞器中添加Physic Material,以确保没有摩擦会减慢角色的速度。

      P.S:如果您正在创建某种无限奔跑游戏,我会考虑移动和重用环境而不是玩家。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-23
        • 1970-01-01
        • 2013-07-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多