Unity C#Player使用Rigidbody2D.AddForce进行得太快了

时间:2016-04-20 13:51:35

标签: c# vector unity3d 2d unity5

所以我想在 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)

}
}

4 个答案:

答案 0 :(得分:1)

我对这里的答案感到非常惊讶,他们离开了。您的问题是您在更新中添加了力,每次调用都会调用。这意味着在游戏的每一帧中,物体将获得更多的力并且无限加速。

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

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

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

    // (JumpScript)
}

答案 1 :(得分:0)

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

然而,迟早知道一些物理学会变得非常方便。绝对最低限度是了解牛顿定律。

在您的情况下,如果您完全致力于使用AddForce(),则可以使用ForceMode.Impulse作为第3个参数来为您的对象提供即时推送(而不是逐渐加速)。这样你只需要调用AddForce()一次,而不是重复。您可以通过动能公式计算所需的精确力量:

  

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

答案 2 :(得分:0)

我也在团结一致地编写像你这样的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,但也许这并不重要。

答案 3 :(得分:0)

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

P.S:如果你正在创造某种无限的亚军游戏,我会考虑移动和重用环境而不是玩家。