【问题标题】:Unity ball with constant speed匀速团结球
【发布时间】:2015-12-24 02:19:27
【问题描述】:

我正在制作 2D 手机游戏,我有一个球,但我的球没有恒定的移动速度。我需要做什么? 当我在我的安卓设备上构建游戏时,球有不同的速度。在这种情况下,我的游戏无法玩。

我希望有人可以帮助我。谢谢。

这是我的启动功能:

void Start () {
    GetComponent<Rigidbody2D> ()
        .AddForce (new Vector2 (1f, 0.5f)* Time.deltaTime * force);
}

如果我在代码中使用“Application.LoadLevel ("__Scena_0");”在我失去“生命”时加载现有场景,这是一个好习惯吗?当我失去“生命”并尝试第二次玩游戏时,就会出现问题。

当我的球击中触发对象时,我的更新函数是关于 OnTriggerEnter2D。

编辑 23.12.2015。 :通过添加物理材料(小说 0)和添加到脚本来解决问题:

using UnityEngine.SceneManagement;
...
SceneManager.LoadScene ("MainScene");

【问题讨论】:

  • 你有一些代码要显示吗?您的问题是您不知道如何实现,还是无法正常工作?
  • 这是我的启动函数: void Start () { GetComponent ().AddForce (new Vector2 (1f, 0.5f)* Time.deltaTime * force); } 我为我的墙壁和球添加了弹性
  • 但是“有各种速度”和“我的游戏不能玩”是什么意思?请解释你期待什么以及你看到什么。您是否希望球以恒定速度移动,但事实并非如此?
  • 不,当我在我的安卓设备上构建该游戏时,第一次:球移动正常(就像在我的统一编辑器上一样),第二次(失去“生命”之后):球移动非常高速度。我有墙壁,有时,我的球会穿过墙壁。 :(
  • 所以,请用更好的描述更新您的问题,并显示更多代码,包括重新创建球的时间、更新功能以及其他可能有助于理解它的内容。如果没有,那就只能猜测了。

标签: unity3d


【解决方案1】:

问题是力向量的计算:

new Vector2 (1f, 0.5f) * Time.deltaTime * force

您使用 Time.deltaTime 作为一个因素,这意味着施加的力不是恒定的,而是取决于 deltaTime,即最后一帧的持续时间。这就解释了为什么它会随机变化。

我认为 Time.deltaTime 不是您想要的,请尝试删除该因素并相应地调整“力”因素。您现在应该有一个恒定的力,独立于您所玩的平台。

【讨论】:

  • 没关系,兄弟,但现在,我的球失去了速度。现在速度不是恒定的。我想要一个始终具有相同速度的球。如果这是可能的。
  • 如果速度下降,这是因为摩擦。您可以创建一个新的物理材质并将其摩擦力设置为 0。然后将此材质分配给您的碰撞器。您不应再因摩擦而失去速度。
【解决方案2】:

创建一个新的Physics Material,将摩擦设置为零并将其添加到您的对象中。如果你的物体没有摩擦,它的速度就不能降低。然后,在 Rigidbody2D 上使用AddForce() 来加速。

【讨论】:

  • 我以前用过这个,我也有同样的问题。如果我在代码中使用“Application.LoadLevel ("__Scena_0");”在我失去“生命”时加载现有场景,这是一个好习惯吗?当我失去“生命”并尝试第二次玩游戏时,就会出现问题。
  • 使用“Application.LoadLevel(Application.loadedLevel);”重置当前级别
  • 谢谢。你解决了我的问题。但我现在的问题是我的球失去了速度:D
【解决方案3】:

假设您的球和碰撞的墙壁具有没有摩擦的弹性材料。试试

public float _ballSpeed = 2.5f;
Rigidbody2D _rb;

void Start()
{
    _rb = GetComponent<Rigidbody2D>();
    _rb.velocity = Vector2.one * _ballSpeed;
}
void Update()
{

}

由此你可以通过_ballSpeed控制球速

//========== OR ==========//

如果您想在球被破坏后仍保持速度。

在任何全局静态变量中保留 _ballSpeed。

假设你有一个名为Globals的类,声明一个变量,如,

public class Globals
{
    public static float BALL_SPEED = 2.5f;
}

现在在 Ball 脚本中

Rigidbody2D _rb;

void Start()
{
    _rb = GetComponent<Rigidbody2D>();
    _rb.velocity = Vector2.one * Globals.BALL_SPEED;
}
void Update()
{

}

【讨论】:

  • 在你的代码之后,我的球没有从墙上反弹,球在右上角并且不断地撞到墙上
  • 感谢您的回答,但它不需要这个。它是关于虚构 0 和删除 Time.deltatime 的物理材料。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2017-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-12
相关资源
最近更新 更多