注意:我几天前在Stack Overflow上问了这个问题,但是视图很少,没有任何响应。想通了,我应该问gamdev.stackexchange。
这是关于在不破坏先前生成的内容的情况下通过多个发布后更新来维护程序生成系统的一般问题/建议。
我正在尝试寻找信息和技术来避免在创建游戏程序内容时出现“蝴蝶效应”问题。当使用种子随机数生成器时,可以使用重复的随机数序列来创建可重现的世界。尽管有些游戏只是在生成后将生成的世界保存到磁盘上,但是过程生成的强大功能之一是您可以依靠数字序列的可再现性以相同的方式多次创建区域,从而无需使用坚持不懈。由于我的特定情况的限制,我必须最小化持久性,并且需要尽可能地依赖纯种子浓缩物。
这种方法的主要危险在于,即使在程序生成系统中进行最微小的更改,也可能导致蝴蝶效应,从而改变整个世界。这使得在不破坏玩家正在探索的世界的情况下更新游戏变得非常棘手。
我用来避免此问题的主要技术是在多个阶段设计过程生成,每个阶段都有自己的种子随机数生成器。这意味着每个子系统都是独立的,如果发生故障,将不会影响世界上的所有事物。但是,即使在游戏的孤立部分中,它似乎仍有很大的“破损”潜力。
解决此问题的另一种可能方法是在代码中维护生成器的完整版本,并针对给定的世界实例继续使用正确的生成器。虽然这对我来说似乎是一场维护噩梦,但我很好奇是否有人真的这样做。
因此,我的问题确实是要求提供一般建议,技术和设计模式来解决这种蝴蝶效应问题,尤其是在发行后的游戏更新中。(希望这不是一个广泛的问题。)
我目前正在Unity3D / C#中工作,尽管这是一个与语言无关的问题。
更新:
感谢您的答复。
看起来越来越像静态数据是最好和最安全的方法,而且当无法存储大量静态数据时,在生成的世界中进行长时间的活动将要求对使用的生成器进行严格的版本控制。在我的情况下,限制的原因是需要基于移动的云保存/同步。我的解决方案可能是找到存储有关基本事物的少量紧凑数据的方法。
我发现暴风城的“笼子”概念是思考事物的一种特别有用的方式。笼子基本上是一个种子点,可防止微小变化(例如,将蝴蝶笼中)的影响。