十六.场景

1.介绍 

 你的游戏很可能会由多个关卡或部分组成。在TopDown引擎中,就像Unity引擎一样,有多种方式可以构建您的关卡。最直接的方法是为每个关卡创建一个场景,并在关卡的结尾有一条门/终点线,通向下一个关卡,但您也可以在单个场景中创建多个部分。最重要的是,该引擎还提供了链接关卡、保存数据、创建关卡选择场景和角色选择场景的方法。这个页面涵盖了所有这些。

 

2. 与加载场景管理器一起前往另一个场景

 对于Unity,通常当您想转到另一个场景(例如在菜单中,或者从一个关卡转到下一个关卡)时,您将使用场景管理器API,可能还有场景管理器。LoadScene()方法。原生方法没有为玩家提供足够的(或任何)视觉反馈,例如,移动设备上的场景加载可能需要几秒钟,所以只有黑屏幕就没有真正的好看。为了解决这个问题,引擎附带了自己的场景更改API,如果你不喜欢它,你可以完全不使用它。

Unity dropdown太小_c#

 如果您想为您的玩家提供更好的体验,您可以使用MMSceneLoadingManager :
1.它可以从任何地方调用,您不需要在场景中使用一个MMSceneLoadingManager 
2.它可以处理加载(顾名思义),并显示动画和进度栏
3.它是完全可定制的,只需编辑ThirdParty/MoreMountains/MMTools/Tools/MMSceneLoading/LoadingScreens/LoadingScreen场景的内容。你可以很容易地添加你自己的标志,改变进度条的外观,正在播放什么动画,等等。
4.它使用起来很简单

要使用MMSceneLoadingManager  API,当您想更改关卡时,只需调用MMSceneLoadingManager。加载场景(字符串sceneToLoad)方法。您传递的字符串参数当然必须与您试图加载的场景的名称相匹配。例如,如果你要加载Koala Dungeon,你可以使用:

MMSceneLoadingManager.LoadScene ("KoalaDungeon");

3.通过LevelManager加载场景

 从LevelManager的面板中,您可以定义一个加载场景模式。然后,引擎中的这个方法将被一些类使用,如FinishLevel 或LevelSelector,从一个场景转到另一个场景。有三种模式可用:

1.UnityNative :将会简单地使用SceneManager  API来加载一个新的场景

2.MMSceneLoadingManager:将使用MMSceneLoading  API来加载一个新的场景,如上所述。在该模式下,您必须指定将什么场景用作加载场景。您可以设置“LoadingScreen”来使用同名的场景。请确保您将其添加到build settings中。

3.MMAdditiveSceneLoadingManager:将使用更先进的附加场景加载系统。您还必须指定一个加载场景名称,并且您可以选择位于ThirdParty/MoreMountains/MMTools/Tools/MMSceneLoading/LoadingScreens/LoadingScreen.的任何附加名称如果你不知道该选哪一个,请从内存添加加载屏幕开始。该模式提供了许多选项,并将让您完全控制每一步的时间,包括淡出、线程优先级、延迟等等。

4.关卡选择

 该引擎附带了一个内置的关卡选择的示例。它里面有显示每个关卡的信息,关卡选择场景。它在逻辑上相当简单,只需使用LoadingSceneManager 就可以转到选定的关卡。

5.场景中的房间

 在某些情况下,在一个更大的场景中创建不同的部分可能是一个好主意。在这种情况下,您将希望使用Teleporter组件。您可以在许多演示级别中看到它的操作,并在Minimal2DDoors1演示场景中关注这一点。它使用起来很简单,你只需要在你的场景中使用其中的两个(或更多),你通过他们的面板链接它们,定义他们的行为。

6.移动到另一个场景中的某个点

该引擎还允许您将不同的场景链接在一起,并根据您的来源指定每个场景的开始。也许你走到场景A的顶部,那里有一扇门可以把你送到场景中 B. 但是在场景a的底部也有一扇门把你送到场景 C. 一旦你进入了场景B,你就想回到A的顶部,等等。这正是Minimal2DDoors1和Minimal2DDoors2 演示场景所演示的。他们使用GoToLevelEntryPoint 组件。

它很容易使用,但需要一些设置。首先,您需要在目标关卡中创建入口点(如果您在场景A中并且要进入场景B,则目标关卡是场景B)。要在场景B中创建入口点,只需创建和定位空对象,或选择现有对象(例如检查点)。然后选择场景B的LevelManager,并在其面板中定义此场景的入口点,并将它们逐个绑定在那里。

完成后,返回到场景A,创建一个带有GoToLevelEntryPoint 的门/对象。根据您喜好设置其各种激活条件和设置,相应地设置关卡名称(我们的示例中的场景B),并设置此对象的入口索引点。请记住,索引从0开始。因此,如果您在SceneB的级别管理器中有3个入口点,索引0是该列表中的第一个点,索引1是第二个点,以此类推。

7.关卡的程序生成

虽然引擎中的大多数演示都是手工制作的关卡,但在场景开始时已经在编辑器中确定了,但没有什么能阻止您在程序上生成关卡。只有两件事你需要小心:

1.确保在Awake上生成的关卡,以便它们可以在Start中使用。
2.确保你的关卡符合引擎的规格,并且生成的结果与你手工做的匹配(墙在障碍层,你的角色有空间,关卡管理器的边界被正确地调整大小,等等)。

您将在KoalaProceduralTilemap 场景中找到一个例子。此场景使用了MMTilemapGenerator的扩展版本,即TilemapLevelGeneratorTilemapLevelGenerator是为TopDown Engine定义的,不仅将根据您定义的规则生成新的里程碑,而且将自动生成墙阴影,在合理和可到达的位置放置入口和退出,并将调整关卡管理器的大小。如果它符合您的需要,您可以正常使用它,或者您可以查看它作为参考,以实现您自己的程序生成系统。

Unity dropdown太小_c#_02

 TilemapGenerator 通过生成一个0和1的网格,并用这些绘制一个Unity  Tilemap(0保持空,1变成一个完整的瓷砖)。它使用许多不同的算法来生成这些0和1的数组,并允许您组合和自定义它们以获得非常独特的结果。

下面是它的面板的分解,它将让您生成各种关卡:

1.Grid :允许您定义网格的大小。您可以为其宽度和高度设置最小值和最大值。在不希望关卡边界大小相同的情况下,这将在这些最小和最大边界之间生成随机大小。当然,如果你为宽度的最小值和最大值设置相同的值,它将保持不变。

2.Global Seed :这个生成器是种子化的,这意味着如果你使用相同的种子,你总是会得到相同的结果。例如,如果您希望角色能够回到以前生成的关卡,这可能很有用。你所要做的就是存储该种子并使用它重新生成一个关卡。复选框还允许您自动生成新种子,但如果您想的话,您可以自己处理该生成。

3.Slow Render : 这只是为了显示,并将只在运行时工作。它允许您按平铺渲染水平平铺的生成。看起来不错。如果你想在测试目的之外这样做,那就不太实用(而且可能会导致问题)。

4.TopDown Engine Settings : 一个复选框将让您决定是否应该在Awake时自动发生生成。绑定将允许您定义要使用什么网格,使用什么tilemap 作为障碍,在什么tilemap 上绘制墙的阴影,以及最后一个插槽将允许您绑定您的LevelManager。然后你可以绑定你的InitialSpawn 和Exit,以及你想保持它们之间的距离。在生成时,系统将生成一个新的关卡,然后将这两个关卡放置在可到达的位置。

5.Layers :这就是魔法发生的地方。每一层将由一个要绘制的目标tilemap 组成,以及定义如何绘制瓷砖的设置。这些设置的细分如下:

6.Layers : Name : 纯粹用于您自己的组织目的,通常指定该图层将绘制什么

7.Layers : Active :如果未勾选此操作,则在生成关卡时将不会处理该分层

8.Layers : Tilemaps :让您拖动一个目标tilemap 来绘制它,以及使用什么瓷砖来绘制它

9.Layers : Override Grid Size :默认情况下,每一层将在网格大小设置的网格上绘制。但是您也可以在每层的基础上覆盖它。

10.Layers : Post Processing : Smooth 选项将对生成的网格应用平滑,衰减所有地方的孤立点和峰值。Invert grid将把所有的0s变成1s,反之亦然。如果你对一个形状很满意,但又认为“如果它正好相反”,就勾选复选框。

11.Layers : Fusion Mode :这些融合模式将从上到下应用于层。NormalNoClear 正常的只是生成一个网格。Intersect :当在已经有内容的目标网格上绘制时,将只保留生成的相交。Combine :将此网格的结果添加到现有目标中。Subtract :从现有目标中删除该网格的结果。

12.Layers : Generate Methods :您可以使用它来生成模式的许多算法。 Full :填充整个网格。Perlin:噪声来生成一个模式。PerlinGround :同样的事情,但将保持网格底部“地面”的目标。Random :随机绘制0和1。RandomWalk :选择一个起始位置在一条路径上。RandomWalkAvoider :同样的事情,但步行者将避免在一个你可以指定的单独的tilemap上的障碍。RandomWalkGround :随机绘制一条小径,但试图保持一个适合步行的地面。Path :雕刻一个指定的随机维度的路径。Copy :复制一个目标tilemap。

13.Layers : Bounds :左、右、上或下边界(或它们的组合)。

14.Layers : Safe Spots :允许您定义许多安全点(以网格坐标定义),其中该图层只能绘制为0。

Unity dropdown太小_unity_03

 这个系统可能需要一些时间,但它功能强大,可以作为你自己更大的解决方案的良好基础。不要犹豫,看看KoalaProceduralTilemap 场景,你会发现一个已经设置了5层的生成器来生成有趣的模式:

1.Grass : 这一层只是在地面的tilemap上画了一个完整的草瓦网格,作为我们的关卡的基础

2.Walls Random Walk :使用随机行走生成,这一层用墙壁绘制了50%的地图

3.Walls Path :该层使用“组合融合”模式为其上面的层生成的墙网格添加一个额外的垂直路径

4.Ground Tiles :这一层将装饰瓷砖随机在地面上,填充率为20%

5.Ground Path :这一层使用随机步行算法在地上绘制一条橙色路径,试图避免墙提供一个现实的结果

最后一件事是:这个系统是没有限制的。演示生成的关卡相对较小(测试速度更快),但是只要对上面描述的层进行一些调整,网格大小乘以10,你就可以生成整个世界:

Unity dropdown太小_加载_04