当玩家接近当前图块的边缘时,自动添加平台区域图块

时间:2017-02-25 10:22:41

标签: unity3d unityscript

首先,我是Unity的新手,我现在正在学习c#,请保持温和!

作为一个项目,我想创建一个简单的3D平台游戏。玩家的想法是在方形瓷砖上开始,这是游戏平台游戏区域。他们通过四处走动探索这块瓷砖上的不同元素。

视角是第三人,所以玩家正在低头看动作。当他们接近瓷砖的边缘时,Unity会认出这一点并为现有瓷砖添加另一个瓷砖,基本上会使播放面积加倍。

当玩家进一步移动到瓷砖边缘时,会添加其他瓷砖,每次都会增加发现的区域。

我想要实现这一点的目的是拥有5个平铺游戏对象,它们具有不同的元素,例如已经在其上构建的树。问题是实现这一目标的最佳方法是什么。

是否使用所有图块构建完整关卡然后使用代码限制玩家可以看到的距离,基本上是关于图块的宽度和长度。

或者当玩家接近当前图块的边缘时触发新图块会更好。

想想,我可以回收的示例代码链接非常方便。

谢谢。

1 个答案:

答案 0 :(得分:2)

问题主要是基于意见,但这里有一些建议:

没有正确的方法来统一游戏。正确性主要集中在绩效上;记忆和处理。

这里有两种方法:

    • 条件:你的世界是无穷无尽的(或非常大),玩家随着时间的推移移动速度非常缓慢(比如每个瓷砖需要超过一秒的时间来遍历)。
    • 解决方案:不要在开始时实例化所有内容,而是当玩家到达平铺边缘时查找关卡结构中的下一个平铺以检索其数据然后实例化其对象。
    • 条件:你的世界不是很大(说它的总体数量少于10K)或玩家可以快速移动(如帝国时代的游戏)。
    • 解决方案:在加载阶段实例化所有内容,并在实例化时停用游戏对象,以便在游戏开始时不会处理任何内容。在这种情况下,关卡结构是一组游戏对象,您可以在其中激活或停用它们。
  1. 提示:

    1. 对于重复的对象,池化是一种很好的做法。 Pool基本上是一个带有脚本的空游戏对象,以及许多已停用的子游戏。

      • e.g。如果你有1K相同类型的树,你最好有一个树池。创建一个名为树池的游戏对象,向其添加池脚本,并使该脚本在加载阶段生成1K停用的树游戏对象。然后,只要您的关卡生成器需要一个新树,只需从树池中获取一个树并激活并重新定位它。确保在游戏结束后清理游泳池以防止内存泄漏。
      • 您可以根据需要实现池,以便为特定池提供对象变体。
    2. 运行时的实例化成本很高,尤其是在移动设备中。每当您需要同时实例化多个游戏对象时,请考虑使用协程来防止滞后或冻结(这也适用于加载阶段)。

    3. e.g。

      IEnumerable CreateObjects(Data[] data)
      {
          foreach(var e in data)
          {
              Instantiate(e);//instantiate here and then wait
              yield return null;//this line prevents lag
          }
      }
      //...
      StartCoroutine(CreateObjects(data));
      //...
      
      1. 拥有许多活跃的游戏对象也很昂贵,尤其是在移动设备中。如果许多活动游戏对象具有繁重的脚本,则更新方法将破坏性能。如果许多活动游戏对象具有刚体或碰撞体,则物理引擎处理会变得很重。

      2. 激活游戏对象代价高昂,但实例化程度较低,因为它只在其脚本上运行Start方法(如果有的话),并且如果它具有静态对撞机或刚体,也会导致物理引擎重新评估其结构。

      3. 如果只有渲染的视觉效果(完全或部分)对相机可见,渲染成本很高。

      4. 创建一个编辑器项目,您可以在其中设计关卡。在这个项目中,您将使用unity的编辑器类来生成代表您整个世界的某种数据(JsonObject)。 (级别的集合,每个级别中的区块和每个区块中的对象)。此外,您可以将其他数据(例如目标和内容)存储在不同的JsonObject中。然后通过阅读并将其结构存储在内存中,在游戏中使用这些数据。

        • 我建议JsonObject存储数据的原因是它的大小,可移植性,灵活性,可访问性和易用性。 JsonObject是一个存储为纯文本的字典。因为它是一个文本,你可以随意加密