【问题标题】:How to endlessly and continuously instantiate a gameobject如何无休止地实例化一个游戏对象
【发布时间】:2021-10-17 10:12:27
【问题描述】:

游戏由玩家和场地组成。地面是相对于之前的立方体实例化的立方体,在其右侧或左侧。玩家的目标是向正确的方向滑动或移动并降落在地面(立方体)上。

screenshot

但是,我只成功地实例化了有限数量的立方体,而没有因为实例化立方体的无限循环而导致 Unity 崩溃。

我还尝试在不再处于相机视图中时从底部销毁一个立方体(使用OnBecomeInvisible() 方法),以便能够在实例化的有限数量的立方体的顶部实例化一个立方体,如给人一种无尽游戏的感觉,但是当相机跟随玩家时,一些立方体出现在场景的最左边或最右边,但随着相机再次居中它们不再可见,这反过来又在甚至之前摧毁了立方体玩家降落在立方体上或查看它。

会让地面滚动,当它下降到某个 Y 值以下时,它会被破坏,因为它不在相机的视野范围内,行吗?我已经尝试过了,但我觉得它应该可以工作。

还有其他方法吗?

【问题讨论】:

  • 鉴于您的 RAM 有限,无限对象不起作用。 |我将使用的结构将接近队列 - 一个有限的“活动立方体”列表。如果您需要超过限制,则最旧的立方体将首先被丢弃以腾出空间 - 其他所有东西都会向上移动。请注意,内置队列可能不起作用,因为它不允许读取访问(显示)所有中间多维数据集。
  • 您能否解释一下“先放下以腾出空间 - 其他一切都会向上移动”是什么意思?
  • 这可以通过“对象池”来解决。想象一下像 Flappy Bird 或 Galaga 这样的游戏——他们显然需要不断地制作新对象。那么,他们如何做到这一点,而不会产生让 Google Chrome 脸红的内存账单呢?通过构建具有有限数量实例的池对象,并在需要时将以前的实例重新分配到新位置。这是detailed tutorial on Object Pooling

标签: c# unity3d instantiation


【解决方案1】:

我没有提供任何代码,只有您必须自己实现的想法。

我认为您需要的数据结构类似于 to a Queue 的大小限制:您使用 Enqueue 添加所有新的多维数据集。如果您在入队期间超过了大小目标,您将出列(然后从场景中移除)超出限制的任何内容。

不幸的是,我怀疑您是否可以使用任何现有的 Queue 实现,例如 Queue[T] - 至少不能在没有使用您自己的实现覆盖或隐藏 Enqueue 函数的情况下使用 - 因为它们并非旨在强制执行限制。更不用说通过 Dequeue-ing 过剩和在代码上运行一些 Unity 来执行它。

【讨论】:

  • 我在上面的评论中提到了对象池,实际上它也需要一个队列。因此,至少在我的情况下,两者必须一起使用。
  • @Omar 两者的目标都是首先废弃或回收“最旧”的对象。无论哪种方式,先进先出的集合都是工具。队列只是为了帮助给你一个清晰、明确的命令。
猜你喜欢
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多