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

Automatically add platform area tile as player approaches the edge of current tile

首先,我是Unity的新手,目前正在学习c#,请多多关照!

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

视角是第三人称,所以玩家看不起动作。当他们接近图块的边缘时,Unity 会识别出这一点并在现有图块上添加另一个图块,基本上将游戏区域扩大一倍。

随着玩家进一步移动到方块边缘,会添加其他方块,每次都会增加发现的区域。

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

会不会是用所有的方块构建完整的关卡,然后使用代码限制玩家能看到的前方距离,主要是限制方块的宽度和长度。

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

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

谢谢。

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

在 unity 中制作游戏没有正确的方法。正确性主要关注性能;内存和处理。

这里有两种方法:

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

提示:

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

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

例如

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. 激活游戏对象的成本很高,但比实例化要少,因为它只有 运行 在其脚本上启动方法(如果有的话),并且还会导致物理引擎重新评估其结构(如果有)它有静态碰撞器或刚体。

  3. 如果渲染的视觉效果(全部或部分)对摄像机可见,则渲染成本很高。

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

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