哈喽大家好,还记得我们在设计第一个地图(有箱子的那个)时画了个凸起的地方吧?这次我们会在那里放置一块碰撞体,当玩家走过去之后,将会被传送到 Dungeon1 场景。

我们在 SampleScene 的 Hierarchy 面板中,右键创建一个 Game Object 并命名为 Portal(传送门),给其新增 BoxCollider2D 组件,调整它的位置。强迫症,所以我将这个 GameObject 的位置修改为 X = 0,Y = 1.36,Collider 的 Offset 设置为 0,Size 为 0.48 和 0.16,都是 8 和 16 的倍数。

创建一个新的脚本(Script),命名为 Portal,然后将其拖拽到我们刚刚创建的 Game Object(Portal)里。双击编辑该脚本。因为是传送门,我们不需要从它这儿获取到什么东西。所以它的继承应该是 Collidable。

重写 OnCollide 方法。我们要实现的逻辑是,当玩家踏入这个区域时,随机传送到一个地牢里。

定义一个字符串数组,里边保存了需要传送的场景名称。在 OnCollide 函数里,当玩家碰撞到之后,从 sceneNames 数组中获得随机一个地图名称。然后调用 LoadScene 函数,将随机抽到的 sceneName 传递进去,让玩家传送过去新的地图。

using UnityEngine;

public class Portal : Collidable
{
public string[] sceneNames;

protected override void OnCollide(Collider2D collider)
{
if (collider.name == "Player")
{
// 传送玩家到随机的地图上。
string sceneName = sceneNames[Random.Range(0, sceneNames.Length)]; // 随机获取一个地图名称
UnityEngine.SceneManagement.SceneManager.LoadScene(sceneName); // 加载地图
}
}
}

回到 Unity,右上角点击 File / Build Settings。然后看见上方有个列表,默认列出了 SampleScene。现在我们在 Project 面板中打开 Scenes 文件夹,然后将 Dungeon1 场景拖曳到该列表下加入到该列表里。

最后,不需要点击 Build,直接点击 × 关闭窗口。

所有我们在项目文件里编辑好的场景,都不会被保存进游戏里面。只有在 Build Setting 里注册该场景之后,他才会被 Unity 构建,从而在你的游戏里存在此场景。

这个设定在于:开发者可以构建一些测试场景。这些场景是不会被玩家所进入的。开发者只需要将这些测试场景在 Build Setting 里删除,则当游戏导出时就不会包含在里面了。

在 Hierarchy 面板中,选中 Portal 的 Game Object,然后在 Inspector 面板中,Scene Names 点击 + 号,增加一个元素,然后输入 Dungeon1(地牢的名字)。以后如果绘制了更多的地牢,那么就往里边加名字就行了。

最后最后,在 Dungeon1 场景中,将玩家和摄像头脚本拖入场景中(这边建议将玩家 Player 和 Main Camera 转换为预制件,然后 Main Camera 的 LookAt 记得将 Player 拖进去)。然后调整玩家和镜头的初始位置,我把它放在了带了点样式的地板那个位置(注意,玩家的位置 Position 和镜头的位置一致,这样才会使其居中)。

回到 SampleScene 场景,然后走到传送点的位置,就可以实现传送了。

那么这一部分就学习到这里,这部分我们讲解了和地图上的物件进行交互(和箱子、NPC交互)以及通过碰撞交互实现传送。下一部分我们将学习怎么保存游戏信息,比如保存玩家金币、经验值等,带到下一关卡。