【问题标题】:most efficient way to get a very smooth player movement in unity5在 unity5 中获得非常流畅的玩家移动的最有效方法
【发布时间】:2022-05-13 23:53:06
【问题描述】:

所以我正在制作一个简单的 2d 无尽的手机游戏。在游戏中,玩家物体(飞船)不断向上移动,然后玩家可以左右移动来避开障碍物。

作为一个新手,我发现很难在玩家移动中实现非常流畅的动作。我看过很多教程,包括关于移动对象的统一官方教程。他们都使用简单的技术,例如:

fixedupdate函数中的rigidbody.velocity = (new Vector2 (0.0f, 1.0f)) * speed

或更新函数中的transform.Translate (velocity * Time.deltaTime * speed)

或固定更新中的rigidBody.MovePosition (rigidbody.position + velocity * Time.fixedDeltaTime)

只是在更新函数中随时间改变transform.position

但是我使用的这些技术或代码都没有帮助我在玩家运动中实现我想要的非常平滑的动作。无论我尝试什么,我仍然会在玩家移动中遇到滞后。我也尝试过打开和关闭rigidbody.iskinematic 并更改刚体插值,但我仍然无法在我们看到的2d 游戏中实现平滑运动,例如ios games shredd or split the dot。我认为这可能是我的计算机速度非常慢,或者是什么原因导致我的动作不流畅,但我将我的项目传输到了我朋友的计算机上,它的速度是原来的两倍,但我仍然得到相同的结果。我还删除了所有决定删除播放器控制器脚本中的所有代码并只专注于移动播放器的代码,但结果没有改变。

我认为这是因为我只是使用了一个非常简单且低效的代码来移动播放器,或者它可能与统一更改某些设置有关。所以问题是什么是最有效的方式来实现一个非常流畅的球员统一运动。 (代码库和统一设置。)

目前我只是使用rigidbody.velocity = (new Vector2 (0.0f, 1.0f)) * speed 来移动播放器,为了简单起见,我将相机设置为播放器的子对象。

谢谢。

【问题讨论】:

  • 您是否尝试过使用vector2 transform.Translate(new Vector2(0, 1) * moveSpeed * Time.deltaTime);进行翻译。我建议在你的 gui 上显示 fps,这样你就知道你的整个游戏是滞后的还是只是你的玩家。如果您的整个游戏滞后,则需要在那里进行一些分析...
  • 顺便说一句,由于该代码使用Time.deltaTime,它应该在Update方法内。
  • 您的代码在哪里,可以方便地放置您所拥有的但不能提供平滑结果的代码。它可能与您的对象的规模有关,并且移动的数量少于您随着时间的推移所拥有的数量。你的相机是否随着物体移动?
  • @DavidEspino 实际上我确实使用了transform.Translate 方法,并且我在我的帖子中也说明了这一点。但它也没有奏效。我现在正在学习分析。
  • @Alan-DeanSimmonds 我只是使用rigidbody.velocity = (new Vector2 (0.0f, 1.0f)) * speed 这段代码来移动播放器,并且我已将相机作为子对象附加到播放器,因此它将跟随播放器。实际上谈到缩放,我将原始对象的宽度和高度都缩放为 2.5。这可能是问题吗?此外,您还可以与我们分享更多缩放是如何影响物理和玩家运动的。谢谢。

标签: c# game-physics unity5 rigid-bodies


【解决方案1】:

我会使用Vector3.Lerp 来插入transform.position。这基本上在数学上平滑了两个位置之间的平移。

我遇到的其他情况是编辑器有时比最终产品更滞后,因此我建议构建游戏并对其进行测试,看看是否是这种情况。

最后,如果您使用 transform.position 来移动对象,请确保数字相当小。大数字显然会使对象跳得更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 2011-01-16
    • 2011-02-07
    • 2023-03-18
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多