WEBVTT 00:00:00.000 --> 00:00:01.700 大家好,我是马克 00:00:01.700 --> 00:00:05.525 我正在制作一款有关「磁铁」的游戏 00:00:05.525 --> 00:00:07.850 首先,我这个视频系列的一大初衷 00:00:07.850 --> 00:00:12.500 就是要真实、透明、全面的为你展示 00:00:12.500 --> 00:00:15.000 自己亲自制作游戏是什么体验 00:00:15.000 --> 00:00:16.150 而这某种程度意味着 00:00:16.150 --> 00:00:19.925 我不可能只向你展示那些有趣、欢乐 00:00:19.925 --> 00:00:21.743 适合做成视频的部分 00:00:21.743 --> 00:00:23.950 比如为游戏机制打造原型 00:00:23.950 --> 00:00:25.050 设计关卡 00:00:25.050 --> 00:00:27.425 或者放出惊喜 DEMO 00:00:27.425 --> 00:00:28.750 而且,就目前来看 00:00:28.750 --> 00:00:33.575 游戏开发过程中,实际有大量的工作都称不上有趣 00:00:33.575 --> 00:00:35.200 比如制作菜单 00:00:35.200 --> 00:00:36.400 屏幕 HUD 界面 00:00:36.400 --> 00:00:38.075 保存和读取数据 00:00:38.075 --> 00:00:40.100 支持各种不同的控制器类型 00:00:40.100 --> 00:00:41.475 同步选项 00:00:41.475 --> 00:00:42.675 追踪进展 00:00:42.675 --> 00:00:45.000 制作关卡过场,以及更多 00:00:45.000 --> 00:00:49.050 这部分内容很少在开发者记录、或是纪录片中出现 00:00:49.050 --> 00:00:52.450 因为说实话,它们很无聊 00:00:52.450 --> 00:00:54.175 但总有人来做这部分内容吧 00:00:54.175 --> 00:00:58.250 而在本游戏中,这个人则是…… 00:00:58.250 --> 00:00:59.650 额,好像是我自己啊 ? 00:01:00.700 --> 00:01:08.550 开发之旅 00:01:10.100 --> 00:01:12.125 那么,在本系列的上期视频中 00:01:12.125 --> 00:01:14.950 我完全重制了自己的角色操控系统 00:01:14.950 --> 00:01:20.450 其中就包括了为玩家提供更丰富的操控选项设置 : 00:01:20.450 --> 00:01:25.700 比如让你在「按下按钮瞄准」和「按住按钮瞄准」之间选择 00:01:25.700 --> 00:01:29.700 还有让玩家能够自由设置所有功能的键位 00:01:29.700 --> 00:01:32.925 还有让玩家自由设置磁铁的颜色 00:01:32.925 --> 00:01:36.275 这些选项对于单个的临时测试关卡来说运作良好 00:01:36.275 --> 00:01:39.900 但如果我想让这些选项在整部游戏中都能通用 00:01:39.900 --> 00:01:44.400 我就需要找点方法,在不同的关卡之间同步这些选项 00:01:44.400 --> 00:01:48.075 让玩家在硬盘中保存和读取自己的选项设置 00:01:48.075 --> 00:01:52.875 并为玩家们提供 UI,用来设置这些 ……「设置」 00:01:52.875 --> 00:01:55.700 那么在研究了一阵子之后 00:01:55.700 --> 00:01:57.000 这是我得出的成果 : 00:01:57.000 --> 00:01:59.900 当你第一次启动游戏,进入主菜单时 00:01:59.900 --> 00:02:02.775 我会生成一个「设置管理器」 00:02:02.775 --> 00:02:06.100 这是一个包含了好几个脚本的隐形 Game Object 00:02:06.100 --> 00:02:12.125 用来追踪玩家的设置,并将这些选项设置存储、读取在硬盘中 00:02:12.125 --> 00:02:15.575 这个 Object 会被设置为「DontDestroyOnLoad」 加载新场景时不要破坏 00:02:15.575 --> 00:02:17.600 这意味着,当玩家开始游戏时 00:02:17.600 --> 00:02:22.125 主菜单界面会被从内存中删除,以一个关卡取代 00:02:22.125 --> 00:02:26.725 但是,这个「设置管理器」会像个钉子户一样赖着不走 00:02:26.725 --> 00:02:28.750 而因为它会停留在内存之中 00:02:28.750 --> 00:02:31.550 这个新的关卡仍然能够找到设置管理器 00:02:31.550 --> 00:02:33.975 然后轻松得问它问题 00:02:33.975 --> 00:02:35.650 比如玩家角色可以问 : 00:02:35.650 --> 00:02:37.950 「我现在应该使用低灵敏度的瞄准吗?」 00:02:37.950 --> 00:02:39.700 然后磁铁可以问 : 00:02:39.700 --> 00:02:41.200 「我现在应该变成什么颜色?」 00:02:41.200 --> 00:02:42.475 而这个面板可以问 : 00:02:42.475 --> 00:02:44.925 「我现在是否应该显示无障碍标志?」 00:02:44.925 --> 00:02:47.000 简单说,我在这里所做的事是 00:02:47.000 --> 00:02:53.200 将游戏的底层关卡逻辑,与实际的关卡设计内容拆分开来 00:02:53.200 --> 00:02:56.200 现在想来,这是一目了然的设计 00:02:56.200 --> 00:02:59.300 但我在 MVP 阶段完全忽略了这个方面 00:02:59.300 --> 00:03:03.075 那时,每个关卡都有大量各自的复制粘贴代码 00:03:03.075 --> 00:03:05.025 无论是流程存读档 00:03:05.025 --> 00:03:06.550 还是关卡切换功能 00:03:06.550 --> 00:03:12.075 甚至每一关都有独立的复制「暂停界面」,用来在游戏中使用 00:03:12.075 --> 00:03:14.150 这非常不方便 00:03:14.150 --> 00:03:16.325 让测试关卡运转缓慢 00:03:16.325 --> 00:03:19.325 为我的 Hierarchy 增加了大量无意义的废物 00:03:19.325 --> 00:03:22.300 它让选项的设置变得非常难以统一 00:03:22.300 --> 00:03:25.350 在不同关卡之间追踪物品细节也非常困难 00:03:25.350 --> 00:03:29.325 这个新系统就可就要聪明太多了 00:03:29.325 --> 00:03:34.650 所以我决定多创建一些类似的隐形管理器 00:03:34.650 --> 00:03:38.400 现在,你可以将一个关卡的名字发送给「过场管理器」 00:03:38.400 --> 00:03:42.425 它会擦除现有的关卡,然后跳转到一个新的关卡 00:03:42.425 --> 00:03:45.350 与它成对的还有这个「音乐管理器」 00:03:45.350 --> 00:03:51.750 它会让暂时没做好的背景音乐随着关卡的载入而淡入淡出 00:03:51.750 --> 00:03:55.425 还有「HUD 管理器」,负责在屏幕顶层绘制信息 00:03:55.425 --> 00:03:59.950 比如教程提示、以及根据情况出现的按键提示图标 00:03:59.950 --> 00:04:03.100 而且,它还会根据你的控制器类型自动变化 00:04:03.175 --> 00:04:09.225 我还制作了一个「UI 管理器」,用来放置暂停菜单和选项菜单 00:04:09.225 --> 00:04:13.075 我承认,目前它看起来丑到不行 00:04:13.075 --> 00:04:14.925 我只是打算先专心打造基础 00:04:14.925 --> 00:04:16.900 —— 未来会把它改好看的 00:04:16.900 --> 00:04:18.850 与声音设计类似 00:04:18.850 --> 00:04:22.775 UI 设计是未来马克的工作 00:04:22.775 --> 00:04:27.500 是的我承认,似乎未来马克的工作开始越堆越多了 00:04:27.500 --> 00:04:30.475 而我打算再制作一个额外的管理器 00:04:30.475 --> 00:04:36.950 那么,在 MVP 中,游戏从第一关到第二关、再到第三关,以此类推 00:04:36.950 --> 00:04:42.975 但我不认为,这样线性的关卡排布对解谜游戏来说是最好的 00:04:42.975 --> 00:04:46.950 当然,有些解谜游戏是这样的,比如《传送门》和《inside》 00:04:46.950 --> 00:04:48.300 但其他的,比如说 00:04:48.300 --> 00:04:49.075 《时空幻境》 00:04:49.075 --> 00:04:50.425 《史蒂夫的香肠卷》 00:04:50.425 --> 00:04:51.900 还有《巴巴是你》 00:04:51.900 --> 00:04:54.375 都有着更开放性的结构 00:04:54.375 --> 00:04:57.950 你可以跳过关卡,不以固定顺序游玩 00:04:57.950 --> 00:05:01.900 也可以在稍后回顾自己此前跳过了的谜题 00:05:01.900 --> 00:05:03.400 我挺喜欢这种的 00:05:03.400 --> 00:05:06.200 我不想因为玩家在某一个谜题上卡住了 00:05:06.200 --> 00:05:09.025 就用巨大的空气墙绝情得挡住他们的进度 00:05:09.025 --> 00:05:13.400 因此,我想在自己的游戏里引入这种非线性的关卡结构 00:05:13.400 --> 00:05:14.700 而这是我的做法 : 00:05:14.700 --> 00:05:15.474 在每一关中 00:05:15.474 --> 00:05:18.100 你的目标都是找到、收集一把钥匙 00:05:18.100 --> 00:05:20.350 我新做了一个「游戏进度管理器」 00:05:20.350 --> 00:05:22.700 存储了一个记录游戏全部钥匙的列表 00:05:22.700 --> 00:05:26.975 一旦你找到其中一把,它就会在列表中将它勾去,然后在硬盘上储存进度 00:05:26.975 --> 00:05:29.550 我建造了一个很简单的枢纽关卡 00:05:29.550 --> 00:05:32.325 其中放置了很多扇通往各个谜题的门 00:05:32.325 --> 00:05:34.025 在末尾处,有一扇特殊的门 00:05:34.025 --> 00:05:38.275 仅会在你收集到了一定数量的钥匙后才会解锁 00:05:38.275 --> 00:05:43.175 而这个数量,我可以轻松的在今后根据平衡来调试 00:05:43.175 --> 00:05:46.200 说到调试和平衡 00:05:46.200 --> 00:05:51.350 我想要设计一种更方便的、允许我自己改变关卡排序的方式 00:05:51.350 --> 00:05:56.150 帮助我通过玩家对谜题的难度反馈来塑造心流 00:05:56.150 --> 00:06:01.625 所以,我让整个关卡的切换系统都基于关卡的文件名来跳转 00:06:01.625 --> 00:06:05.725 每个关卡的名字都类似于「01 电梯 02」 00:06:05.725 --> 00:06:10.075 前两位数表示了这个关卡所属的枢纽关卡的序号 00:06:10.075 --> 00:06:14.600 而后两位数则表示了该关卡内部的钥匙拥有的序号 00:06:14.600 --> 00:06:18.225 然后,所有相关的系统都只会读取关卡的名字 00:06:18.225 --> 00:06:20.450 从中提取它们需要的 string 00:06:20.450 --> 00:06:22.425 确认对应这个名字的关卡 00:06:22.425 --> 00:06:27.450 而这意味着,我只需要修改关卡的文件名就可以改变它们的顺序 00:06:27.450 --> 00:06:29.650 效率非常高 00:06:29.650 --> 00:06:33.400 鉴于我们在聊效率的话题,那就顺便聊一聊工具 00:06:33.400 --> 00:06:36.625 我在此前 MVP 中发现的另一个问题是 00:06:36.625 --> 00:06:43.325 制作关卡、尤其是迭代调试它们时,体验非常的折磨 00:06:43.325 --> 00:06:44.875 让我给你个例子 : 00:06:44.875 --> 00:06:50.525 如果我想让这个电磁铁射程短一些、再把它改成红色 00:06:50.525 --> 00:06:53.375 我需要调整 AreaEffector 的尺寸 00:06:53.375 --> 00:06:55.425 调整光柱的视觉尺寸 00:06:55.425 --> 00:06:56.925 移动它的粒子系统 00:06:56.925 --> 00:06:58.325 减少其存在时间 00:06:58.325 --> 00:06:59.825 改变粒子的颜色 00:06:59.825 --> 00:07:01.050 改变光柱的颜色 00:07:01.050 --> 00:07:02.250 改变 Sprite 的颜色 00:07:02.250 --> 00:07:03.650 改变磁铁的图层 00:07:03.650 --> 00:07:05.050 改变缓冲区域的标签 00:07:05.050 --> 00:07:07.350 改变 AreaEffector 的碰撞体蒙版 00:07:07.350 --> 00:07:08.325 你可以想象一下 00:07:08.325 --> 00:07:11.025 游戏中的几乎每个机制都需要这套流程 00:07:11.025 --> 00:07:13.600 就算我只是想把某个东西向上移动一个单位 00:07:13.600 --> 00:07:17.950 或者是想要将一扇门的初始状态从关闭改为开启 00:07:17.950 --> 00:07:23.225 由此我意识到,尽管 Unity 是一件制作游戏的工具 00:07:23.225 --> 00:07:26.375 它不会直接帮忙「制作我的游戏」 00:07:26.375 --> 00:07:28.400 —— 因为这是我的工作 00:07:28.400 --> 00:07:31.650 我需要亲手制作这些工具和系统 00:07:31.650 --> 00:07:35.525 允许我为自己独特的游戏生成相对应的内容 00:07:35.525 --> 00:07:37.250 牢记这一点后 00:07:37.250 --> 00:07:43.450 全新版本的电磁铁面板,在 Inspector 中多了一个简单的滑块高度调整工具 00:07:43.450 --> 00:07:45.950 当我将滑块上下移动时 00:07:45.950 --> 00:07:50.400 我前面提到过的那些相关变量也会自动据此进行调整 00:07:50.400 --> 00:07:55.061 这些用于切换面板颜色、开关的按钮也是一样 00:07:55.061 --> 00:07:58.175 简而言之,如果我游戏中的某样东西需要频繁的调整 00:07:58.175 --> 00:08:02.175 而修改它们的方式则是一整套固定顺序的流程 00:08:02.175 --> 00:08:06.475 我就会制作一些简单的脚本,帮助我轻松的一键修改 00:08:06.475 --> 00:08:10.200 然后我为 MVP 中越来越多的物品制作了这种脚本 00:08:10.200 --> 00:08:13.450 让它们用起来更加简单和效率 00:08:13.450 --> 00:08:15.200 比如这个移动盒子 : 00:08:15.200 --> 00:08:20.250 我现在用 Unity 的内置道具展示这些盒子的起始点和目的地 00:08:20.250 --> 00:08:21.850 以及它会经过的路径 00:08:21.850 --> 00:08:25.625 我还设置了一个独立窗口,用来存储游戏机制的预制件 00:08:25.625 --> 00:08:30.350 这让我可以像玩《马里奥制造》一样,直接把物品拖拽进场景中 00:08:30.350 --> 00:08:34.550 哦,制作 MVP 时,Unity 的 Event 系统也很困扰我 00:08:34.550 --> 00:08:37.250 我说的并非是系统自身,它们很好用 00:08:37.250 --> 00:08:39.125 这是它们运作的方式 : 00:08:39.125 --> 00:08:42.200 比如在这个绿色按钮的脚本中 00:08:42.200 --> 00:08:46.725 我让按钮被按下时「触发一个 Unity Event」 00:08:46.725 --> 00:08:48.875 然后,在编辑器界面 00:08:48.875 --> 00:08:51.600 Inspector 中会出现一个简洁的插槽 00:08:51.600 --> 00:08:54.650 我可以从场景中把任意 Object 拖拽进来 00:08:54.650 --> 00:08:57.675 从而运行那个 Object 上附带的函数 00:08:57.675 --> 00:08:59.725 那么现在,当我按下这个绿色按钮 00:08:59.725 --> 00:09:02.250 它会关闭这个电磁铁面板 00:09:02.250 --> 00:09:05.525 对于解谜游戏来说非常好用 00:09:05.525 --> 00:09:10.900 但当我需要从 Hierarchy 中找到目标的 Object 时,过程就很折磨了 00:09:10.900 --> 00:09:15.125 我多么希望能有一个类似于 Photoshop 中的吸管的功能 00:09:15.125 --> 00:09:17.900 允许我直接选取场景中的 Object 00:09:17.900 --> 00:09:21.825 所以我滥用了自己的互联网声望 00:09:21.825 --> 00:09:26.300 找了个比我聪明得多的人,让他完全按照我的描述做了个工具 00:09:26.300 --> 00:09:29.200 非常好用,我时时刻刻都在用 00:09:29.200 --> 00:09:32.150 我将这个 Unity 工具上传到了 GitHub 页面 00:09:32.150 --> 00:09:34.150 你可以通过视频简介下载 00:09:34.150 --> 00:09:36.075 那么现在,我已经制作了一堆工具 00:09:36.075 --> 00:09:40.475 应该能让我设计谜题的过程更加简单,有效率一些 00:09:40.475 --> 00:09:43.975 我决定先做一个谜题,测试一下工具 00:09:43.975 --> 00:09:45.975 是的没错,效率确实大幅提高了 00:09:45.975 --> 00:09:49.925 但这个过程中还有一些恼人的瓶颈和细节 00:09:49.925 --> 00:09:54.975 于是我修好它们,为了测试又做了一个关卡 00:09:54.975 --> 00:09:56.800 然后又做了一个 00:09:56.800 --> 00:10:00.750 我紧接着又做了个关卡,才意识到…… 00:10:00.750 --> 00:10:05.925 我现在有一整套系统级的关卡管理器在后台运行着 00:10:05.925 --> 00:10:08.250 我做了一个完整的枢纽结构关卡 00:10:08.250 --> 00:10:12.075 我还做了四五个全新的谜题 00:10:12.075 --> 00:10:15.575 我是不是无意中做出了部游戏啊 ? 00:10:15.575 --> 00:10:16.450 惊了 ! 00:10:16.450 --> 00:10:21.300 这太乐了,我一开始根本不打算为我的游戏再做一部新的 DEMO 00:10:21.300 --> 00:10:25.325 但我的硬盘上却多出了一部几乎整装待发的新游戏 00:10:25.325 --> 00:10:30.425 我认为这很好地说明了,效率工具对于游戏制作有多重要 00:10:30.425 --> 00:10:33.250 它们让你多快好省的制作游戏 00:10:33.250 --> 00:10:36.700 甚至你在反应过来前就已经做好了 00:10:36.700 --> 00:10:38.975 所以我认为每个人都值得 00:10:38.975 --> 00:10:43.675 在游戏制作的一开始花费一些额外的力气和汗水 00:10:43.675 --> 00:10:47.268 因为它会帮你解决大量时间、精力 00:10:47.268 --> 00:10:51.300 让你在游戏开发的主要阶段中顺风顺水 00:10:51.300 --> 00:10:53.725 无论如何,这都棒极了 00:10:53.725 --> 00:10:55.750 因为要知道,在 MVP 阶段 00:10:55.750 --> 00:10:58.575 我收到了大量值得注意的负面反馈 00:10:58.575 --> 00:11:00.950 大量玩家对这部游戏不满意的地方 : 00:11:00.950 --> 00:11:03.950 比如角色的操控手感极其的糟糕 00:11:03.950 --> 00:11:07.750 游戏的视觉语言有大量恼人的不统一之处 00:11:07.750 --> 00:11:12.600 平台跳跃和解密玩法的混搭让一些玩家烦恼于正确的过关思路 00:11:12.600 --> 00:11:16.850 大部分谜题都太短,缺少恍然大悟的「觉悟时刻」 00:11:16.850 --> 00:11:19.825 大量的关卡都杂乱且 BUG 满天飞 00:11:19.825 --> 00:11:22.775 你需要干等着让物品完成运动循环 00:11:22.775 --> 00:11:27.625 而且这部游戏并不能真的让人感受到它以磁铁为核心的机制 00:11:27.625 --> 00:11:32.025 那么,在这部新 DEMO,《无名磁铁游戏》 2.0 中 00:11:32.025 --> 00:11:35.200 我有机会修改此前所有的那些问题 00:11:35.200 --> 00:11:37.550 看看人们现在如何评价这部游戏 00:11:37.550 --> 00:11:41.750 我希望你一会能够立刻前往 itch.io 00:11:41.750 --> 00:11:45.225 玩玩这部全新的……「惊喜 DEMO」 00:11:45.225 --> 00:11:46.375 是的,我真香了 00:11:46.375 --> 00:11:48.725 这次并非 Patreon 独占,大家都可以体验 00:11:48.725 --> 00:11:50.625 它支持 PC 和 Mac 平台 00:11:50.625 --> 00:11:51.950 它支持键盘鼠标操作 00:11:51.950 --> 00:11:54.250 你也可以用各种型号的手柄玩 00:11:54.250 --> 00:11:55.500 请一定尝试一下 00:11:55.500 --> 00:12:01.200 并在视频、itch.io 的评论区中给我一些反馈 00:12:01.200 --> 00:12:05.650 下一期我会谈谈这新一轮的反馈 00:12:05.650 --> 00:12:09.025 然后探讨一下游戏未来的方向 00:12:09.025 --> 00:12:10.925 非常感谢你的观看 00:12:10.925 --> 00:12:12.300 祝你享受这部游戏 00:12:12.300 --> 00:12:13.500 我们下期再见…… 00:12:13.500 --> 00:12:14.475 哦,结束之前 00:12:14.475 --> 00:12:18.100 我要说 GMTK Game Jam 2022 年回归了 00:12:18.100 --> 00:12:20.250 它会在 7 月 15 号开始 00:12:20.250 --> 00:12:22.450 所以当你在 itch.io 下游戏时 00:12:22.450 --> 00:12:25.200 也别忘了顺便报名参赛 GameJam 00:12:25.200 --> 00:12:26.625 我们不见不散