Rigidbody2D.AddForce Unity C# Player 运行速度太快
Unity C# Player going too fast with Rigidbody2D.AddForce
所以我正在尝试在 Unity 5 中制作游戏。这是一款 2D 游戏,我希望我的角色自动前进。但我的问题是,由于我使用 Rigidbody2D.AddForce,它会不断增加每一帧的力,我不希望这样。我希望我的 speed 为 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)
}
}
您可以将 Rigidbody.velocity 设置为 5。
然而,迟早了解一些物理知识会派上用场。绝对最低限度是了解牛顿定律。
在您的情况下,如果您绝对致力于使用 AddForce()
,则可以使用 ForceMode.Impulse
作为第三个参数来为您的对象提供即时推动(而不是逐渐加速)。这样,您只需调用 AddForce()
一次,而不是重复调用。您可以通过动能公式计算出您需要的确切力量:
Force = 0.5f * Mass * Velocity^2
我也在用 unity 写一个和你一样的 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,但也许这并不重要。
我对这里的答案感到非常惊讶,他们离得很远。你的问题是你在更新中增加了力量,这被称为每一帧。这意味着游戏的每一帧对象都会获得 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)
}
如果你想使用物理以恒定速度移动你的玩家,那么你需要在开始时施加力,直到达到你想要的速度,然后才将力更改为 0。为了使其工作预期我还会向角色的碰撞器添加一个 Physic Material 以确保没有摩擦减慢角色。
P.S:如果您正在创建某种无限跑酷游戏,我会考虑移动和重用环境而不是玩家。
所以我正在尝试在 Unity 5 中制作游戏。这是一款 2D 游戏,我希望我的角色自动前进。但我的问题是,由于我使用 Rigidbody2D.AddForce,它会不断增加每一帧的力,我不希望这样。我希望我的 speed 为 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)
}
}
您可以将 Rigidbody.velocity 设置为 5。
然而,迟早了解一些物理知识会派上用场。绝对最低限度是了解牛顿定律。
在您的情况下,如果您绝对致力于使用 AddForce()
,则可以使用 ForceMode.Impulse
作为第三个参数来为您的对象提供即时推动(而不是逐渐加速)。这样,您只需调用 AddForce()
一次,而不是重复调用。您可以通过动能公式计算出您需要的确切力量:
Force = 0.5f * Mass * Velocity^2
我也在用 unity 写一个和你一样的 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,但也许这并不重要。
我对这里的答案感到非常惊讶,他们离得很远。你的问题是你在更新中增加了力量,这被称为每一帧。这意味着游戏的每一帧对象都会获得 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)
}
如果你想使用物理以恒定速度移动你的玩家,那么你需要在开始时施加力,直到达到你想要的速度,然后才将力更改为 0。为了使其工作预期我还会向角色的碰撞器添加一个 Physic Material 以确保没有摩擦减慢角色。
P.S:如果您正在创建某种无限跑酷游戏,我会考虑移动和重用环境而不是玩家。