前面三个部分,我们已经把游戏的基本内容做好了(角色移动、场景设计、碰撞触发某些功能)。现在,我们需要给游戏打上地基,让游戏可以保存玩家信息——金币、经验值、武器等……

那么我们在 Scripts 文件夹里创建一个新的脚本 GameManager,Unity 默认会将此脚本的图标变更为齿轮状。双击编辑它。首先,我们定义一个 instance 变量,类型是 GameManager(也就是我们现在创建的脚本),修饰符为 public static。修饰符是 static,这意味着这个变量是全局的。我可以在任何一个类访问 GameManager.instance 来访问到这个 GameManager

我们让游戏的 GameManager 自己获取自己,所以重写 Awake 函数,内容是 instance = this。意味着这个类的 instance 对象指向他自己。

using UnityEngine;

public class GameManager : MonoBehaviour
{
public static GameManager instance;

private void Awake()
{
instance = this;
}
}

回到 Unity,我们先解决一个很久的问题 Sample Scene 有点太开玩笑了,我们打开 Scene 文件夹,然后将其重命名为 Main。注意,记得先保存再命名。

然后我们在 Main 场景的 Hierarchy 面板中,右键 Create Empty 命名为 Game Manager。这是一个空的游戏物件,意味着他除了能够记录位置之外,就没有其他属性了。我们将其坐标设置为 0(可以直接右键 Transform,然后选择 Reset Component)。

将 GameManager 脚本嵌入到 Game Object 里。

Game Manager 是用于保存游戏中的所有主要信息,所以我们给他定义几个成员变量,另外还有两个函数,用于保存和读取游戏状态。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameManager : MonoBehaviour
{
public static GameManager instance;

private void Awake()
{
instance = this;
}

// 游戏资源
public List<Sprite> playerSprites;
public List<Sprite> weaponSprites;
public List<int> weaponPrices; // 武器升级所需要的价格
public List<int> xpTable; // 升到下一级所需的经验值

// 参考对象
public Player player;

// 逻辑类
public int gold;
public int experience;
}

这里给大家一些建议,比如我们可以在切换场景的时候保存游戏、或者当玩家拾取道具的时候可以保存游戏,这一切都取决于你。另外读取游戏的时间点可以是在当场景被加载后。Unity 提供了回调函数执行这个操作,接下来我们就去学习这些回调函数。

那么本章就简单的讲解 GameManager 的用途。