【问题标题】:Why doesn't the object bounce correctly at lower speeds in Unity 2D?为什么物体在 Unity 2D 中以较低的速度不能正确反弹?
【发布时间】:2022-02-02 07:23:27
【问题描述】:

附注我已经看到here 提出的这个问题,但这适用于 Unity 3D,而我正在使用 Unity 2D。

我的主要问题是,当速度设置为较低值时,我的 Unity 2D 游戏中的球无法正确弹跳,但在更快的速度下工作正常。请注意,我已经尝试在项目设置中更改反弹阈值,但它并没有解决我的问题。我已经应用了一个 Rigidbody2D 组件 BoxCollider2D 和一个应该使球有弹性的物理材料 2D。

这是我当前的一些设置(如果有帮助的话):

Rigidbody2D 设置:

  • 车身类型:动态
  • 材质:Bouncy(我的物理材质的名称)
  • 模拟:真
  • 使用自动质量:错误
  • 质量:1
  • 线性阻力:0
  • 角阻力:0
  • 重力刻度:0
  • 碰撞检测:离散
  • 睡眠模式:开始醒来
  • 插值:无

物理材料 2D 设置:

  • 摩擦力:0
  • 弹性:1

这里是一些在游戏加载以开始球运动时运行的初始化代码:

float x = Random.value < 0.5f ? -0.75f : 0.75f;
float y = Random.value < 0.5f ? Random.Range(-0.75f, -0.5f) : Random.Range(0.5f, 0.75f);

Vector2 direction = new Vector2(x, y);
rb.AddForce(direction * speed);

注意:此代码位于我为球对象创建的用于管理物理动作的自定义类(继承 MonoBehavior)中。

如需更多信息,请参阅this video 了解游戏如何响应。

我的比赛需要较慢的球速,如果我能在这个问题上得到一些帮助,我将不胜感激。

【问题讨论】:

  • 顺便说一下,统一物理系统是非确定性的,不承诺能量守恒或其他特征。如果你想将你的物理系统微调到这样的程度,你可能需要考虑使用其他方法来控制球的速度。
  • 如果您确实想继续使用内置物理引擎,您可以考虑使用更快的速度并降低时间尺度来进行补偿。
  • @Ruzihm 降低时间刻度将如何准确补偿?
  • 我不明白这个问题 - 在较低的时间尺度下,刚体在给定的实时量内移动的距离将比在相同时间尺度下移动的距离更短,等等。这是否回答了这个问题?另一种选择是使用更快的速度并增加所有内容的大小,并使相机视图更大以使所有内容看起来都相同。
  • 我试过了,但是速度太快了。我正在为有运动障碍的人设计这个游戏,所以它必须非常慢,这样他们才能对游戏做出反应并真正玩。有什么快速的解决方法可以解决这个问题吗?我尝试编写一些逻辑来检查它是否不反弹它会增加速度,但这会带来更多问题。

标签: c# unity3d game-physics


【解决方案1】:

Unity 物理系统是非确定性的,不承诺能量守恒或其他特性。如果您想将您的物理系统微调到这样的程度,您可能需要考虑使用其他方法来控制球的速度。

但是如果您确实想继续使用内置物理引擎,您可以考虑使用更快的速度并降低时间尺度来进行补偿。

例如:

float x = Random.value < 0.5f ? -3f : 3f; 
float y = Random.value < 0.5f ? Random.Range(-3f, -2f) : Random.Range(2f, 3f); 

StartAwake 的某个地方

Time.timeScale = 0.25f;

您可能还想增加桨的速度以补偿时间尺度的变化。


另一种选择是使用更快的速度并增加所有内容的大小,并使相机视图更大以使所有内容看起来都相同。需要更少的代码更改,但可能需要更多的场景/组件更改。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-11
    • 2022-10-12
    • 2019-08-01
    相关资源
    最近更新 更多