如何在无限亚军游戏中重置世界,以防止溢出浮动?

我遵循Mike Geig的2D无限跑步者教程 。 但是,我看到一个潜在的溢出浮动问题

我怎样才能重新把所有的物体和相机重新回到原点?

我正在寻找的方法是类似的建议由大卫Debnar在这个问题上: http ://answers.unity3d.com/questions/491411/best-practices-for-endless-runner-type-games.html

绝对的球员。 这很容易,但为了防止浮动溢出,你应该把每一千个单位的数千个单位弹回来

您可以存储迭代,也可以多次将整个级别向右popup。 经过一定的时间(比如说1000),把所有的东西都放回去,再乘以迭代次数,重新设置你的迭代计数器。 所以你防止了可能的溢出,你不必每次都做“昂贵的计算”

我不得不不同意大卫Debnar。 在“无尽跑步者”的情况下,玩家的移动能力受到限制,我想移动玩家周围的世界更加高效,避免玩家位置复杂的重置。

因为这些重置会在游戏中造成打嗝,如果不仔细计划的话,甚至对于休闲游戏来说,这对玩家来说是不可接受的。

首先,计算你有多less时间陷入困境。 假设你是跑步者每秒1米,1米是1个单位的花车。 32位浮点数最大可以容纳2,147,483,647。 这意味着在溢出发生之前,有人将不得不玩68年游戏。 不值得任何额外的编码;)。

另一个诀窍是不要让角色移动,而是要移动世界。 既然角色穿越了一个角色,它就会被卸载,甚至没有任何东西可以接近这些可笑的数字。

(请注意,32位浮点数在其高端值附近变得不那么精确,因此在溢出之前可能会遇到问题,但在这些问题出现之前可能还需要几周或几年)。

您可以将每个对象(2D HUD Canvas和方向灯除外)作为单个空主GameObject对象的子对象(假设名称为“worldPlaceholder”),并将其Transform为主玩家的位置乘以-1 。 为了节省CPU时间,你可以使用一个计数器来完成这个任务,每个X米放置一个特殊的触发Collider来执行这个任务。 类似的东西:

worldPlaceholder.transform.Translate (player.transform.position * -1);

我建议你不要每一帧都这么做,因为CPU时间可能会很昂贵。

虽然我还没有看到教程,但我认为你总是可以使用下面的代码来重新加载关卡 –

 Application.LoadLevel(Application.loadedLevel); 

在加载之前,将迭代保存到一个文件中。 你可以有一个大概20000米的迭代。 所以迭代计数1意味着玩家运行20k米,迭代次数20意味着玩家运行20x20k米。