文章目录
-
- 一、水果缤纷乐
-
- [1.1 游戏设计](#1.1 游戏设计)
-
- [1.1.1 项目解析](#1.1.1 项目解析)
- [1.1.2 项目优化](#1.1.2 项目优化)
- [1.1.3 功能拆分](#1.1.3 功能拆分)
- [1.2 场景制作](#1.2 场景制作)
-
- [1.2.1 场景需求](#1.2.1 场景需求)
- [1.2.2 创建主镜头、绘制草稿,构思文案和情景](#1.2.2 创建主镜头、绘制草稿,构思文案和情景)
- [1.2.3 构建场景地图](#1.2.3 构建场景地图)
- [1.2.4 光源与氛围设置](#1.2.4 光源与氛围设置)
- [1.3 游戏初始化](#1.3 游戏初始化)
-
- [1.3.1 物编、UI预设置](#1.3.1 物编、UI预设置)
- [1.3.2 游戏初始化](#1.3.2 游戏初始化)
- [1.3.2 玩家初始化](#1.3.2 玩家初始化)
- [1.4 水果刷新](#1.4 水果刷新)
-
- [1.4.1 基础功能](#1.4.1 基础功能)
- [1.4.2 刷新优化](#1.4.2 刷新优化)
- [1.5 水果切除逻辑](#1.5 水果切除逻辑)
-
- [1.5.1 基础切除功能](#1.5.1 基础切除功能)
-
- [1.5.1.1 统计切除的水果数量和分数](#1.5.1.1 统计切除的水果数量和分数)
- [1.5.1.2 设计炸弹切除时的闪光和镜头震动效果](#1.5.1.2 设计炸弹切除时的闪光和镜头震动效果)
- [1.5.2 切除优化](#1.5.2 切除优化)
-
- [1.5.2.1 鼠标刀光跟随(拖尾)与切中音效](#1.5.2.1 鼠标刀光跟随(拖尾)与切中音效)
- [1.5.2.2 连击机制](#1.5.2.2 连击机制)
- [1.6 游戏优化](#1.6 游戏优化)
-
- [1.6.1 实时得分显示与倒计时显示](#1.6.1 实时得分显示与倒计时显示)
- [1.6.2 游戏结算](#1.6.2 游戏结算)
- 二、密室逃脱(剧情设计)
-
- [2.1 游戏设计](#2.1 游戏设计)
-
- [2.1.1 剧情文案](#2.1.1 剧情文案)
- [2.1.2 场景设计](#2.1.2 场景设计)
- [2.1.3 功能拆分](#2.1.3 功能拆分)
- [2.2 场景制作](#2.2 场景制作)
-
- [2.2.1 基础结构与风格设计](#2.2.1 基础结构与风格设计)
- [2.2.2 氛围道具](#2.2.2 氛围道具)
- [2.3 独立互动模块](#2.3 独立互动模块)
-
- [2.3.1 背包设计](#2.3.1 背包设计)
- [2.3.2 道具视觉呈现](#2.3.2 道具视觉呈现)
- [2.3.3 物品交互(获得)](#2.3.3 物品交互(获得))
- [2.3.4 物品交互(提示)](#2.3.4 物品交互(提示))
- [2.3.5 游戏初始化设置(动画与镜头应用)](#2.3.5 游戏初始化设置(动画与镜头应用))
- [2.4 重要物品展示](#2.4 重要物品展示)
-
- [2.4.1 功能分解](#2.4.1 功能分解)
- [2.4.2 直接显示道具本身(子触发器)](#2.4.2 直接显示道具本身(子触发器))
- [2.4.3 对道具进行注解](#2.4.3 对道具进行注解)
- [2.5 剧情模块](#2.5 剧情模块)
-
- [2.5.1 物品合成解锁](#2.5.1 物品合成解锁)
- [2.5.2 设置解锁剧情的前提条件](#2.5.2 设置解锁剧情的前提条件)
- [2.6 对话UI](#2.6 对话UI)
-
- [2.6.1 对话UI设计](#2.6.1 对话UI设计)
- [2.6.2 触发编写](#2.6.2 触发编写)
- [2.7 密室优化](#2.7 密室优化)
-
- [2.7.1 行为反馈](#2.7.1 行为反馈)
- [2.7.2 镜头应用](#2.7.2 镜头应用)
- [2.7.3 动画提示(时间轴动画)](#2.7.3 动画提示(时间轴动画))
- 三、坦克大战(关卡设计与制作)
-
- [3.1 游戏设计](#3.1 游戏设计)
- [3.2 场景制作](#3.2 场景制作)
-
- [3.2.1 关卡设计](#3.2.1 关卡设计)
- [3.2.2 墙体设计](#3.2.2 墙体设计)
- [3.2.3 装饰物组合](#3.2.3 装饰物组合)
- [3.2.4 场景氛围](#3.2.4 场景氛围)
- [3.3 玩家操作设定](#3.3 玩家操作设定)
-
- [3.3.1 游戏初始化](#3.3.1 游戏初始化)
- [3.3.2 移动设定](#3.3.2 移动设定)
- [3.3.3 射击设定](#3.3.3 射击设定)
- [3.4 关卡制作](#3.4 关卡制作)
-
- [3.4.1 敌方机甲生成(随机池刷怪)](#3.4.1 敌方机甲生成(随机池刷怪))
-
- [3.4.1.1 逻辑整理](#3.4.1.1 逻辑整理)
- [3.4.1.2 触发编写](#3.4.1.2 触发编写)
- [3.4.2 敌方机甲运动](#3.4.2 敌方机甲运动)
-
- [3.4.2.1 逻辑整理](#3.4.2.1 逻辑整理)
- [3.4.2.1 触发编写](#3.4.2.1 触发编写)
- [3.4.3 敌方机甲攻击](#3.4.3 敌方机甲攻击)
- [3.4.4 奖励机制(添加暂停开关)](#3.4.4 奖励机制(添加暂停开关))
- [3.5 游戏优化](#3.5 游戏优化)
-
- [3.5.1 血量显示](#3.5.1 血量显示)
- [3.5.2 制作倒计时](#3.5.2 制作倒计时)
- [3.5.3 胜负判定](#3.5.3 胜负判定)
- [3.5.3 游戏说明](#3.5.3 游戏说明)
一、水果缤纷乐
参考官网课程《水果缤纷乐》
1.1 游戏设计
1.1.1 项目解析
游戏制作流程一般分为三大类:
- 设计:主要是思考游戏的核心玩法以及游戏的故事背景;
- 美术:主要负责原画及其在计算机中的实现,以及对角色物体场景的三维建模。
- 程序:实现具体的游戏的玩法
本节课要实现的是水果缤纷乐:
- 游戏设计:简单模式和困难(优化)模式
- 游戏机制:让水果出现,然后通过玩家的切除让水果消失。
- 游戏玩法:玩家只需通过按下鼠标左键,点击或者拖动接触水果即可进行水果的消除
- 游戏优化:从触觉、听觉、视觉、感觉四大感知出发,挖掘出困难模式下的游戏趣味,增加玩家的游戏体验感。
1.1.2 项目优化
- 触觉:增强游戏操作性 。
- 让水果的运动具有一定的随机运动轨迹,提高玩家操作感
- 给水果添加自转,这样结合抛物线轨迹和自转,视觉上两侧出现的水果会更符合物理规律,不会太僵硬
- 增加炸弹元素,切到炸弹就会扣分,累计一定分数游戏失败。
- 增强爆炸效果:在切到炸弹时加入一些视觉冲击,比如强烈的光芒和视角的强烈晃动(镜头的上下左右晃动),让炸弹的爆炸显得更真实
- 设置常见的连击因素,一定时间内满足一定条件就会产生连击,连击可以使玩家获得游戏更高分,增强玩家刷分欲望。
- 听觉: 切中炸弹时,播放爆炸音效;切中水果也添加音效,增强反馈。
- 视觉:
- 增加连击UI提示,比如破军三连、神罗五灭。
- 设置切水果的刀光(拖尾)效果:为了让玩家对于自己的操作有一个更明显的感知,同时解决鼠标光标不够明显的问题,我们引入跟随鼠标移动的拖尾效果。
- 感觉: 右上角增加倒计时,加强玩家的紧张感;设计一个得分统计UI界面,游戏结束后显示本局得分,加强游戏体验。
1.1.3 功能拆分
- 游戏初始化设定:定义游戏中需要的元素,比如水果和炸弹;
- 水果刷新逻辑:包括水果的随机运动轨迹和自转;
- 切水果逻辑:包括鼠标的刀光追踪效果、切水果音效的添加;
- 游戏优化:包括连击系统、得分统计等。
1.2 场景制作
1.2.1 场景需求
场景制作第一步是 确定需求;第二步才是确定主题和风格、搭配装饰物组合、使用物件形成自己想要的场景;第三步是在整体搭建完成后,通过光影效果提升空间和氛围感。
在制作游戏前,需要确定自己对于游戏关卡与场景的需求,明确自己的思路。建议大家多参考一些自己体验过的游戏内容,结合现实中的场景,把想要的画面和感觉都逐渐确认到越来越具体的事物上。比如iPhone和iPad上的热门手游水果忍者,它作为一个手机游戏,其操作和画面都是在一个二维平面上展开,背景是极其简单的,木头纹理配上刀痕,呈现的就是一个简单的切菜板。玩家的操作模式,也同样是在二维平面上切砍,而入场的水果是从画面的两侧进入的。
1.2.2 创建主镜头、绘制草稿,构思文案和情景
首先创建一个镜头,命名为"主视角",勾选实时观察功能,便于调整。 配置镜头参数:焦点坐标设为0(定位在整个场景的正中央),俯仰角设为90°(垂直于地面),其它参数保持默认,现在这块平台便是我们的画布,是我们拍照的取景框。
镜头参数:焦点(镜头成像距)、俯仰角(摄像机与水平面的夹角)、导航角(摄像机水平垂线与x轴夹角)、滚角(镜头自转角度)、观察区域(可视范围)等参数。
接着在正式放置装饰物之前,不妨来给这个画面打个草稿:
在有了个大概的关卡结构后,我们需要进一步思考,我们能把这个地图装饰成什么样子呢?在桌板上切菜,在地面上砍瓜,在天上耍杂技,去设想一个与切水果这件事情能关联上的情景,越具体越好。本项目选择的是做一个水果摊场景,在水果摊切水果是很合理的。
有了初始的情景后,继续想更具体一些,比如什么样的水果摊,现代的、未来的、中世纪的、古代的、非洲的;什么天气,什么时间,下雨、刮风打雷还是酷暑严寒、早中晚。若是自己对这些东西没有概念,不够了解,那么就需要设计者去寻找参考图,参考电视剧、动画电影、阅读参考文献。只有去见识和体验更多的东西,才能在需要的时候把它们作为知识储备拿出来,变成自己的东西,融合进创作里。
这里根据关键词整理了一小段文案,可以给大家作为参考,按照这个情境来制作场景。这是一个清晨,一个中世纪集市,一只疲惫的商队缓缓把马车停在了路边,他们需要休息和补充水分。水果摊上琳琅满目,有许多篮子里面装着不同的水果,还有一些正在准备的熟食和其他食材。附近还有许多已经安置好的储物箱与酒桶。商队主人走进水果摊和老板攀谈起来,不一会老板开始漫天要价,商队主人挥手表示着不满,从争吵慢慢变成争斗,摊位上的水果成了牺牲品。
随着越详细的描述,我们脑子里想要的画面就会更加清晰。那么下一步就该去到编辑器中,寻找合适的素材了。
1.2.3 构建场景地图
- 装饰物素材选择:在编辑器中挑选合适素材,调整装饰物的高度与场景对齐。
- 摆放技巧:用装饰物地面直接当做地面平台,让它的平面高度与本身地形高度重合,这样可以省去地形编辑的时间。设置中心点X、Y都等于零,可以确保装饰物在场景的正中央。
- 创作情景:根据具体情景逐步添加装饰物,如水果篮、熟食摊位、储物箱等,丰富画面细节。
1.2.4 光源与氛围设置
-
设置主光源 :使用全局光照模拟天空光,调整时间以固定合适的光影角度
主要的光源来自于全局光照,也就是从天空中射下的方向光。我们可以通过右上角的时间来改变光影的变化。在逐渐调整到自己认为合适的光影角度后,可以去触发器中将时间流逝关闭,把光影角度固定下来。
-
添加辅助光源 :添加火盆点光源,调整颜色(偏红黄)和范围,增强场景细节表现力。
只有一个来自天上的光源,其实是很单薄的。在这个场景中,能合理的提供额外的光源和增添其他颜色的装饰物,便是这个烤肉架下的火盆。我们点击右侧的氛围,创建点光源来营造一个火光。接着调整火光的颜色和影响范围以及亮度。
-
添加视觉引导光源 :使用柔和颜色的点光源突出操作中心,通过明暗对比与暗角弱化周围,增强玩家注意力。
整个场景其实是偏暗和灰的,因为设定的时间是一个清晨,光线较弱。我们需要把游戏操作的中心提亮,把周围弱化,让人的眼睛更加把注意力集中在整个画面的重点上,这就是视觉引导光源。这其实就与摄影中明暗对比的方法类似,都是用黑色弱化周围的表现力,适当的增加暗角,有助于突出主体。为了让这个光看起来不是很突兀,我们可以参考天空的颜色,用偏红和黄一些的颜色,使之看起来柔和一些。
-
添加辅助指向物 :为了水果刷新时指向性更明确,我们在场景中摆放上作为提示的投射物,适当调整大小和方向。
1.3 游戏初始化
游戏初始化就是在游戏刚加载的时候进行的游戏系统设定,包括设置时间、存储水果类型、预设水果刷新随机池等。而玩家初始化,则是在玩家进入游戏的时候进行的系列动作,包括关闭部分鼠标操作、创建全局鼠标拖尾、附着单位设置镜头朝向、点显示开始游戏UI。
1.3.1 物编、UI预设置
-
定义水果的刷新区域 :在场景中绘制出合适大小的矩形区域
-
创建水果单位 :切水果中的各类水果就是以单位的形式存在,打开物编,设置水果模型单位。固定属性中血条样式选择无血条样式,并取消所有可勾选选项,另外所有水果模型缩放设为
10
。
-
设置游戏开始按钮 :在界面编辑器中,导入要用到的UI图片。拖动按钮控件到画布中,选择刚刚导入的图片为常态背景图。调整按钮图片的位置、大小,在页面右侧按钮样式下方的快捷键选项中,选择space快捷键。添加"开始游戏"文本,设置字体为华康新综艺体W7,大小45;再添加一个"press space"文本,大小为30。
-
设置初始视角:为了使视角更符合2D设定,需要固定游戏视角。双击初始化镜头,修改俯仰角为90,导航角为180,滚角为零,距离9800,观察区域35。
1.3.2 游戏初始化
- 创建触发器文件夹:分类管理触发器模块,提高可读性与后期维护性。
- 设置贴合场景、氛围感最好的时间为20点,关闭时间流逝,使得整个游戏场景的光效果维持不变。
- 新建"收纳盒":在触发器中将复杂逻辑拆分为模块,便于调试与优化。
- 创建单位类型的数组变量
fruitArr
,存储四种水果类型 - 创建随机池变量
unitPool
,并设置水果刷新权重,这里只需要设置水果类型对应索引整数的权重不同即可。权重越高,概率越大。
1.3.2 玩家初始化
- 禁用鼠标框选,防止玩家选中水果时,水果底部出现选择圈
- 禁用鼠标滚轮,防止镜头上下移动
- 显示"开始游戏"UI按钮,让玩家可以开始游戏。
1.4 水果刷新
1.4.1 基础功能
基础功能就是当玩家按下开始按钮后,每隔一段时间,会从场地的一侧或两侧随机刷新出6个水果。随机体现在刷新的位置和水果种类上。刷新点水平坐标可以从矩形区域的最左到最右,竖直方向坐标则设为区域的上半部分(水果会有一个下落得过程,所以得在上半区)。水果种类则通过预设的随机池抽取索引来确定水果种类。
- 添加水果阵营:玩家切水果是通过互相敌对造成伤害来实现的,所以新建一个玩家阵营,命名为水果。
- 添加按钮点击事件:再UI编辑器中,为按钮添加左键点击事件,设为水果刷新的触发事件
- 设置一个全局布尔值变量
isGameBegin=True
,表示游戏开始 - 新建的全局计时器变量
RefreshTimer
,每隔三秒刷新一次水果 - 设置实数变量
direction=1
,表示水果从左侧刷新,起始点是区域最小x值;另外有50%概率通过重设变量值,将水果从右侧刷新(direction=-1
),起始点是区域最大x值。 - 从随机池生成一个随即索引表示水果种类,根据水果种类和起始点,刷新水果,存储到遍历
unit
中。
另外为了让单位不与场景模型发生穿模现象,设置单位的高度为450
,过渡时间为零。为了让水果不至于过小,需要放大水果的模型,这里设置单位unit的缩放为8
。对于刷新的所有水果,为了后续方便管理,设置将所有水果单位unit
存储在全局单位组变量unitGroup
中。以下是全部代码。
1.4.2 刷新优化
生成完水果之后,我们需要让其动起来,并持续下落,这可以通过不断改水果的X轴和Y轴坐标来实现。至于水果自转,可以通过不断快速修改水果的朝向即可。
在开始编写之前,我们需要再设置三个自定义键值(一种特殊的全局变量),便于后续使用,分别是水果的水平初速度(左侧为正,右侧为负)、垂直初速度以及自转量。
为了使水果运动显得流畅,设置游戏每经过一帧就刷新一次水果位置。这个语句与水果初始位置矛盾,存在时间差异,所以添加isGameBegin=True
的判断条件,也就是水果创建完毕,游戏开始时,才刷新坐标。然后遍历unitGroup
中所有水果单位,将其单位坐标设为[x+Vx,y+g]
,其中g=30
表示不断下落。
接着设置水果的自转方向。首先判断遍历的水果单位是否存活,然后根据水平速度Vx的正负来设置自转方向。Vx>0
右转(单位角度+自传量),反之左转(单位角度-自传量)。可选参数设置转身时间为0,避免转向延迟。
最后,设置水果销毁逻辑。如果水果超出刷新区域,则将其从unitGroup
中删除,并删除此水果单位。
1.5 水果切除逻辑
1.5.1 基础切除功能
1.5.1.1 统计切除的水果数量和分数
本节课将实现水果切除的核心逻辑,即当玩家的鼠标移动到水果上时,水果就会被切除,这个功能最核心的逻辑是判断鼠标是否切中水果,即鼠标位置是否在水果上。通过一个计时器不断地去获取鼠标,在按下状态时,判断其一定范围内是否有水果,然后用一个单位组mouseUnitGroup
存储所有切到的水果单位。
遍历mouseUnitGroup
单位组,先判断水果是否是存活的,避免一个水果被多次切除重复计算积分的情况。接着根据不同的水果类型做出相应的动作(建议使用收纳盒,存储不同单位的语句块)。
使用全局数组score
和criticalArr
分别存储切到的切水果得分数 和连击数。如果是苹果、西瓜、水蜜桃,分别统计对应的数量和积分。
1.5.1.2 设计炸弹切除时的闪光和镜头震动效果
在界面编辑器中,新建一张闪光图,选取覆盖整个屏幕尺寸的白色图片。然后通过闪光图的透明度transparency的变化来控制渐变(闪光)效果。接下来,使用镜头衰减震动ECA来实现镜头震动效果。
- 晃动幅度:镜头上下或者左右晃动的剧烈程度
- 衰减:最大晃动幅度每次减少的幅度
- 频率:镜头每秒晃动的次数
因为闪光和镜头晃动是同时发生的,所以可以利用计时器单独执行的特点,先模拟闪光,再进行镜头的晃动。虽然动作顺序是一先一后,但是实际执行的过程中,玩家肉眼看来是同步进行的。
最后编写水果切除后销毁逻辑:
1.5.2 切除优化
1.5.2.1 鼠标刀光跟随(拖尾)与切中音效
先在物编中创建一个空模型单位和拖尾魔法效果。当玩家鼠标左键按下时,移动该单位到鼠标的世界位置。通过if语句判定其当前是否拥有拖尾魔法效果,没有则创建。在玩家鼠标左键抬起时,移除单位身上的拖尾魔法效果。
最后,如果切中水果,则出现刀光和切中音效;如果切中炸弹,播放爆炸音效。
新建一个生物单位,命名为"拖尾单位"。取消勾选"是否显示血条刻度",血条样式选择"无血条样式",取消勾选余下所有可勾选项,单位状态选择"无敌",普攻类型选择"空",模型选择"空模型"。
新建普通魔法效果,选择"闪电粒子特效",设置特效缩放为3。
接着在玩家初始化事件中,在玩家鼠标点新建拖尾效果,并存储在全局单位变量mouseUnit
中。
新建连击效果UI:
最后选择一个合适的水果切中音效和炸弹切中音效。
当鼠标按下时,添加拖尾效果,抬起时移除。设置mouse_unit的飞行高度为450,过渡时间为零,避免视觉延迟
1.5.2.2 连击机制
在首次切种水果或者炸弹时(isFirst=True
),1.2秒内连续切到水果且没有切到炸弹,则根据切中水果数组中对应单位类型的数量判定联机种类(破军三元、神罗五灭),最后根据联机种类显示对应提示图、累计连击积分。1.2秒后,将连击数统计数组置零,设置isFirst=True
,代表可以进行下一次的联机判定。
判断是否满足五连击,满足则在score[6]中加35分,播放连击提示图,0.7秒后隐藏。
1.6 游戏优化
本章节我们将从全局考虑,优化整个游戏。游戏的优化有三个方面:实时分数显示、倒计时显示和积分统计面板。
1.6.1 实时得分显示与倒计时显示
游戏开始后,用一个帧计时器实时获取玩家的得分情况,根据分数统计数组各索引值对应的数据含义,计算玩家的得分和扣分情况并显示。
倒计时可以通过秒计时器time实现,将120-time就是倒计时结果:
1.6.2 游戏结算
先在界面编辑器中制作好积分统计面板UI:
在秒计时器中,不断检测三种游戏结束的判定条件,给出胜利或失败结局,显示本局得分结果,删除水果刷新计算器refreshTimer
,删除所有现存水果单位,6秒后给出游戏结局。
二、密室逃脱(剧情设计)
参考官网课程《密室逃脱》
2.1 游戏设计
上一章我们共同完成了水果缤纷乐,本章我们将继续探索经典小游戏密室逃脱的制作。密室类游戏总离不开各种氛围的渲染,比如阴森恐怖、惊悚不安等等。除此之外,玩家可以通过与周围物品环境的不断交互,获得线索、钥匙密码等,从而最终逃离。结合以上两点,在制作本次密室逃脱游戏时,我们的整体画风以及物品道具的陈列,都应配合主题进行构建。
对于一款密室游戏而言,玩家的游戏体验主要来源于游戏的代入感、情绪的波动以及解谜的成就感。为了达到以上三点,就需要我们为游戏设置一个剧情故事,让玩家以第一视角的身份进入游戏,体会剧情的发展。
2.1.1 剧情文案
最近几个月,小镇里总是陆陆续续有人口失踪,我是一名调查员,被派遣到小镇调查这起神秘的失踪案件。他是我的助手,出生于小镇,对小镇有一定的了解。
在调查过程中,我被邪教组织袭击,囚禁在了密室中。远处突然传来一声枪响,我猛地坐直起来,随即传来一阵强烈的眩晕感,大脑嗡嗡作响,一片空白,想不起任何事情发生了什么。我是谁,这又是哪里?
翻了翻身上只找到了一支笔、一本残缺的日记本和一把车钥匙。看着日记上熟悉的字迹,我隐隐知道了事情的头绪。这支笔就是一根普通的铅笔,可以用来记笔记。车钥匙也只是一把普通的钥匙,没什么特别的。
我试着推了推房间门,提示我需要密码才可以。我开始寻找密码线索。突然我发现前方躺着一位奄奄一息的人,他声称是我的助手,再过不久就要死去了,希望我能在他们回来前赶紧逃出去。出去之后,他颤颤巍巍地将一张日记残页递给了我。这张残页看起来像是从我的日记本上撕下来的,上面画着一幅画,并写着秘密就在这里。难道秘密和画有关?
我开始在房间里寻找画。找到了,原来画的背面有一把钥匙和一张空白纸条。咦等等,这张纸条上好像有痕迹。我拿出背包里的铅笔在纸条上涂画纸条,显示出了一串数字58802。我想这就是打开房门的密码了。
房门外有一个走廊,散落着日记碎片。我想他们一定有用,先收起来好了。除了刚刚的密室,这里居然还有其他的房间。在刚刚的密室中,我又拿到一把钥匙。我想一定能打开其中的一间房门。这间打不开,我再试试,另外一间打开了。这间房更像是一个书房。
我来到书桌旁,发现上面有一页我的日记。原来这个小镇里居然隐藏着一个邪教组织。日记的下方还画着熟悉形状的碎片图案,我隐隐感觉和刚刚捡到的碎片有关。拿出碎片,我开始按照日记上的提示方法开始拼接,得出一串数字555万4455。虽然不知道这串数字有什么用,但我还是记住了它。
继续在房里寻找着其他线索。突然我发现书架有些异常。原来这个书架竟然藏着一个密码锁。我尝试输入刚刚破解的密码,只听远处传来一声不明生物的叫声,好似穿透灵魂般让人颤抖。紧接着房屋开始了剧烈颤抖,那装满书籍的沉重书架也随着震动,陆陆续续倒了下来。这时好像又有一扇门打开了,我赶紧跑出来,到了之前无法打开的那扇房门前,发现这间房像是邪教组织祭祀的地方。
地面散落着许多书籍,蓝色的书有四本,还有两本黑色的书,红色的书有六本。我在房间内继续搜寻着线索,终于在一把椅子上发现了新的日记残页。原来邪教的成员已经渗透到小镇的各个角落了。他们会定期找一些外来者作为祭品,献给他们的神。我想我和助手也是被当作祭品抓来了。看来得抓紧时间逃出去了。日记的背后提示着最后的密码,和三种书籍的颜色有关。我想我知道密码了。我来到走廊处的房屋大门,颤抖着输入642的密码,终于我逃出来了。
2.1.2 场景设计
有了游戏剧情后,就需要进行密室游戏交互设计。结合剧情的走向,游戏场景包括三个房间和一个走廊,每个房间都有推动剧情发展的交互物品。
- ROOM1:开局玩家被囚禁于ROOM1密室,发现画、纸笔和ROOM2钥匙。解锁画得到出门密码,来到ROOM2;
- 走廊:从ROOM1出来进入走廊,调查员将拾取物品日记碎片;
- ROOM2:根据书桌上的日记残页,拼接出日记碎片,得到书架密码锁密码,解密后打开ROOM3;
- ROOM3:椅子上的日记残页提示大门密码与地上散落的书籍有关,破解后打开大门,逃离成功。
2.1.3 功能拆分
在本游戏中,密室本身的机制是不需要时间线的,只需要在玩家触发时判断是否满足条件。并且由于不存在分支解法,也就是没有多结局的情况,所以从游戏全局的规划出发,按照互动模块来拆分制作顺序,总共分为五大模块:
- 互动模块:密室中一定会存在大量的玩家可与之交互的环境物品,例如获得物品、点击物品、获得信息提示,这种都属于互动模块;
- 重要物品显示:显示重要物品所提供的信息,以便玩家掌握与解谜相关的事件信息;
- 游戏剧情模块:推动游戏剧情发展的模块,包含大量事件触发与判断
- 对话UI模块:用于在游戏画面中呈现剧情旁白;
- 游戏优化模块:提升游戏体验
2.2 场景制作
氛围营造 :第一章中,我们已经学习了如何从策划需求和文案设计方面思考和筛选装饰物来制作游戏场景。本章我们将围绕恐怖灵异、惊悚的主题来制作解谜类游戏的场景,主要围绕以下四个部分:基础布置、细节装饰、氛围道具、灯光与雾。
关键词提取:我们可以预先根据文案策划的描述,逐渐细化对于场景的思考与想象。对于密室题材,首先我们从文案策划的内容中总结提取出一些关键词,并围绕着关键词来营造关卡的核心体验:残夜、密室、悬疑、恐怖不安、小镇、惊悚、邪教。
2.2.1 基础结构与风格设计
在某个密闭的室内空间里,故事主角将会从这个地方醒来。我们需要对这个房间有基础的结构和风格设计。从策划案描述的道具来看,场景应该是现代,所以我们可以挑选几个现代化的模型作为基础素材。
对于房间户型,人们都会倾向于规整的长方形或者正方形结构,便于添加软装家具。同样的道理,我们不必去设计十分复杂或奇形怪状的布局,仅仅为了后续装饰物的摆放。
接着根据房间日常摆设,添加物品,先做一个正常的房间。在这个基础之上再去添加可以营造惊悚恐怖故事氛围的东西。
2.2.2 氛围道具
完全没讲镜头和灯光设计啊
-
设置场景整体风格
将场景的时间调整为凌晨,让画面暗下来。接着美术风格增添偏冷色的滤镜,带一些绿色的氛围,会让整体看上去更加有邪恶和恐怖(动漫场景很难恐怖啊)。
-
添加恐怖元素物品
为了配合策划文案,这个地方正在发生一些类似于邪教祭祀之类的事情,为此我们需要添加一些与这个日常相违背的道具与事物,比如看不懂的话、疑似祭祀用的密文书、破碎的罐子等,来营造与日常冲突的感觉,让玩家意识到不对劲。
-
营造破败感
我们可以使用一些很夸张的树木、错乱的根茎与藤曼缠绕着整个房间,还可以装饰一些爬墙草、乱糟糟的杂草等自然元素,营造一种荒废破败的感觉。
2.3 独立互动模块
独立互动模块指玩家通过鼠标点选道具或靠近道具等方式与道具进行互动。这些互动通常产生以下两种结果:
- 获得新道具:如点击助手后获得新日记残页。
- 提示信息:如点击书堆,提示书籍颜色和数量信息。
在密室游戏中,独立互动模块是核心内容之一,涵盖大量可互动的物体或单位。
2.3.1 背包设计
要获得道具,那么首先得设计背包,主要考虑以下两点:
- 背包展现形式(物品栏或背包栏) :从道具的数量 以及道具的进一步交互 (是否有复杂的道具操作)来考虑,整个密室游戏道具不多,交互就是基本的查看或者合成,所以展示没有要求。考虑到解密中需要反复查看线索,所以选择反馈更及时的背包。
- 背包展示位置 :放置道具栏的核心原则就是方便操作,玩家可能会反复查看,所以我们的UI设计要符合用户的行为习惯。
- 中心:游戏屏幕中心是核心区,不能长时间展示及放置道具。
- 上方:上方区域无论是PC端还是移动端,都是最难操作的区域,一般不会放置操作界面,而是 展示血条金币等级,这些不需要操作的UI。
- 下方:物品栏常见位置,尤其是左下角或者右下角,即不占空间,也方便操作。但因本游戏对话界面多,易与道具栏重叠。
- 右侧:考虑大多数顽疾右手操作鼠标的行为习惯,最终选择右侧展示物品栏
2.3.2 道具视觉呈现
接下来我们需要考虑一下视觉呈现。在密室游戏中会收集到各种各样的道具,所以首先要明确的就是如何区分道具,让玩家明确自己知道收集到了什么样的道具。比起文字,使用图标(icon)展示道具更具美观性和沉浸感,图标需风格一致,信息明确。
接下来,我们要考虑道具图标需不需要文字作为注释。由于道具均为现实物品,玩家通过图标直接可以区分;另外为了减少侧边栏上不必要的展示信息,最终放弃了使用文字进行注释。
2.3.3 物品交互(获得)
通过ECA可以很容易实现这一点。当玩家点击/靠近道具或道具,如果是指定类型,就显示道具图标到UI界面。如果需要设置场景中的装饰物产生互动,需要将其设为自定义单位,去除相关物编属性。
新建画板,重命名为道具展示,添加十个道具展示框,可制作完第一个之后直接复制生成其余9个。1-5设为不显示,6-10和整个画板设为显示。接着在UI界面初始化中,设置显示这三个初始道具(残缺日记本、铅笔、车钥匙)。
第10个道具(解密后的纸)位置可以随便定,游戏开始之后会将其移动到道具5(未解密的纸)的位置:
使用绝对坐标,会不会在不同分辨率屏幕上不一样呢
设置完初始镜头后进行测试,可以看到右侧显示初始的道具栏及三个物品:
2.3.4 物品交互(提示)
有许多物品在与玩家交互后会直接反馈出"没什么特别的"这样的信息,比如room1中地上的箱子和纸盒。设计UI前,需要考虑:
- 提示信息位置:首先我们需要确保玩家能看到这条信息,不会被忽略,可以选择放置在游戏画面中心,用底框加上文字的形式展现。
- 提示信息大小:这算是一种弹窗提示,不需要完全占据游戏画面;提示文字要保持字体和大小基本一致,所以字体不宜过大。
直接使用选中单位事件触发,2s后关闭提示界面。
下面梳理整个场景中需要设置互动的道具:
-
开局 :主角自带三件道具:残缺日记本、铅笔、车钥匙。
-
room1:
- 点击行李箱和纸盒:提示"没什么特别的"。
- 点击助手:获得新日记残页。
- 点击墙壁上的挂画:获得纸条和钥匙。
-
走廊:破解密码进入走廊,直接后获得日记碎片。
-
room2:
- 点击书桌上的日记残页,直接获得(包含线索日记碎片拼接方式)。
- 点击墙上的书架,弹出密码锁界面,需输入正确密码(拼好的日记碎片)才能破解。
-
room3:
- 点击地上三堆书籍:提示信息。
- 凳子上的日记残页:点击获得道具。
-
走廊深处 :触发大门密码输入框。
2.3.5 游戏初始化设置(动画与镜头应用)
- 镜头运动:播放助手雷姆死亡动画,应用镜头5,2s内逐渐切换到镜头6,这两个镜头用于展示场景,增强沉浸感
- 锁定玩家镜头:再过5s,切换到主视角(镜头),并跟随主角单位。设置导航角270,便于玩家控制单位移动。
- 屏蔽多余操作:开启鼠标点选,命玩家选中主角,并关闭鼠标框选和鼠标滚轮。
- 其他设置 : 关闭时间流逝,锁定在晚上8点半;
2.4 重要物品展示
2.4.1 功能分解
功能需求:上一节中我们明确用icon来展示获取道具,但一个小小的icon并不能传达出所有道具信息。这时就需要增加额外的UI来展示这些信息。通过什么样的UI展示信息,以及UI中该包含什么内容,是我们接下来需要思考的。
-
显示信息的形式
- 鼠标悬停弹窗显示:适合简短的注释,一般用于指引,比如技能快捷键及技能作用。
- 弹出新UI提示界面显示:适合信息量大的内容,例如密室解谜时需要反复查看的道具。
-
显示内容的确定:显示内容需要根据道具自身特性进行设计。在密室中,道具的显示内容分为两类:
- 直接显示道具本身:例如日记,道具本身包含了需要传达给玩家的信息,不需要额外注释。每篇日记的开头都用了日记常用的开篇格式,日期及天气,一看就知道是什么,而游戏背景故事也顺着日记内容展开。
- 对道具进行注解 :并不是简单的阐述物品,而是对玩家的一种引导。例如铅笔,这类道具需要附加说明,引导玩家了解道具的作用及其使用方法。
2.4.2 直接显示道具本身(子触发器)
以日记为例,直接显示道具本身,需要考虑以下细节:
- 道具特性设计:日记常用格式,如日期及天气,可以让玩家迅速理解这是什么。
- 翻页功能:因为日记通常包含多页,需要设计翻页按钮。例如向右的按钮代表下一页,向左的按钮代表上一页。
- 退出功能:退出按钮的icon可以是插图标或返回图标,通常位于右上角,符合用户习惯。
Windows关闭界面的操作处于右上角位置,早期的大部分游戏也沿用了这个习惯。当我们的界面交互符合用户日常的行为习惯时,也会减少很多教学成本。
接下来,我们通过具体操作详细讲解日记显示内容UI的制作过程。
-
添加日记道具打开事件 :上一节我们完成了道具展示界面,查看日记内容需要点击日记icon,所以我们为其添加一个左键点击事件。
-
制作日记显示内容
- 新建界面"room1日记",添加图片控件作为底图,铺满屏幕以集中玩家视线,使玩家此时的视角集中于道具信息。
- 添加图片控件作为第一页日记的内容,调整位置到核心区域。
-
设计翻页按钮:确保所有按钮位置一致,方便玩家操作。
- 添加两个向右按钮,用于翻页至下一页,命名为"button下一页1-2"和"button下一页2-3"。
- 添加两个向左按钮,用于返回上一页,命名为"button上一页3-2"和"button上一页2-1"。
-
退出按钮 :添加退出按钮,图标放置在右上角,命名为"关闭room1日记事件"(便于区分其它按钮事件),添加鼠标左键点击事件。
UI制作完毕,只显示bg、第一页,button1下一页及退出按钮,其它控件设为不显示。
在触发器中新建文件夹,重命名为"通用UI交互",新建触发"背包查看详情",添加事件,游戏经过零秒。在游戏中会有很多的道具点击事件发生,所以我们新建子触发器来编写道具被点击的触发。
子触发器只有执行完上一动作才会监听事件,而触发器会在游戏初始化后就开始监听事件。如果我们需要在一定情况发生后,才开始监听事件,那么子触发器就是很好的解决方法,同时它也可以节省计算机资源消耗。
- 初始状态只显示第一页日记、下一页按钮和退出按钮。
- 为每个翻页按钮添加子触发器。例如:点击"下一页1~2"按钮时,显示第二页日记及相应按钮,同时隐藏第一页和无关内容。
- 点击退出按钮时,隐藏"room1日记"界面。
还能有这种写法吗,是按顺序来么?
2.4.3 对道具进行注解
以铅笔为例,对道具的注解需要包含以下内容:
- 道具直观展示:添加铅笔图标,展示道具的外观。
- 注解内容 :例如"一支普通的铅笔,但它可以用来涂画",帮助玩家了解用途。另外考虑到在游戏中第一次出现这一操作,可以在注解中加入操作提示,试试拖动它。
- 操作提示:引导玩家尝试拖动铅笔。
UI制作过程:
- 新建画板"铅笔",添加背景图片,铺满屏幕。
- 添加铅笔背景框体,调整大小和位置。
- 添加铅笔图标及两个注解文本。
- 添加退出按钮,设置按钮鼠标左键点击事件。
- 在道具展示界面,添加铅笔图标展示铅笔事件
- 触发器编写
-
在UI界面初始化触发器中,隐藏铅笔界面(一开始设为不显示就行啊)。
-
在关闭道具展示框触发器中,为铅笔画板添加点击事件,显示铅笔界面。
-
同上一节一样,在"关闭道具展示框"中添加铅笔界面关闭触发。
-
2.5 剧情模块
一款好的游戏,其游戏节奏一定是易于控制的,而对于密室类的游戏而言,节奏的控制便是通过限制玩家推进剧情的进度来达到这一效果。密室逃脱限制剧情的进度有以下两种方法:
- 物品合成解锁剧情进度
- 设置解锁剧情的前提
2.5.1 物品合成解锁
玩家离开 Room1 的关键在于解锁出门密码,我们可以通过在门口绘制一个事件触发区域。主角通过铅笔在纸上涂抹,显示出了房间的密码。我们把这个过程抽象出来,就是玩家用笔和纸合成了密码。以下是具体的实现过程:
-
新建区域 :在room1门口绘制一个区域,命名为"门1"。
-
绘制UI :打开道具展示画布,任意位置新建道具展示框,因为后续会通过触发修改位置。背景图使用黑色,加入一个子图显示道具图。最后添加鼠标左键点击事件"道具纸-解"。
-
设置限制玩家离开room1的触发 :当玩家进入该区域时,打开该区域的碰撞,玩家单位无法通行。监听玩家离开区域,取消该区域的碰撞,让玩家单位可以通行并再次触发进入事件。
-
设置门1限制解除的触发:
- 新建一个帧计时器,判定铅笔是否涂抹到纸条,判定方法如下:
- 用四个比纸条更大的控件,组合为一个矩形,圈定一个比纸条所占范围更大的范围。
- 选取两个对角控件,然后分别选取这两个控件的X轴坐标之差和Y轴坐标之差,作为最终纸的判定范围。当笔在这个范围内时,就判定为笔在纸上了。
- 在铅笔画板上,新建两个空节点控件左和控件右,大小都是
100*100
,分别位于道具纸的左上角部分和右下角部分。
- 通过实时判定铅笔是否在范围内,显示解锁出的密码图片,位置直接覆盖原先纸条所处的道具栏位置,同时隐藏掉原先用来合成用的纸。
- 当玩家查看并关闭解密完的纸之后,关闭门1触发器,使之不再产生碰撞。
- 新建一个帧计时器,判定铅笔是否涂抹到纸条,判定方法如下:
最后,在关闭道具展示框触发器中,为其添加关闭动作。在UI界面初始化触发器中,设置该界面初始为隐藏状态。然后为了玩家可以反复查看日记密码,添加显示日记密码界面的子触发器。
2.5.2 设置解锁剧情的前提条件
回顾剧情:当玩家进入走廊后,Room3 无法打开,被告知需要密码。在 Room2 的书架上找到密码锁,输入从走廊获得的密码后才能打开 Room3 的房门,输入正确密码就是推进下一剧情的前提条件。
-
设置限制玩家离开room3的触发:
- 在 Room3 门口绘制事件区域,当玩家进入该区域时,打开该区域的碰撞。监听玩家离开后,取消该区域的碰撞。
- 在 Room3 门口绘制事件区域,当玩家进入该区域时,打开该区域的碰撞。监听玩家离开后,取消该区域的碰撞。
-
密码输入逻辑:
-
打开界面编辑器,找到出门密码 画板,为每个数字添加对应的UI点击事件
-
新建触发器,靠近room2书架,弹出密码输入界面。如果玩家输错密码触发密码重置事件,重置密码。
-
因为不知道玩家具体在什么时间会通关到这部分剧情,因此我们就设置为在游戏一开始就监听玩家的密码输入情况,即设置事件触发事件为游戏经过0秒
-
设置全局字符串变量"password"用于存储玩家输入的密码。每次点击数字按钮时,将数字拼接到"password"字符串中并显示在密码显示框。
-
-
校验密码:
- 新建触发器"Room2 密码校验",用帧计时器实时判定密码是否正确。
- 如果密码正确,等待一秒后删除 Room3 的障碍及区域门,并重置密码。等待一秒是为了给玩家查看自己输入密码的情况,否则帧计时器中,页面会马上关闭。
- 隐藏密码界面并显示解锁效果。
- 1秒后显示密室打开对话提示,2秒后关闭并震动镜头。
- 在走廊交互触发器里,设置门3打开才开打开大门的密码输入界面。
-
密码错误处理: 添加"退出按钮" UI 事件,用于密码重置。点击退出按钮后,将"password"变量重置为空字符串,隐藏密码界面。
2.6 对话UI
在密室逃脱游戏中,如果没有任何提示,玩家会搜索每一个角落,这是一种没有任何指向性的行动,大大削弱了玩家的沉浸感和代入感。因此,对话及剧情的提示,在密室游戏中起着举足轻重的作用。
在游戏中增加玩家的沉浸和代入感,一是可以靠大量的过场动画,让玩家在触发剧情时,通过类似电影形式去了解;另一种就是靠着文字叙述的方式,也就是剧情UI对话。需要注意的是,文字的设计不能太过直白,比如"我觉得那幅画有问题",这类提示就过于明显,反而会让玩家毫无探索体验。
2.6.1 对话UI设计
-
设计对话UI的框架
- 四周留白:整个对话UI框架,四周留白的位置大致要统一,这样观感比较舒服。
- 左对齐:由于阅读顺序是从左到右,所以通常的排版习惯进行左对齐。把头像放在左边,文字的左边是整齐的,只是右边会有参差,这样更美观。
- 测试 :确认好框架之后,使用最长的一段对话去进行排版测试,确定文字的边界。
-
确认对话交互方式为单击对话框
对话中隐藏者揭秘线索,但是每个人的阅读速度不同,且是单次触发界面,所以我们选择点击来推进游戏进度,让玩家自我掌控阅读和推进的节奏(点击对话框,才会弹出下一条)。
-
制作对话UI :为了让玩家更好的带入游戏角色,在游戏开始后提示玩家此时的游戏背景。
- 新建"对话"画布,添加灰色背景图,铺满整个界面,添加左键点击事件"初始对话1"。
- 添加初始对话背景图,作为对话框,插入文本,左侧插入人物头像。
- 为了让整个对话UI看起来更为美观,在对话框右侧添加一张图片
image_4
,避免留白过大;右下留白部分添加一个横条image_5
,占据空间并装饰对话UI - 为了提示玩家如何切换对话,在对话框底部新建文本框
ClickTips
,输入"点击左键继续"
2.6.2 触发编写
- 在玩家初始化中,开场动画之后,显示初始对话1的UI;
- 在room文件夹下的初始对话触发器中,当玩家点击初始对话1时,隐藏对话1界面,显示对话2界面。如果继续点击对话2,则隐藏对话2界面,显示道具栏。
其它的提示也是类似的操作,就不赘述了。
2.7 密室优化
什么是游戏优化呢?可以这么认为,凡是在不影响游戏正常游玩的前提下,可以提升玩家游戏体验的部分,都属于游戏优化。在密室逃脱中,其表现形式有三种:
2.7.1 行为反馈
在游戏中,当玩家获得道具时,在画面右上角增加提示反馈。
- 制作提示UI
- 编写触发。当玩家点击助手后,显示助手对话,显示道具栏4,表示玩家获得了道具。同时右上角获得画提示,2秒后关闭。
2.7.2 镜头应用
在独立互动模块中,在初始化的部分,我们就制作了一个开局转向的镜头。相对的,在最后游戏结束,我们也可以适当让镜头动起来,带来一种逃出困境,豁然开朗的感觉,下面我们就制作这个镜头。
- 新建镜头:在物编中,设置一个新的镜头视角,用于镜头的运动
- 触发编写
- 在打开大门1秒后,取消玩家1的镜头跟随,使之可以移动到其他视角
- 给玩家1应用新建的镜头,时长为4秒
2.7.3 动画提示(时间轴动画)
游戏中做了拖动铅笔涂抹纸条的设计,为了指向性更明确,我们可以在涂抹时播放铅笔涂抹动画。
- UI设计:在铅笔画布中,新建"移动位置提示"图标,位置放置于道具纸的左侧部分,各项参数如下:
- 添加时间轴动画:
- 点击界面顶部动画编辑,然后分别点击下图两个黄色的+,增加一个时间轴
- 第二个时间轴设为第10帧,图标位置在初始帧右侧
- 点击播放,查看效果
- 触发编写
- 在room1交互中,等待2秒的动作列表中,添加以0.5倍速播放这个时间轴动画,并循环
在room1解密中,加入停止播放时间轴动画的语句:
其它可以优化的点有:
- 点击画后获得物品的反馈
- 阅读密码后可以离开ROOM1的反馈
- 走廊获得日记碎片的反馈
- ROOM2点击桌上日记时的反馈
- ROOM3获得日记的反馈
- 实时将鼠标选中切换回玩家单位
三、坦克大战(关卡设计与制作)
参考《机甲风暴》
3.1 游戏设计
本章我们要制作是一款经典游戏------坦克大战,不过在原生游戏的基础上,加入了自己独特的小元素,它有个酷炫的名字------机甲风暴。
游戏机制 :坦克大战的基本玩法相信大多小伙伴都非常熟悉了,但本次机甲风暴设置为一个保卫基地的游戏。我方机甲的主要任务就是守护好基地,玩家机甲初始有3
格血,守护300秒或者击毁所有敌方机甲即可胜利;基地或我方机甲被摧毁则游戏失败。
操作设定 :玩家可通过W,A,S,D
按键操控我方机甲上下左右移动,点击鼠标左键 即可发射炮弹。炮弹可以攻击敌方机甲或者墙体,大墙被击中4
次则被摧毁,小墙则是2
次。
关卡设定:在游戏中设置了四种敌方机甲:普通机甲、加速机甲、血牛机甲、奖励机甲。击毁奖励机甲则会有两种奖励:1)回血奖励,恢复玩家1点生命值;2)暂停奖励,暂停8秒场上所有敌方机甲的行动。
根据关卡难度设置一定数量的敌方关卡机甲池,具体总数和配比可以调整。例如,游戏每3
秒从敌方机甲池中随机刷新1
个机甲,直到场上有5
个敌方机甲时,停止刷新。
3.2 场景制作
3.2.1 关卡设计
机甲风暴的地形制作与游戏的玩法和策划息息相关,比如机甲可攻击墙体,来打开行动道路;草丛可以作为掩体进行躲藏等等,所以在本次地制作过程中,对于单位和装饰物的摆放有着更精准更严苛的要求。
我们先来看一张地形草图,全图长宽比例为14×16,默认每个格子都是正方体,敌方出生点是地图上方的5个位置,给玩家开局留下一些反应时间。
射击游戏中,掩体是必不可少的机制之一。有了掩体,玩家就会有更多的操作空间和决策选择的机会,可以利用不同掩体间的错位来制定战略。在游戏开局时,可破坏墙体完整,游戏难度最低。但是随着可破坏物的减少,游戏的难度也会不断上升,这就需要玩家在游戏过程中,通过规划破坏墙体的优先级,选择合适的进攻策略。
同理,草丛和不可破坏墙体也起到掩体的作用,并赋予玩家一定的兜底能力 ,在关卡上起到类似安全屋的角色。为了完全符合关卡的设定,那我们如何在编辑器中准确地计算单位和装饰物的距离间隔呢?
3.2.2 墙体设计
- 黄色栅格 :打开任何一张地图,按下快捷键G,可以看到界面中出现了很多黄色线条组成的均匀栅格,其边长为800;
- 白色栅格 :再次按下快捷键G会发现多出了很多白色线条,将每个黄色栅格分成了一个个白色小格子,其边长为200
- 灰色格栅 :第三次按下快捷键G出现了灰色的线条,进一步的细分白色小格,其边长为50。
有了栅格的数据做参考,我们就可以按照关卡的策划来摆放单位了。已知黄色栅格的边长为800,假设墙体的边长为400,那么每个栅格中就可以摆放4个墙体。
- 小墙制作
为了使墙体可以被攻击破坏,我们使用建筑单位来创建墙体,设置碰撞范围为300
(碰撞范围一般是圆形,而墙体边长是400,所以要设置得比200得半径大一点)。除了死亡后销毁,其它勾选得选项都取消。单位属性中,设置生命值为2
,其它属性都设为0
。
经过摆放测试,模型缩放比例为1.7
,2
个合起来差不多是一个黄色栅格的边长,所以在物编中,设置墙体模型缩放1.7
倍。现在,只需要在对应格点上摆放墙体就可以了。因为所有边长和距离都是整数 ,所以直接编辑X和Y的数值就行。
- 大墙制作:将刚刚模型复制粘贴,命名为墙体2 ,设置单位血量为4,模型缩放为3.4,这样大墙就制作好了。
- 主基地 :新建生物单位,命名为主基地,血量设置为
5
,其它单位属性泉为0。勾选小地图显示。
3.2.3 装饰物组合
为了场景的美观,我们在游戏地形的场外还设计了用山石树木制造小点缀,其中山体的搭建只使用了一种装饰物模型。虽然只有一种,但却可以通过预设大小的改变以及旋转、移动、缩放的方式组合构建出庞大的山体。
除此之外,还可以使用不同的装饰物进行融合,营造不同的风格。比如关卡中的装饰物外墙,就是通过墙体和树枝进行搭配,营造一种墙体倍树木环绕的岁月感。
3.2.4 场景氛围
基地是游戏中的重要元素,我们可以为其搭配高亮的投射物,不仅起到提示的作用,还能塑造出科技感。下面的投射物原本是蓝色护盾的样子,通过缩放它的大小可以把原本的护盾缩成基地脚下的道标。
3.3 玩家操作设定
3.3.1 游戏初始化
首先新建机甲模型(生物单位)如下,血量设为3,缩放比例1.6 。新建一个我方机甲出生点。
进行一些初始化设定:
3.3.2 移动设定
我方机甲是玩家通过按下WASD按键来控制上下左右的移动,所以使用一个帧计时器,实时监测玩家的按键情况,然后实现两个部分:
-
监听玩家按键确定行进方向:当
W
键键按下,设置整数变量W=1
,angle=180
,表示我方机甲将要向上移动;其它类依此类推。
-
根据行进方向执行移动
- 如果
W+A+S+D=1
,表示玩家按下了一个按键,则让机甲向angle
方向移动300
即可(墙体碰撞范围是300); - 如果
W+A+S+D≠1
,表示没有按下或者同时按下多个按键,让正在移动的机甲停止即可。
- 如果
监听四个按键按下的情况:
根据按键按下情况执行对应动作:
3.3.3 射击设定
游戏中,设定玩家点击左键发射炮弹,技能CD为1秒。通过为我方机甲单位上添加自定义键值CD,来判定目前技能是否处于CD状态。
- 游戏初始化时,为我方机甲添加
CD
键值,值为1
。
- 玩家按下左键时,发射炮弹
- 创建炮弹发射函数
- 如果机甲存在CD标签则不做动作,此时不允许射击;
- 如果没有标签则添加标签,
1
秒后删除此标签,此时可以射击。 - 设计时,创建炮弹投射物
shellA
,创建炮弹魔法特效,播放炮弹声效。
这里预留了一个palyer参数,用于玩家2,也就是敌方机甲发射炮弹时进行调用
根据游戏设计,我们设置炮弹的运动为直线运动,会有两种碰撞情况:
最终的Z01
炮弹发射函数为:
3.4 关卡制作
3.4.1 敌方机甲生成(随机池刷怪)
绘制5个敌方机甲出生点,新建4种敌方机甲模型,阵营设为玩家2。不同机甲之间的血量、速度、模型和大小各不相同:
- 普通机甲:生命1,移动速度500
- 加速机甲:生命1,移动速度800
- 血牛机甲:生命2,移动速度500
- 奖励机甲:生命1,移动速度500
3.4.1.1 逻辑整理
设置四个整数变量 C1、C2、C3、C4 来表示普通机甲、加速机甲、血牛机甲、奖励机甲四种机甲的数量,可根据关卡难度自由调整。游戏中设置普通机甲为10个,其他机甲各为 5 个,总共 25 个敌方机甲的机甲池,具体生成逻辑如下:
- 设置 5 个敌方机甲的出生点,设置一个单位组
allGroup
存储全部 25 个敌方机甲单位 - 每隔 3 秒从
allGroup
中刷新一个机甲至出生点,并将其存储在countGroup
中,直至场上已有 5 个敌方机甲时,停止刷新。 - 从
allGroup
刷新一个敌方机甲到countGroup
中时,allGroup
的数量减 1,countGroup
的数量加 1。 如果countGroup
中的单位数量小于5
,并且allGroup
内的单位数量大于 0,则继续生成敌方机甲;否则,不做任何动作。
3.4.1.2 触发编写
- 游戏开始后,使用数组存储5个敌方机甲出生点,然后调用Z02函数,生成机甲。
- 自定义
Z02
函数,根据传入的数量生成机甲- 一次性创建所有25个敌方机甲,初始放在地图最边角,存入
allGroup
中 - 每隔三秒,如果
countGroup<5
且allGroup>0
,随机选择allGroup
中一个单位,将其坐标更新到5个敌方出生点中随机一个 allGroup=0
时,删除计时器
- 一次性创建所有25个敌方机甲,初始放在地图最边角,存入
3.4.2 敌方机甲运动
3.4.2.1 逻辑整理
敌方机甲由 AI 控制运动,其方向包括上下左右四个方向。具体实现步骤如下:
-
创建一个随机池
randomPool
,储存整数1,2,3,4
, 分别表示上下左右四个方向。 -
由于敌方机甲初始位置在地形顶端,所以设置权重为上 1、下 5、左 2、右 2。
-
用数组变量
rotateArray
存储四个方向的朝向角度,并设置机甲每次移动距离为distance =150
。
-
设置机甲连续移动方向的最大次数为
7
次,超过后随机转换方向,并将计数归零。即使用if语句,检测机甲是否可以移动(比如遇到障碍物)、连续移动次数是否小于7,否则转换方向。 -
由于初始权重为上 1、下 5,一段时间后敌方机甲会在屏幕下方扎堆。可以统计上下移动次数是否达到70次,如果满足条件,则调换两个的权重。
3.4.2.1 触发编写
- 初始化时生成机甲运动方向权重池,并为每个权重池数字分配角度
- 游戏每过0.1秒,遍历
countGroup
中的单位,如果存活,就调用函数Z03
进行移动,然后调用函数Z01
进行攻击;否则移除此单位。
移动时,只需要让敌方机甲从当前点向其朝向移动distance的距离,关键是使用两个自定义键值分别统计其连续移动次数,以及向上和向下的移动次数,到达指定次数进行重置。
3.4.3 敌方机甲攻击
在3.3中,设置了方机甲的攻击函数,可以让敌方机甲也调用这个函数。考虑到敌方机甲数量更多,设置其技能CD为2秒,只需要在敌方机甲生成时,为其全部都添加CD即可(Z01
函数根据机甲单位上的CD标签来判定是否可以射击):
3.4.4 奖励机制(添加暂停开关)
我方机甲击中奖励机甲,即会掉落随机奖励。奖励有两种:恢复玩家1点生命值,或是暂停场上所有机甲8秒。在地图初始化时,我们可以先设置两种奖励的奖励随机池rewardPool
,设置二者权重分别是3和2,可自行调整。
- 回血奖励:原理非常简单,就是对玩家单位进行治疗,使其重新获得一点生命值。判断我方机甲到奖励之间的距离,如果
distance≤300
,则对玩家进行治疗,生命值加1。 - 暂停奖励:
- 设置一个布尔变量
isStop
来控制暂停的开关。为真 时,暂停场上敌方机甲的AI行为;为假时,恢复场上敌方机甲的AI行为。 - 如果我方机甲与奖励的距离
distance≤300
,则设置isStop
为真;8秒后将其设置为假。
- 设置一个布尔变量
-
创建奖励模型:新建两个投射物,分别表示回血奖励和暂停奖励;以及表达两种氛围的音效
-
初始化时,创建奖励随机池
-
当奖励机甲死亡时,将随机池中的投射物创建出来
-
编写回血投射物触发
-
给敌方机甲AI行为添加一个开关
isStop
-
编写暂停奖励触发
3.5 游戏优化
3.5.1 血量显示
先在界面编辑器中新建血量显示画板,插入三个心形图片:
使用帧计时器,实时监测玩家血量,并根据血量展示心形图片,血量=0时,全部隐藏。
3.5.2 制作倒计时
3.5.3 胜负判定
- 倒计时为0说明守卫成功,游戏胜利,逻辑见上一节
- 任何敌方机甲死亡时判定一次,场内是否还有剩余的敌方机甲,所有敌方机甲死亡时戏胜利
- 玩家或基地死亡时,游戏失败
3.5.3 游戏说明
游戏开始时,先显示游戏介绍信息。玩家点击之后,才开始显示血量图标,并开始倒计时。
- 制作游戏简介UI,添加鼠标点击事件
- 简介被点击后,发送自定义事件
- 接收到此自定义事件之后,才开始倒计时和生成敌方机甲