【问题标题】:Character vibrates while moving 30fps移动时角色振动 30fps
【发布时间】:2013-07-10 09:52:47
【问题描述】:

我正在使用 Unity 开发一款 2.5D 手机游戏。为了前后移动角色,我在更新函数中使用了一段代码:

void Update () {

   if (shouldMove==true){

     transform.Translate(Vector3.forward * 3 * Time.deltaTime);
  }
}

因此,当游戏以 60 fps 运行时,该代码运行良好,但当 fps 降至 30 或更低时,角色在移动时开始振动。我试图用平面地形测试相同的代码并且效果很好,所以问题可能是角色和地形碰撞器之间的碰撞。但是,我不明白为什么如果 fps 很高它工作得很好。我已经尝试过胶囊对撞机和网状对撞机,但没有人成功。你怎么看?我应该尝试使用其他代码吗?

编辑 1:我正在使用胶囊对撞机和刚体。我应该使用角色控制器吗?

【问题讨论】:

  • 您是说shouldMove 布尔值不断地打开和关闭,因此角色只在某些帧上移动,您与物理引擎的交互方式是驱动shouldMove 值的原因?
  • 没有。当用户触摸一个按钮来移动角色时,应该 move 为真。当用户结束触摸它时,shouldMove 被认为是假的。
  • 好吧,您可能需要更多代码或更好地描述您的物理引擎使用情况。您可能还想考虑将此发布到官方 Unity3D answerssupport forums。更有可能有人和你处理过同样的问题。
  • 查看编辑1。我已经在Unity中发布了问题。

标签: c# performance unity3d frame-rate


【解决方案1】:

Sam Bauwens 的回答是绝对正确的,但是,这个问题通常是由于过多的对象(特别是动画对象)引起的。这会大大降低性能。

您应该尝试删除一些对象并尝试您的角色是否仍然振动。如果没有,那就意味着我是对的。当然,您不会想删除场景中的对象,因此,您可以添加 SmartLOD 之类的资产,删除屏幕上未显示的对象的几何图形,从而提高游戏性能。

希望对你有帮助。

【讨论】:

  • 你完全正确。我删除了一些对象,它工作得很好。谢谢老兄!
【解决方案2】:

我在地面上振动的球也遇到了类似的问题。它是由将游戏对象拉向地面的重力引起的,然后它在地面上碰撞并反弹。如果您的问题和我一样,您必须调整 Fixed Timestep(编辑 => 项目设置 => 时间)和/或 反弹阈值(编辑 =>项目设置 => 物理)。

通过增加反弹阈值,您将增加物体不会反弹的最低速度,这样重力就不会大到足以使球的速度超过反弹阈值。

通过减少物理时间步长,您可以减少每个时间步长的重力影响,因为时间步长更小,因此每个时间步长添加到游戏对象的速度量更小。

编辑:您还可以查看睡眠速度(编辑 => 项目设置 => 物理),因为如果它高于重力速度,则物体不应振动。

【讨论】:

    猜你喜欢
    • 2013-11-16
    • 2017-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多