文章目录
- 一、探索
- 1.1 ECA
- 1.1.1 ECA的定义
- 1.1.2 使用触发器实现瞬间移动效果
- 1.2 变量
- 1.2.1 什么是变量
- 1.2.2 使用变量存储碎片收集数量并展现
- 1.3 if语句(魔法效果挂接)
- 1.3.1 地形设置
- 1.3.2 编写能量灌注逻辑
- 1.3.3 编写能量灌注后,实现传送逻辑
- 二、战斗
- 2.1 循环
- 2.2 数组
- 2.3 计时器
- 2.4 单位组
- 三、升级
- 3.1 技能
- 3.1.1 地形设置
- 3.1.2 触发编写
- 3.2 界面编辑
- 3.2.1 界面编辑器设置
- 3.2.2 添加按钮事件
- 3.2.3 触发编写
- 3.3 运动器
- 四、优化
- 4.1 游戏声音设计
- 4.2 游戏镜头设计
- 4.2.1 镜头的基本参数
- 4.2.2 镜头时间轴动画
- 4.3 表格编辑器(实现对话UI)
- 4.3.1 一维表和多维表
- 4.3.2 数据验证、搜索、保存与撤销
- 4.3.3 Excel导入导出
- 4.3.4 使用表格编辑器实现对话UI
- 4.3.5 更多示例
- 4.4 函数库
- 五、项目:竞技场争霸赛
- 5.1 项目简介
- 5.2 地形设置
- 5.3 触发器设置
- 5.3.1 游戏初始化
- 5.3.2 战斗准备
- 5.3.3 战斗中
- 5.3.4 游戏结束
- Y3编辑器文档1:编辑器简介及菜单栏详解(文件、编辑、窗口、细节、调试)
- Y3编辑器文档2:场景编辑(地形编辑、物件放置)
- Y3编辑器文档3:物体编辑器
- Y3编辑器文档4:触发器1(对话、装备、特效、行为树、排行榜、不同步问题)
一、探索
参考《开发者学院:系统化教程》
1.1 ECA
1.1.1 ECA的定义
Y3编辑器中触发器可以实现游戏内的所有功能,触发器由三部分组成:
- 事件(Event):触发器的导火索,当设定的事件发生时触发器才会执行。
- 条件(Condition):触发执行必须满足的条件。
- 动作(Action):触发执行的结果。
当事件被激活,满足了条件后才会执行动作。例如短跑比赛中,信号枪响(事件),只有参赛者(条件)会开始跑步(动作)。
1.1.2 使用触发器实现瞬间移动效果
本视频中实现瞬间移动的步骤为:
-
地形设置:在地图上放置一个单位,在传送阵处绘制圆形区域。在希望角色被传送到的地方绘制一个点。点和区域在编辑器里是可见的,但在游戏中会处于隐藏状态。
-
触发编写:
-
新建事件(Ctrl+E):当任意单位进入圆形区域时触发,所以选择单位->任意单位区域事件。区域行为选择进入,区域选择刚刚绘制的圆形区域。
-
新建条件(Ctrl+D):只有神秘人进入才会触发动作。设置单位->单位类型-判断,触发选择单位类型->函数->获取单位类型,判断符选择等号,第二个字段选择自定义的神秘人。
-
新建动作(Ctrl+R):神秘人移动至点P1。
- 移动命令:选择单位->强制移动动作,选择单位->函数->获取事件中的单位,坐标选择刚刚创建的点。
- 发布停止命令:不设置的话单位瞬移后会立马跑回去。选择单位->发布命令->停止
- 相机跟随单位:为了增加玩家视觉体验,设置镜头->第三人称跟随单位。玩家选择玩家1,镜头焦点选择跟随事件中的单位。
-
1.2 变量
1.2.1 什么是变量
- 变量是可能随时变化的值,比如人的体重或年龄。
- 变量按照作用域分为局部变量和全局变量。局部变量只在单个触发器内有效,而全局变量可以在整个触发器中被调用。
- 变量不能重名
-
变量类型:变量在创建时,需要声明其类型,这包括:
- 布尔型:True或False。
- 整数型:整数,如12345。
- 浮点型:实数,如4.633,也可以存储整数。
- 字符串型:由数字、字母和符号组成的字符序列,用于存储游戏中的文字。
-
变量类型限制:
- 一旦定义了变量类型,该变量只能存储该类型的数据。
- 不同类型的变量不能直接进行数学运算或拼接。
1.2.2 使用变量存储碎片收集数量并展现
游戏中,探险者收集六个次元石块并修复传送阵,这需要通过设置一个整数变量来记录探险者收集的石块数量。具体实施步骤为:
-
地形设置:
- 打开物体编辑器,创建一个新的物品(石块),并设置模型和图标。
- 在表现页面,可以预先设置石块大小,提前调整
- 将在地图上放置六个石块,注意间隔。
-
触发编写:触发的核心,是需要设置一个整数变量去记录探险者收集的石块数量。
- 创建事件:创建一个新的触发器,设置事件为物品->单位获得事件。
- 创建动作:选择基础->变量-设置变量->全局变量(可重命名为
number
,类型选整数)来记录石块数量,初始值为0。 - 实现累加逻辑:每次探险者获得石块时,变量
number
增加1。所以设置第二个参数整数->整数间数学运算。第一个变量为number,运算符为+,第二个变量设为1,这样每获得一个石块,数量就累加1。 - 存储石块数:为了增加用户体验,创建一个字符串变量来存储和显示累计拾取的数量并展示。选择变量->设置变量->局部变量(字符串类型,可命名为
message
)。设置为字符串->字符串拼接。第一个字符串为“累计拾取数为:”,第二个为number。由于整型要转为字符串类型才能拼接,选择字符串->任意变量转为字符串,选择待转换的变量为整数->全局变量->number。 - 展示消息:选择界面->系统消息提示,选择向玩家1显示message信息,持续时间可自己调整。
1.3 if语句(魔法效果挂接)
魔法效果挂接参考《挂接流程》
if
流程语句的结构如下,条件可以是取反(not语句)、所有条件成立(and语句)、任意条件语句(or语句)或者所有条件不成立。
下面用if语句实现献祭能量后激活传送阵的效果。
1.3.1 地形设置
- 在物体编辑器中新建两个自定义装饰物(能量圈和传送门)和一个自定义单位(探险者)放置在地图上。
- 在能量圈和传送门的位置各绘制一个圆形区域,并分别重命名为能量圈区域和传送门区域。
- 在希望被传送到的位置绘制一个点,重命名为point。
- 新建能量获取魔法效果:选择魔法效果->创建->普通->右上角获得特效列表下选择一个蓝色护盾buff特效。选择左上 模型编辑器-模型,可以查看在不同单位模型效果。单机特效标签,弹出的窗口中还可以对效果进行旋转和缩放,以及选择挂接点。
1.3.2 编写能量灌注逻辑
需要新增一个全局变量infusion
来判断探险者是否进入能量泉进行了能量灌注,类型为布尔值。
- 创建事件:选择单位任意单位进入区域(魔法区域)。
- 创建注入动作:选择基础->设置变量,新建全局变量重命名为
infusion
,类型为布尔值,默认为False
。进一步设置变量infusion
为True
,表示单位进入能量泉后,能量注入成功,infusion
应为True
。
- 创建魔法效果动作:选择魔法效果->添加魔法效果。第一个参数魔法效果类型,选择刚刚自定义的获得能量护盾效果(蓝色护盾buff)。第二个参数单位选择探险者。
1.3.3 编写能量灌注后,实现传送逻辑
如果条件满足(探险者已能量灌注),则执行if b动作列表,将探险者瞬移到点point并发布停止命令。如果条件不满足,则执行else动作列表,提示传送失败。新建一个触发器:
- 创建事件:单位->任意单位进入区域
- 创建动作:基础->条件IF/THEN/ELSE,旁边的+号点击后选择基础->布尔值判断,判断条件为
infusion=True
。 - 创建Then语句:探险者瞬移到point,然后发布停止命令
- 创建Else语句:选择界面->系统消息提示,参数分别选择玩家1和“传送失败”。
二、战斗
2.1 循环
循环是指重复执行某项动作。在Y3编辑器中,循环有三种类型:
-
指定次数或指定整数变量重复执行:这是最常用的循环触发方式,例如,设定NPC敲门三次,动作会重复三次后自动停止。
-
条件成立,重复执行:在条件满足的情况下,进行无限次的循环,直到条件不再满足。例如,如果条件是门关着就敲门,那么敲门动作会一直重复,直到门开了才会停止。
-
遍历数组变量循环:根据数组的索引数字,对数组中的每个单位重复执行动作。例如,有一个不同门的列表,NPC会按照顺序敲门,直到所有门都被敲过。
- 地形设置
自定义创建黑袍男单位并重命名为boss
,自定义特效种子(投射物)重命名为Seed
。将boss单位放置在地图上,并以boss为中心绘制一个圆形区域,重命名为alert_area
。 - 触发编写
-
创建事件:选择单位->任意单位区域事件,设置参数为任意单位进入alert area(任意单位包括boos啊,得指定玩家才行,非boss都不行)。
-
创建动作:
- 创建一个变量循环,
Seed number
变量类型为整数,从1到6做动作表示循环六次,创建六个种子。变量Seed number
存储当前循环的整数数字。 - 创建一个角度变量
angle
,使用函数->数学运算->角度运算,选择已创建的整数变量Seed number,乘以60,得到从60度到360度的六个平均分布的方向,确保投射物出现在boss周围。
- 创建一个变量循环,
-
创建一个点变量
loc
(点类型),用来记录种子出现的点。选择函数->路径-点向方向偏移,初始点为boss所在点,方向为变量angle
,偏移距离设置为300
。 -
添加动作为boss创建种子。选择投射物,创建投射物seed,位置为变量loc,可选参数中选择持续时间为5秒。
-
2.2 数组
数组是相同数据类型的集合,数组中的每个元素都在其基本值上添加了一个索引,使我们在数组中更容易找到和访问它们。整数、单位、实体、单位名字、物品实体等变量都可以设置为数组。
下面使用数组实现六个黑暗守卫一起进攻的游戏效果。地形上我们复用上一节的地形。触发编写为:
- 创建事件:键盘按键H按下(硬件输入->键盘-按下->H)。
- 创建动作:
- 设置一个局部变量
guards
,类型为单位类型(不是单位),这里要勾选数组。分别设置1~6对应我们需要的六个黑暗守卫单位(类似语句可以直接复制粘贴,还是太不优雅了)。 - 利用上节课学习到的循环,创建一个变量循环
numGuard
,从1~6循环。 - 我们同样需要创建变量
angleGuard
和locGuard
,来存储黑暗守卫出现的方向和位置。 - 添加动作为boss在
locGuard
创建guards
,数组变量guards
的索引为变量numGuard
。
- 设置一个局部变量
2.3 计时器
计时器就好比一个沙漏,在计时结束后开始执行某项动作。我们可以用计时器来处理和时间有关的游戏逻辑。在编辑器中,计时器一共有三种:
- 运行单次计时器:计时器运行一次后开始执行动作。例如,倒数三秒后约翰的门就会打开。
- 运行循环计时器:计时器循环运行,每次运行后都会执行动作。例如,每隔一秒约翰的门就会打开一次。
- 运行固定次数的计时器:计时器中间停留固定时间,固定次数的计时器。例如,每隔一秒约翰的门就会打开一次,一共打开三次。
本节使用计时器实现一只只次元入侵者从裂缝中爬出来的效果。
- 地形设置
- 在地图上绘制一个点(区域->点),重命名为“裂缝”。
- 打开物体编辑器->生物,自定义次元入侵者。头顶无显示,血条样式无血条,取消勾选是否有技能资源条,取消勾选是否在小地图显示,修改攻击范围为10。
- 触发编写
- 创建事件:键盘按键J按下事件。
- 创建动作:
- 选择循环计时器,每两秒循环一次。通过设置语句中的布尔值参数,我们可以选择“立即执行”或者选择“等待两秒后再执行第一次动作”。我们在这里选择true,即立即执行。
- 动作列表中,创建你想要生成的单位,在刚才绘制的点“裂缝”处创建,面向角度跟boss一样。
2.4 单位组
单位组是由一个或多个单位组成的集合,单位组里面的所有元素的类型都是单位。单位组也可以是一组不同类型的单位组成的集合。合理利用单位组,我们可以在游戏制作中节省大量的时间。在单位组中,我们能同时对所有的单位发布命令。
下面使用单位组实现主人公发送特技“次元入侵”,入侵者瞬间死伤殆尽的效果。
- 地形设置:在地图上放置一些自定义的次元入侵者和一名次元统领,设置他们的单位所属为中立-敌对,再将我们的主角探险者放置在地图上。
- 触发编写:
- 创建事件:硬件输入键盘按键按下,选择按下K键。
- 创建动作:
- 设定一个局部变量,变量名
invaders_Group
,类型为单位组,我们将次元入侵者设为单位组中的指定单位类型(函数->单位组->指定类型的单位->次元入侵者)。 - 选择单位组
invaders_Group
,遍历其中的单位,在动作列表中添加单位->杀死单位。第一个参数选择“获取单位组中遍历到的单位”,凶手为“探险者”。现在单位组invaders_Group
中的所有单位将被一起杀死。
- 设定一个局部变量,变量名
三、升级
3.1 技能
技能的释放简单来说,有三个关键点:
- 施法开始:在施法开始节点后会播放单位的施法动作,比如魔法师抬起魔杖
- 施法引导:施法过程的开始,例如魔法师开始念咒语
- 施法结束:咒语念完的时间点,在这个关键点之后,部分人物会有结束动作。
下面实现探险者在选中位置召唤一个巨雷,对区域内所有敌人造成伤害的效果
3.1.1 地形设置
-
在地图上放置中立-敌对的野怪单位,以及主角探险者。
-
新建自定义技能,并为其命名和添加说明“探险者在选中位置召唤一个巨雷,对区域内所有敌人造成伤害。”。在右侧固定属性基础中保留是否转身,勾选超出范围、立即释放,其他全部取消。选择圆形指示器,设置技能范围为300。
-
新建自定义的雷电投射物,作为技能的施法效果(新建投射物->表现页签->右侧属性栏-特效配置选择闪电特效)。
-
在物编器中给探险者添加雷电技能作为其通用技能。
3.1.2 触发编写
此技能有两个阶段:
- 施法开始到施法引导阶段:播放施放技能的动作
- 施法引导到施法结束阶段:创建施法效果的投射物表示产生技能效果,识别技能范围内的所有单位,对其中的敌对单位造成群体伤害并显示伤害数据。
在工具栏-技能中,也可以编辑触发器,它会编写技能触发的具体过程。整个逻辑实现过程为:
- 技能物编器中新建触发器,重命名为
stage1
:- 创建施法开始事件:选择技能->施法开始
- 创建施法动画播放动作:单位->动画->播放动画,参数“单位”选择“函数->技能拥有者”,参数“播放动画字符串”选择“值->attack1”(单位内置动画名称),参数“速率”设为1,即正常播放速度。从0秒播放到-1秒(表示动画播放到最后)。
- 技能物编器中新建触发器,重命名为
stage2
:- 创建施法引导事件:选择技能->施法引导
- 创建动作1——投射物动作(施法):选择投射物->投射物-在点创建,参数“投射物类型”选择刚刚自定义技能“雷电”,参数“点”选择“函数->技能(当前技能)获取到点”,参数“所属”选技能拥有者。在可选参数中选择持续时间为3秒。
- 创建动作2:——筛选单位组:新建动作,设置单位组->函数->筛选范围内所有单位,以技能选取点为圆心半径300内的所有单位做动作。
- 创建动作3——对敌人造成技能伤害:新建if条件动作->如果所有条件成立
- 创建if条件: 在if条件中选择单位->是敌对关系,两个参数分别选择“获取单位组中遍历到的单位”和“技能拥有者”。
- 创建Then动作:选择单位->造成伤害。对遍历单元组中的单位造成500点法术伤害,伤害所属设置为技能拥有者,所属当前技能。
- else代表同盟或者友方单位,不需要做任何动作。
技能默认消耗MP,而生物和建筑单位默认是没有MP的,装备了主动技也使用不了。
3.2 界面编辑
界面编辑器是对软件的人机交互操作逻辑和界面美观进行的整体编辑,我们通常会用到图像、文字、按钮等组件,在界面上与操作者进行互动,从而丰富和增强用户的体验。Y3编辑器中UI编辑器的操作界面主要由五个部分组成:
- 画板区:在开始做一个界面之前,必须先创建一个画板。
- 控件区:用于展示每个画板里面的各个控件。
- 节点区:展示所有可使用的UI组件,包括按钮、图片、模型、文本输入框、进度条、滑动条列表等。
- 画布区域:在画布中编辑摆放组件,并查看组件属性。
- 事件区域:用于编辑组件的具体参数,包括大小、位置、外观、动画等。
在控件区,所有组件都以树结构来陈列,包含了一组节点,节点之间相互关联,并且具有父节点和子节点关系(节点的任何附属节点都称为子节点)。删除一个节点,其所有子节点也会被一起删除。
UI本身只有显示作用,我们一般会配合触发编辑器,去实现一些想要的功能。接下来,我们实现以下界面UI:
3.2.1 界面编辑器设置
首先在地图上放置一个用于选择的单——探险者,在法师周围绘制一个圆形区域,命名为select _area
,,表示进入这个区域会触发宝物选择界面。
-
创建空白画布:打开界面编辑器,单击
+
创建一个新的画板,并重命名为select_treasure
。缩放画布大小为33%。 -
创建选择框底板:拖动顶部图片按钮到画布中央,在资源库中选择喜欢的图片(弹窗->公告栏)。拖动图片锚点放大图片,或者通过x轴y轴坐标进行放大。
-
设置界面标题:拖动顶部文本按钮到底板上,调整位置和大小,输入“请选择一个你喜欢的宝物”作为选择框的标题,并明明为
title
。设置文本的字体颜色和对齐方式,让它们看上去更美观一些。
-
设置玩家选项1:拖动一张图片(控件图)到画布上,根据喜好调整位置、尺寸和背景图片,命名为
button1
。将另外一个图片拖动至button1
内,作为奖励的展示图标(icon1
),选择文本并将其拖至button1
内,作为奖励的名字(name
),输入“魔法戒指”并调整字体颜色和位置。 -
调整父子级关系:以图片为父节点,将
title,button1
拖动到图片下,作为相互平行的子节点。将icon,name
拖动到button1
下,作为其子节点。这样icon,name,button1
就可以作为一个整体被选择。 -
设置玩家选项2:复制并粘贴一个新的选项,重命名为
button2
,调整级别和位置,更改图像和文本,完成第二个按钮。
3.2.2 添加按钮事件
界面组件设置完毕后,我们为按钮添加事件。选中button1
,右上角点击事件,点击+
添加事件,并命名为choose_ring
。点击“空事件->事件设置-点击”。同样的方式为button2
选择点击事件并命名为choose cloak
。
在事件板块,点击音效可以选择事件的音效,点击界面上方的动画编辑,可通过时间轴管理为事件制作帧动画。时间轴和动作设置板块中的动画效果互相排斥,如果在动作设置板块中选择了一个动画效果,则时间轴不生效。
由于整个画板在事件触发前是不可见的,所以选中整个画板select_treasure
,选择属性,将是否可见取消勾选。,这样我们绘制的整个界面组件,在触发调用前是不可见的。
3.2.3 触发编写
整个触发分三部分:
- 当选择单位进入到对应的区域后,会出现选择框
- 选择按钮A,左侧信息栏提示A内容
- 选择按钮B,左侧信息栏提示B内容
下面是具体的编写逻辑:
- 触发器-进入区域:
- 在物编器的触发器页签下创建任意单位进入
select _area
区域事件,将此事件命名为“进入区域”。 - 新建条件->单位类型判断,获取事件中单位的单位类型等于探险者。
- 新建动作->界面->显示/隐藏控件,对玩家1显示控件。
- 在物编器的触发器页签下创建任意单位进入
- 触发器-选择戒指:
- 创建事件:界面->控件事件,参数UI事件选择
choose ring
。 - 创建动作选择界面->显示/隐藏控件来向玩家1显示控件
select_treasure
。 - 创建动作选择界面->系统消息提示,来向玩家提示“你选择了魔法戒指”,持续时间设为5秒。
- 创建事件:界面->控件事件,参数UI事件选择
- 触发器-选择斗篷
直接复制上一条触发器重命名为选择斗篷,UI事件改为choose cloak
,第二条动作命令信息显示内容修改为“你选择了魔法斗篷”。
3.3 运动器
运动器可以为单位或者特效等添加运动效果,比如沿着直线运动或追踪某一个单位等,是制作技能、特效等场景中十分常用的功能。
在Y3编辑器中,运动器分为追踪运动器、曲线运动器、直线运动器、环绕运动器(对单位)、环绕运动器(对点)。今天就以环绕运动器(对单位)为例,给大家做一个演示,实现电球的环绕和爆炸效果。
- 触发组件设置
- 在物编器中创建一个自定义投射物
"Electric ball"
(球形蓝色电流攻击)作为环绕的球体,设置缩放0.4倍大小,勾选循环播放,让特效一直播放。 - 设置自定义投射物
"Explosion"
(蓝色电流冲击波,0.3倍缩放)作为结束时的爆炸效果。 - 在主界面地图上放置一个英雄单位作为主角
- 在物编器中创建一个自定义投射物
- 触发逻辑
- 新建事件:硬件输入->键盘按下
A
。 - 新建电球投射物:创建一个投射物变量
"Electric ball"
,投射物类型选择预设的投射物"Electric ball"
,选择在点创建,创建的位置点,选择探险者所在的点。 - 新建运动器:选择运动器->环绕运动器对单位,两个参数分别设为变量
"Electric ball"
和探险者,环绕半径为200
,角速度为100
。在可选参数中,添加环绕时间5s
和环绕高度100
。 - 新建投射物爆破动作:在运动完成动作列表下添加动作,在探险者所在的点创建投射物
"Explosion"
,持续时间1s
。 - 优化游戏内存:销毁投射物
"Electric ball"
并移除运动器(为单位移除运动器,单位选择探险者)。
- 新建事件:硬件输入->键盘按下
四、优化
4.1 游戏声音设计
声音不仅是玩家接收游戏信息的重要途径,也是游戏开发者传递情感和增强游戏体验的关键工具。游戏中的声音主要分为功能性音乐和背景音乐两大类:
- 功能性音乐:
- 游戏信息提示:为玩家提供画面外的游戏信息提示和预警,例如交互物品的存在、环境变化和潜在威胁。
- 玩家操作反馈:通过声音反馈玩家操作,增强游戏互动性,使玩家获得及时且全面的反馈。
- 背景音乐:
- 环境渲染:通过声音对游戏场景进行多感官渲染,增强玩家的沉浸感。
- 情绪渲染:利用声音表达复杂的情绪,如战斗的激烈、对未知的恐惧和紧迫感。
在物体编辑器中可以进入音效模块,设置音效属性:
- 淡入::设置声音开始时由无声过渡到有声所经历的时间。
- 淡出::设置声音结束时由有声过渡到无声所经历的时间。
- 调整至
3D
声音模式,我们可以设置声音的衰减距离和静音距离。
点击“+”
可以为一个音乐场景添加多个声音,不仅可以调节各个声音的音量,还可以调整各个声音的播放概率,从而使游戏中的音乐变得多样化。还可以为音效添加新的自定义属性并设置其名称、类型、值,后续通过触发器调用。
在物编器-单位-单位固定属性中,我们可以为单位绑定声音事件,比如选择当角色升级时播放升级音效。
4.2 游戏镜头设计
4.2.1 镜头的基本参数
打开工具栏->放置物件->镜头,可以看到编辑器自带得默认镜头Initial Camera
,此镜头的视角为进入游戏之后的默认视角,无法删除,无法重命名。用户可以在场景中的任意位置,点击“以当前视角设置镜头属性”来为当前视角创建镜头。用户创建的镜头可以重命名、删除。
参数 | 说明 |
---|---|
焦点位置及镜头的指向点 | 焦点位置指的是镜头所注视的目标点,它由三维坐标(X、Y、Z)确定。镜头的指向是通过这些坐标来设定的,表示镜头当前所看的位置。 |
俯仰角 | 镜头与水平线的夹角,平视为零度,仰视为负数,俯视为正数。 |
导航角 | 镜头在地平面上的方向,通常从参考方向(如正北)开始测量,镜头面向正东时导航角为90度。 |
滚转角 | 镜头自身的旋转角度,类似于歪头时视角的变化。 |
距离 | 镜头与焦点之间的三维空间距离。 |
观察区域(FOV) | 镜头视野所能覆盖的范围,决定镜头显示细节的区域。 |
远景裁剪 | 镜头显示参数,超出距离范围的物体不进行渲染(不显示)。 |
实时观察镜头属性改变 | 勾选后可实时预览镜头的视角变化。 |
与焦点的最大/最小距离 | 游戏中,玩家可通过鼠标滚轮控制镜头与焦点的距离,设置此参数可进行限制。 例如,当二者设为一样时,玩家视角将被限定,无法使用鼠标滚轮调整距离。 |
4.2.2 镜头时间轴动画
使用镜头时间轴动画和使用触发器都可以实现镜头动画,二者在最终的画面表现上没有区别,但却各有优势:
- 镜头时间轴动画:可以在时间轴内,通过设置关键帧的形式,方便快速地制作镜头动画。但每条时间轴镜头动画不能复制,无法复用。
- 触发器:触发器编写的自定义程度高,语句还可以复制粘贴,具有很强的复用性和扩展性。(相关定义详见触发器-镜头API)
点击新建的“镜头时间轴动画1”右侧的编辑按钮,即使用当前画面视角为初始帧,创建时间轴动画。每条时间轴动画由两个部分组成,分别是 时间轴和 当前关键帧下镜头的属性面板。
我们可以在时间轴上拖动进度条,或是在frame窗口中输入具体帧数,来选择关键帧位置。Y3编辑器使用的刷新率为30帧每秒,所以如果设置关键帧在第60帧,就是在第两秒。点击上方的创建按钮,即可在所处位置为所选参数新建关键帧。
关键帧分为绝对值(当前关键帧下镜头的具体参数)和相对值(相对于初始帧所改变的取值)。当指针选定一个关键帧时,点击鼠标右键,即可对关键帧进行复制、粘贴、删除(按下delete按键也行)等操作。编辑并保存关键帧之后,在触发器中可以编写镜头触发事件:
4.3 表格编辑器(实现对话UI)
4.3.1 一维表和多维表
在故事中,我们通过对话UI向玩家传达了剧情的重要信息。不同的对话内容需要多个UI来呈现吗?其实不用,在Y3编辑器中,我们可以结合表格编辑器、界面编辑器和触发来实现这个效果。
表格编辑器是Y3编辑器提供的数据管理工具,我们可以在表格编辑器中以表格的形式保存数据,并之后通过触发来快速调用这些数据,比如怪物的物品掉率,刷怪时怪物种类和数量。
在表格编辑器中有两种表格:一维表和多维表。一维表中,每一行都是一条独立的数据,包含键名、类型、值和备注。通过键名,也就是索引,我们就能快速获取到对应的值。
一维表适合定义零散的各种数据,比如游戏初始化时的一些规则和参数。假设你的《练功房》项目中一共会有六个房间,你想分配其中有两个房间产出经验,有两个房间产出金币,并且希望在游戏中时间12时开始刷新怪物,14时之后就停止刷新怪物。由于这些数值关系到项目中设定的经济产出,如果你希望快速地调整这些数值,可以将这些数值保存在一维表格中:
假设你正在制作一个《塔防》项目,在第1波次,一共有30只恶魔进攻玩家,玩家需要在60秒内把他们消灭。这里波次有“顺序”、“怪物数量”、“怪物类型”、”消灭时间”四个关键属性,可以使用多维表格管理数据。多维表中,每条数据包含多个属性及其数值,我们需要两个索引才能锁定数据位置。
多维表适合定义一个数据对象,表格中的第一行是这个数据对象的属性名称(
key
),第二行是这个属性的数据类型,第三行及之后的行则是对应的值。如果数据类型选错了,那么你可能没有办法在触发器中正确的拿到你想要的数据。
4.3.2 数据验证、搜索、保存与撤销
- 多维表可灵活添加行和列,一维表固定只有三列,不能新增列。
- 不允许出现相同的主索引值,且主索引只能是整型或字符串类型
- 数据验证:标红的单元格意味着该数据无法在局内读取到。若是在你配置过程中出现,可能只是因为你的表格还没有编辑完成而系统提前在验证。数据配置后,仍有单元格标红,可把鼠标悬浮在红框上查看具体原因,如关键数据的缺失或不匹配或重复,再予以修复。
- 重命名:右键点击一张表或选中后按
F2
可进行重命名 - 表格归类:点击文件夹图标按钮或
Ctrl+G
可创建文件夹,归类表格。 - 保存与撤销:保存按钮是保存整个工程,而撤销按钮只针对你在表格编辑器内的操作。
4.3.3 Excel导入导出
表格编辑器并不支持如office中公式、填充柄、甚至VBA等一些高级功能的应用。如果要进行高效开发,推荐先使用Excel进行快速编辑,再导入编辑器。表格编辑器用于快速验证调试游戏体验。
点击导入,你可以选择一个表格文件将其导入至编辑器中,当前支持的表格格式有”.xlsx”,”.xlsm”,”.xls”,”.csv”
共四种。
- 一维表导入:所有以
“kv_”
开头的sheet将读取为一维表- 标题行:第一行为标题行,限定内容为
“Key,Type,Value,Des"
,大小写允许模糊。 - 数据行:第二行往后为数据行
- 标题行:第一行为标题行,限定内容为
- 多维表导入:所有
"config_"
作为前缀的sheet表格将读取为多维表- 第一行为注释行,不读取
- 第二行为数据名,读取后视为列名
- 第三行为数据格式,支持
int,string,float,bool
四个类型,支持大小写模糊 - 第四行为主键标识,格式需要是整型或者字符串类型,以
key1,key2,key3
进行枚举,支持大小写模糊。最多支持三键表,需有key1,才能有key2,需有key2,才能有key3,否则报错,导入错误。如果没有key,则生成一个”key1“列作为主键,以行号填写值。 - 第五行之后为表格的数据,涉及到的公式等特殊格式以结果的值进行读取。
4.3.4 使用表格编辑器实现对话UI
在表格编辑器内定义的表格,在游戏初始化时将会保存在内存中,供你在任意的触发器中调用:
下面我们就来看一看表格编辑器的具体使用方法。
-
绘制UI:绘制一个界面来承载和展示对话内容
- 打开界面编辑器添加一个新面板,并将其重命名为
dialogue
。这个界面应包含两个图片,一个作为content
(对话内容)背景,一个作为real name
(角色)的背景,以及两个分别用于承载real name
和content
文本框。 - 拖动调整这些控件的大小和位置,在文本设置中设置文本的字体样式,调整空间的父子级关系。选择整个面板并取消勾选是否可见,表示直到它被触发才显示对话界面。
- 打开界面编辑器添加一个新面板,并将其重命名为
-
创建多维表:创建多维表并将其重命名为
scripts
。在scripts
中将主索引key
修改为order
(存储对话顺序,整型)。添加两个类型为字符串的属性role name
和content
分别存储角色名称和对话内容。 -
触发编写
- 新建事件:硬件输入-键盘空格键按下事件
- 新建动作设置对话顺序:设置一个全局整数变量
order
,来记录空格键被按下的次数,初始值为零。使用函数->整数间运算,设置变量order
为order+1
,这样当我们第一次按下空格键时,order
都加1
。 - 新建动作显示角色名称:选择界面->设置文本,对玩家一设置
dialogue
面板下的real name
文本,字符串参数选择函数,然后选择第二个多维表中的字符串值。
现在当我们第一次按下空格键时,
order=1
,主索引为1
的role name
数据将读取显示。当我们再次按下空格键时,order=2
,主索引为2
的role name
的数据将被读取显示。 - 新建动作显示角色对话文本:操作同上
4.3.5 更多示例
一维表用例:配置了如下的一维表,命名为globalConfig
。
可直接通过Type类型对应的参数类型,在获取到Key对应的Value值。
多维表用例:配置了如下的多维表,命名为Example。
最基础的使用方式为直接获取表格中的值,如我当前需要获得id为1的数据中的use_money
字段数据,将其存入变量a中。可以采用这样的方式:
常用方式是遍历表格,实现一些逻辑:
4.4 函数库
在2.3章节中,我们使用循环计时器连续生成次元入侵者。那如果需要在多个区域,在不同的时间点生成敌人,是否需要写多个触发器重复设置效果呢?当然不是,Y3编辑器为我们提供了一种更简单的方法来重复实现简单的功能,即函数库。
函数库允许我们将常用的触发器语句转换成可重复使用的函数,类似于编程中的函数或者方法,可以提高工作效率。函数库由以下部分组成:
- 函数描述:定义函数在动作列表中的显示方式,包括自定义名称、描述(触发器语句的内容和格式)和提示。
- 参数:定义了该函数的输入数据,连接函数库和触发器,可设置参数类型。
- 返回值:定义了函数执行后返回的结果(输出数据)。你可以点击 "+"来设置返回值的名称和类型,以方便触发器的后续调用。
- 动作:函数执行的动作列表,显示了函数的具体行动逻辑。
现在我们想要实现的效果是,在三个指定的地点间隔0.3秒,生成一个指定类型的野怪,总共生成五个。我们可以使用函数库简化具体的编写过程。
-
触发组件:我们需要在地形上放置敌对单位、boss和探险者。
- 在boss周围绘制三个点区域,分别命名为point A、Point B、Point C。
- 以boss为中心绘制一个圆形区域alert area,作为boss的警戒范围
- 自定义三个不同的小怪,他们会在三个点生成。
-
自定义函数库函数
- 在函数库中新建函数,命名为“野怪刷新”,参数为
Monster
(小怪,单位类型)和Point
(刷新点) - 点击左边的可用参数,使用刚刚创建的参数组成函数描述:“在参数Point处创建参数Monster”。
- 新建一个技数计时器,设定每隔0.3秒运行一次,共运行五次,选择“立即执行”
- 在动作列表中选择创建单位,单位类型是参数Monster,点是函数参数Point,为单位boss创建,方向是单位boss的方向。
- 添加一个动作来向怪物发出命令,选择“单位发布命令”,设置命令为“攻击移动”。
- 在函数库中新建函数,命名为“野怪刷新”,参数为
-
触发编写:调用函数库,通过设置不同的参数和计时器来在不同时间和地点生成敌人。
- 新建“任意单位进入区域事件”
- 在单玩家位进入BOSO警戒区域两秒、三秒、四秒后,分别使用“野怪刷新”函数,在三个点刷新小怪。
五、项目:竞技场争霸赛
5.1 项目简介
游戏的制作一般分为三大类:
- 设计:包括游戏的核心玩法和故事背景。
- 美术:负责游戏的原画,角色、物体和场景的三维建模。
- 程序设计:通过代码实现游戏玩法。
本项目“竞技场争霸赛”是一款射击类小游戏,一个人就足以完成开发。核心玩法是玩家控制挑战者挑战怪物,通过移动和射击来躲避怪物攻击和击败怪物。每隔几秒钟怪物就会热身蓄力,然后冲锋,玩家必须使用鼠标右键移动进行躲避,然后使用鼠标左键精瞄准射击,击败怪物,所以游戏两大核心机制是移到和射击:
另外游戏将从游戏印象和游戏沉浸两个角度进行设计。由于挑战者在攻击时不能移动,所以玩家在何时躲避危险和何时瞄准目标之间保持平衡是很重要的,这带来了挑战和乐趣。在游戏沉浸方面,我们可以通过动画、镜头、角度、滤镜等去创造过程,带来令人印象深刻的游戏体验,玩家将在游戏开始时更加兴奋,在游戏结束时更感到印象深刻。
时间有限,下面只展示必要步骤。
5.2 地形设置
- 新建空白工程,选择小型地图(64×64)和自定义UI模板。
- 创建生物单位(挑战者、boss、观众)和抛射物(探险者的子弹)。
-
挑战者模型选择仙人掌人,血条样式为绿色血条,显示模式为不满血显示,取消勾选死亡后销毁单位,取消勾选无法反击时逃跑。最大血量设为30,生命恢复设为0。
-
复制挑战者模板,BOSS模型选择图示小怪物,血条显示红色,单位状态里设置禁止普攻,
-
观众选择图示小怪物,无血条显示,单位状态选择无效
-
抛射物选择绿色法阵符文特效,缩放0.6
-
- 绘制陆地碰撞
- 为挑战者、BOSS和观众设置出生点
- 设置挑战者和BOSS的战斗准备圈
- 放置一个几乎覆盖整个竞技场的战斗圈,作为boss的攻击区域
5.3 触发器设置
在“竞技场争霸赛”这款游戏中,我们将游戏分为以下四个阶段:
- 游戏初始化:镜头跟随玩家,设置变量为游戏角色伤害初始值。
- 战斗准备:挑战者和boss的嘲讽动作,摄像机跟随。
- 战斗中:实现鼠标操作(右键移动、左键射击),boss的AI逻辑(蓄力和冲锋)。
- 战斗结束:根据胜者播放不同的动画和滤镜效果,结束游戏。
5.3.1 游戏初始化
- 刷出挑战者,并设置镜头,让玩家以第三人称视角跟随他。
- 设置一个2s的计时器,给玩家一点缓冲时间,让他们意识到游戏即将开始。
- 向挑战者发布命令,移动到挑战者准备区
- 为了提高游戏的沉浸感,邀请观众参加战斗。
-
点击基础->收纳盒,设置一个存储框,设置一个观众点数组存储所有观众点,设置完后折叠起来,使界面更简洁。
-
设置一个循环来生成观众,并让他们的方向朝着战场中心。最后将每个观众都添加到观众单位组中,这样游戏结束时,我们就可轻易命令单位组成员,播放庆祝或挫折动画了。
-
5.3.2 战斗准备
当挑战者进入准备圈时,我们需要做三件事:
- 移除挑战者的准备圈,防止重复挑战者准备逻辑
- 挑战者停止下来,播放嘲讽动画作为准备战斗的信号
- boss进入战斗区域,并使用镜头跟随它
当BOSS进入它的准备圈时,也有三个工作:
- 移除boss的准备圈
- 播放boss嘲讽动画将比赛气氛推向高潮
- 等待2s后战斗开始,让镜头恢复正常,并允许玩家控制角色。
最后创建一个全局布尔变量battleongoing
,默认值为false,现在为true,表示正在战斗中。
5.3.3 战斗中
为了在游戏中实现鼠标操作,我们设置了右键移动,左键射击。移动机制为,当玩家按下鼠标右键,并且布尔变量battleongoing
为真时,让角色移动到鼠标位置。
攻击机制:
- 当玩家按下鼠标左键且
battleongoing
为真时,创建一个局部变量为鼠标的游戏坐标,point
为当前玩家坐标 - 命令挑战者停止(防止可以边移动边攻击),将方向设置为从
point
朝向clickedPoint
的方向,播放攻击动画 - 完成开枪逻辑:
- 在
point
处创建投射物(设为变量方便移除),添加运动器来设置子弹的直线运动轨迹和造成的伤害 - 在移动完成后将运动器和抛射物移除
- 创建碰撞运动器实现子弹的射击伤害,并跳字显示
- 在
boss的AI逻辑有两个部分:蓄力和冲锋。
- 每三秒,如果
battleongoing
为真,怪物将停止移动并播放循环蓄力动画idle2 - 2秒钟后怪物会播放一个循环冲锋动画,并为自己创造一个线性的移动器,达到高速移动的效果。BOSS移动位置为战斗区中随机位置。
- 使用碰撞移动器让BOSS冲锋时对碰撞的敌方单位造成真实伤害
5.3.4 游戏结束
当任何单位死亡时,战斗结束。我们需要停止玩家的控制权限,播放结束过场动画,并结束游戏。
- 创建一个触发器,触发事件为任意单位死亡
- 设置
battleongoing
为False - 将摄像机对准胜者,如果是挑战者,这意味着玩家赢了,让我们为挑战者和所有观众播放赢家动画。设置一个闪闪发光的滤镜效果,使这个庆祝时刻更愉快,并以胜利结束游戏。
- 如果胜者是boss,播放输家动画,设置对应的滤镜。