例如,著名的《飞扬的小鸟》游戏或任何真正分类的游戏都是玩家(在这种情况下,是小鸟,或者是您喜欢的相机)向前移动或整个世界向后移动(小鸟只改变Y位置并且具有X位置不变)?
例如,著名的《飞扬的小鸟》游戏或任何真正分类的游戏都是玩家(在这种情况下,是小鸟,或者是您喜欢的相机)向前移动或整个世界向后移动(小鸟只改变Y位置并且具有X位置不变)?
Answers:
我有点不同意菲利普的回答。或至少与他的介绍方式有关。它给人的印象是,在玩家周围移动世界可能是一个更好的主意。恰恰相反。所以这是我自己的答案...
两种选择都可以使用,但是通过在玩家周围而不是在玩家周围移动世界来“颠倒物理性”通常是个坏主意。
这个世界通常会有很多物体。许多(如果不是大多数的话),静止的或睡觉的。玩家将拥有一个或相对较少的对象。在玩家周围移动整个世界,意味着在场景中移动除玩家之外的所有事物。静态对象,睡眠动态对象,活动动态对象,光源,声源等;所有都必须搬家。
(显然)这比仅移动实际移动的内容(播放器,也许还有更多的东西)要贵得多。
在玩家周围移动世界使世界(以及其中的一切)成为最活跃的事件。系统中的任何错误或更改都意味着所有内容都有可能更改。这不是做事的好方法。您希望将错误/更改尽可能地隔离,以便在未进行更改的地方不会出现意外的行为。
这种方法还存在许多其他问题。例如,它打破了有关引擎应该如何工作的许多假设。RigidBody
例如,除了播放器外,您将无法使用dynamic 。因为RigidBody
没有设置运动的附件对象在设置位置/旋转/比例时会表现出异常情况(您要为场景中的每个对象(除了播放器😨以外)对每一帧进行操作)
好吧,是的,不是。正如菲利普(Philipp)的回答中所述,在无限跑者类型的游戏(或任何具有大的无缝可探索区域的游戏)中,离原点太远会最终引入引人注目的FPPE(浮点精度错误),并且更进一步,最终,溢出数字类型,或者导致游戏崩溃,或者基本上使游戏世界烟消云散…… 在类固醇上!😵 (因为此时,FPPE使游戏已经处于“正常”状态)
两者都不做!您应该使世界保持静止,并在周围移动玩家。但是,当播放器开始离场景的根(位置)太远时,播放器和世界都 “重新建立” 。 [0, 0, 0]
如果您保持事物(玩家对周围世界的相对位置)的相对位置,并在单个帧更新中执行此过程,那么(实际)玩家甚至不会注意到!
为此,您有两个主要选择:
如果您查看Unity的源代码,它们将使用1e-5
(0.00001
)作为考虑两个浮点值“相等”的基础,这些浮点值在Vector2
和Vector3
(负责对象位置,[euler]]旋转和缩放的数据类型)之间。由于浮点精度损失是从零到零发生的,因此可以安全地假定与场景根/原点相距1e+5
(100000
)单位以下的任何内容都是可以安全使用的。
但!以来...
...那么,早于/多于100000个单位重新植根可能是个好主意。例如,我提供的示例视频似乎每1000个单位执行一次。
这两个选项都可以。
但是,如果您想让无尽的跑步者真正成为无尽的跑步者,就必须让玩家保持平稳并移动世界。否则,您最终将达到用于存储X位置的变量的极限。整数最终将溢出,并且浮点变量的准确性将越来越低,这将使游戏玩法在一段时间后出现故障。但是您可以通过使用足够大的类型来避免此问题,以至于没人可以在一个会话中玩的时间内遇到这些问题(当玩家每秒移动1000个像素时,49天后32位整数将溢出)。
因此,从概念上讲,您觉得更直观的事情也要做。
基于XenoRo的answer,而不是他们描述的重新生根方法,可以执行以下操作:
为生成的无限贴图的各个部分创建一个循环缓冲区,角色通过模运算更新位置来移动角色(因此,您只需绕着循环缓冲区运行)。一旦角色离开了块,就开始替换缓冲区的某些部分。玩家更新等式如下所示:
player.position = (player.position + player.velocity) % worldBuffer.width;
这是我所谈论的图画的例子:
这是结束包装时发生的示例。
使用这种方法,您永远不会遇到精度错误,但是如果您打算在3d中以非常远的视距进行此操作,则可能需要制作一个很大的缓冲区(因为您仍然需要能够自己先看到)。如果它的鸟儿很大,则块的大小可能只会和为单个屏幕容纳一个场景所需的块大小一样大,并且缓冲区可能很小。
请注意,您将开始使用ANY prng 获得重复结果,并且PRNG生成的非重复序列的最大数目通常小于pow的长度(2,内部使用的位数),对于merzenne twister,这不是这是一个很大的问题,因为它使用2.5k的内部状态,但是如果使用微小变体,则在重复(或更糟糕)之前有2 ^ 127-1次最大迭代,但是,这仍然是一个天文数字。即使您的PRNG周期很短,也可以通过对种子进行良好的雪崩混合功能(因为您隐式添加了更多状态)来解决重复周期问题。