< Return to Video

2D Roguelike 5 of 14 : Game Manager

  • 0:03 - 0:05
    在这个视频中,我们将开始
  • 0:05 - 0:07
    设置我们的“GameManager”。这样我们就可以
  • 0:07 - 0:10
    测试我们刚写的“BoardManager”脚本了。
  • 0:11 - 0:13
    让我们选择两个脚本并将它们添加
  • 0:13 - 0:15
    到“GameManager”中。
  • 0:18 - 0:22
    接下来,让我们在“MonoDevelop”中打开“GameManager”脚本。
  • 0:24 - 0:26
    在“GameManager”中,我们将添加
  • 0:26 - 0:28
    一个类“BoardManager”类型的公有变量,
  • 0:28 - 0:30
    BoardScript。
  • 0:30 - 0:33
    我们还将添加一个“int”类型的
  • 0:33 - 0:37
    私有变量,Level,并将其“初始化”为3。
  • 0:37 - 0:40
    我们使用3,因为我们要测试
  • 0:40 - 0:43
    Level 3,因为这是敌人出现的地方。
  • 0:43 - 0:45
    我们会把 “Start” 改成 “Awake”。
  • 0:45 - 0:47
    在Awake中,我们要做两件事。
  • 0:47 - 0:50
    我们将获取并存储一个组件引用
  • 0:50 - 0:52
    到我们的“BoardManager”脚本中。
  • 0:52 - 0:55
    并且我们还会调用“InItGame”函数。
  • 0:55 - 0:57
    我们声明InItGame。
  • 0:57 - 1:01
    在“InItGame”中,我们将调用“boardScript”的
  • 1:01 - 1:02
    “SetupScene”函数。
  • 1:02 - 1:05
    当我们这样做时,我们会
  • 1:05 - 1:08
    在参数层中进行解析,这样我们就可以告诉“boardScript”,
  • 1:09 - 1:11
    我们设置的场景是什么级别的,
  • 1:11 - 1:14
    这样它就可以确定敌人的数量。
  • 1:15 - 1:18
    这样做之后,我们保存脚本并返回到编辑器。
  • 1:22 - 1:24
    回到“编辑器”中,是时候分配
  • 1:24 - 1:27
    我们的“BoardManager”脚本的变量了。
  • 1:27 - 1:29
    让我们选择GameManager”
  • 1:31 - 1:33
    我们要做的是锁定
  • 1:33 - 1:35
    "inspector"这样我们就可以
  • 1:35 - 1:37
    点击多个”prefabs“
  • 1:37 - 1:41
    然后把它们拖到数组中。
  • 1:41 - 1:45
    让我们通过点击这里的锁按钮来锁定“inspector”。
  • 1:46 - 1:48
    现在我们可以做的是,我们开始通过拖动
  • 1:48 - 1:50
    “exit”,这是第一个。
  • 1:53 - 1:55
    接下来我们要按shift按键
  • 1:55 - 1:58
    选择所有8个floor预制体,
  • 1:58 - 2:00
    将直接把它们拖到
  • 2:00 - 2:03
    floorTile数组中。
  • 2:07 - 2:10
    这将允许我们同时添加所有这些,
  • 2:10 - 2:12
    而不会失去焦点。
  • 2:13 - 2:15
    接下来我们要做的是“wallTiles“。
  • 2:15 - 2:18
    选择“Wall1”,按shift按键,点击“Wall8”。
  • 2:21 - 2:23
    将它们拖到“wallTiles"数组中。
  • 2:25 - 2:28
    我们要做的是“foodTiles",在这种情况下,
  • 2:28 - 2:32
    我要点击“Food”预制件,然后按下“command”按键,
  • 2:32 - 2:34
    点击“Soda”预制体,我是在MAC上操作。
  • 2:34 - 2:37
    如果我们在PC上操作,那将是按下“CTRL”按键
  • 2:37 - 2:39
    添加选择。
  • 2:39 - 2:41
    我们会把它们拖到我们的"foodTiles"数组中。
  • 2:42 - 2:44
    然后是两个"Enemy"敌人瓦片。
  • 2:47 - 2:50
    最后是"outerWallTiles"。
  • 2:54 - 2:57
    有了这些设置,让我们解锁“inspector”
  • 2:59 - 3:00
    并测试一下。
  • 3:03 - 3:05
    很好,我们可以看到
  • 3:05 - 3:07
    我们的“levels”正在产生,
  • 3:07 - 3:09
    我们可以看到摄像头有点脱离了位置,
  • 3:09 - 3:11
    我们快速地修正一下。
  • 3:11 - 3:15
    我们把X设为3.5,把Y设为3.5。
  • 3:15 - 3:17
    我们把背景设置为黑色。
  • 3:20 - 3:22
    完成之后,让我们play这个场景
  • 3:22 - 3:24
    测试一下。
  • 3:28 - 3:29
    于是我们就有了,
  • 3:29 - 3:32
    我们的出口,和我们的地板背景,
  • 3:32 - 3:34
    食物被生成出来了,
  • 3:34 - 3:37
    ”内墙”和“外墙”被生成出来了。
  • 3:37 - 3:39
    还有我们的敌人也被生成出来了。
  • 3:44 - 3:48
    我们将为我们的“GameManager”脚本添加一些功能。
  • 3:48 - 3:51
    让我们写一个被称为”单例“的“GameManager”。
  • 3:51 - 3:54
    “单例”是一个对象,
  • 3:54 - 3:57
    在任何给定的时间,
  • 3:57 - 3:59
    它只能在游戏中有一个实例。
  • 3:59 - 4:01
    因为“GameManager”会做一些事情,
  • 4:01 - 4:05
    比如加载“级别”,管理玩家的分数,
  • 4:05 - 4:07
    我们不希望有超过一个
  • 4:07 - 4:09
    这样的对象存在,
  • 4:09 - 4:11
    所以在我们的代码中,我们要保证
  • 4:11 - 4:13
    不能发生这种情形。
  • 4:13 - 4:15
    让我们在“MonoDevelop”中打开“GameManager”。
  • 4:17 - 4:20
    我们把“GameManager”设置为“单例”
  • 4:20 - 4:23
    我们将添加一个的公共静态变量
  • 4:23 - 4:26
    “GameManager”名为“Instance“
  • 4:26 - 4:28
    并将其初始化为null。
  • 4:28 - 4:30
    声明实例为public意味着
  • 4:30 - 4:33
    它将从类的外部访问。
  • 4:33 - 4:37
    将其声明为静态意味着该变量
  • 4:37 - 4:40
    将属于类本身,
  • 4:40 - 4:42
    而不是类的实例。
  • 4:42 - 4:44
    这意味着我们现在可以
  • 4:44 - 4:46
    从游戏中的任何脚本访问我们的“GameManager”
  • 4:46 - 4:48
    的公共功能和变量。
  • 4:49 - 4:51
    在“Awake”中,
  • 4:51 - 4:54
    如果我们要给”instance"赋值,
  • 4:54 - 4:57
    我们要先检查”instance"是否为空。
  • 4:57 - 5:00
    如果”instance“不为空,并且
  • 5:00 - 5:03
    "instance"不等于“this”,我们要“destroy”它
  • 5:03 - 5:06
    这样我们就不会意外地得到
  • 5:06 - 5:09
    两个“GameManager”的例子。
  • 5:09 - 5:11
    我们还将在我们的“GameManager”中设置
  • 5:11 - 5:14
    “DontDestroyOnLoad”。
  • 5:14 - 5:16
    "DontDestroyOnLoad"意思是当我们
  • 5:16 - 5:19
    加载一个新的场景时,通常是所有在
  • 5:19 - 5:22
    “层级(hierarchy)”中的游戏对象被销毁。
  • 5:22 - 5:24
    因为我们想用"GameManager"来
  • 5:24 - 5:27
    记录场景之间的分数
  • 5:27 - 5:30
    我们不希望它在那个时候被摧毁。
  • 5:30 - 5:32
    因此,我们将使用“DontDestroyOnLoad”
  • 5:32 - 5:35
    来确保它能够在场景之间持续。
  • 5:35 - 5:38
    让我们保存脚本并返回到编辑器。
  • 5:40 - 5:42
    现在我们已经添加了我们需要的
  • 5:42 - 5:44
    “GameManager”脚本,让我们把它拖到
  • 5:44 - 5:46
    我们的“Prefabs”文件夹中,创建一个预制体。
  • 5:51 - 5:53
    在我们完成之前,我们还需要一个
  • 5:53 - 5:55
    示例脚本,它将在游戏开始时
  • 5:55 - 5:57
    加载“GameManager”。
  • 5:59 - 6:01
    我们将进入脚本,并创建
  • 6:01 - 6:03
    一个名为“Loader”的新脚本。
  • 6:08 - 6:10
    “Loader”是一个非常简单的脚本,
  • 6:10 - 6:12
    它会检查是否有一个“GameManager”
  • 6:12 - 6:14
    被实例化,如果没有实例化,
  • 6:14 - 6:16
    将从我们的prefabs预制体中实例化一个。
  • 6:16 - 6:19
    我们要添加一个公共游戏对象,
  • 6:19 - 6:21
    叫做“GameManager”。
  • 6:21 - 6:23
    我们将“Start ”改成“Awake”。
  • 6:23 - 6:27
    在"Awake"里,我们要检查“GameManager.Instance”
  • 6:27 - 6:29
    是否为空。
  • 6:29 - 6:32
    这里我们使用的是我们在
  • 6:32 - 6:35
    “GameManager”脚本中创建的静态变量,
  • 6:35 - 6:37
    并从“Loader ”脚本中访问它。
  • 6:38 - 6:40
    如果它等于null,我们就会实例化
  • 6:40 - 6:42
    我们的“GameManager”预制体。
  • 6:42 - 6:45
    我们可以删除“Update”函数,因为我们不打算使用它。
  • 6:46 - 6:48
    这就是我们目前所需要的。
  • 6:50 - 6:54
    我们在编辑器的“hierarchy”中删除我们的“GameManager”。
  • 6:55 - 6:58
    然后将我们的“Loader”脚本添加到“ main camera”中。
  • 6:59 - 7:01
    添加了我们的“Loader ”脚本,我们会拖拽
  • 7:01 - 7:03
    我们的“GameManager”预制体。
  • 7:07 - 7:09
    现在我们可以测试我们的场景了。
  • 7:12 - 7:15
    现在我们已经有了“GameManager”,
  • 7:15 - 7:16
    我们可以列出一些级别,
  • 7:16 - 7:19
    是时候让我们的units移动了。
  • 7:19 - 7:22
    在下个视频中,我们要写一个脚本
  • 7:22 - 7:24
    叫做“MovingObject”。
Title:
2D Roguelike 5 of 14 : Game Manager
Description:

* IMPORTANT - This projects requires Unity 4.6 or greater *
Watch on Unity's learn site here -
http://unity3d.com/learn/tutorials/projects/2d-roguelike

This 2D Roguelike project guides you through creating a turn based, tile based game with procedurally generated levels. In the game you play as a lone man trying to find food and survive the waste land for as long as you can.

This is part 5 of 14 in which we write our game manager script which uses a singleton pattern.

Presented by -
Matt Schell - Screencaster (@mattmirrorfish)

more » « less
Video Language:
English
Duration:
07:31

Chinese, Simplified subtitles

Revisions