进入官网
教学视频

学习点命令,让式神移动

学习连续点命令

学习创建中立单位,制作敌人

学习建造防御塔抵御敌人御敌

学习使用刷兵、连续点命令

学习用循环来创建单位,在场景中洒满“豆子”

学习让单位实现“吃豆子”并获得钱的效果

学习给玩家、单位增加属性

学习让敌方死亡后扣分,并在一段时间后复活

学习显示计分板,并在计分板刷新对应的数据

学习制作抽卡功能-数组变量、随机、运行触发器

学习运行触发器、点击单位事件

学习if判断、局部变量和循环

学习“画格子”、嵌套型循环

学习使用计时器、简要信息面板

学习自定义buff、式神技能diy

学习定义物品、单位死亡掉落

新手引导
Uni编辑器下载、安装指引

安装流程

双击目录下的.exe文件,进行PC包的安装。

新手引导

Uni编辑器占用空间约4G,请提前选择有足够空间的磁盘位置。

新手引导

确认路径后,点击“确认”进入安装流程。


多开说明

Uni编辑器支持同时打开多个客户端登陆不同的账号。建议复制多份安装好的Uni编辑器到不同的路径下,避免本地资源在编辑时出现冲突。


卸载流程

Uni编辑器为绿色安装,无注册表残留,直接删除整个文件夹即可。 

启动Uni编辑器(网易通行证)

打开Uni编辑器后,您将会看到如图扫码界面:

新手引导

请用《网易手游管家》或《决战!平安京》的扫码功能,扫二维码进行PC版Uni编辑器的登陆:


网易手游管家:

1. 使用手机,从应用商店搜索“网易手游管家”进行下载;

2. 使用网易通行证账号登陆网易手游管家;

3. 使用网易手游管家的“扫一扫”功能扫Uni编辑器的二维码;


决战!平安京:

在《决战!平安京》中可使用以下两种扫码方式:

一、好友二维码

1. 使用手机,从应用商店搜索“决战!平安京”进行下载;

2. 使用网易通行证账号登陆《决战!平安京》;

3. 点击左上角您的头像,进入个人资料页面;

新手引导

4. 点击“二维码”,进入您的二维码界面;

新手引导

5. 点击“扫一扫添加好友”,并扫Uni编辑器的二维码;

新手引导

二、 Uni对战平台扫码

1. 使用手机,从应用商店搜索“决战!平安京”进行下载;

2. 使用网易通行证账号登陆《决战!平安京》;

3. 打开Uni对战平台,并点击左下角的“登陆电脑端”进行扫码登陆;

初次使用Uni编辑器

欢迎来到Uni编辑器,本文档仅对Uni编辑器的功能做初步介绍。

若对于具体的功能有任何疑问,请参考触发器、剧情模式或自定义的对应说明文档,内有更为详细的介绍。另外,随时欢迎您联系Uni编辑器的官方反馈人员!


登陆大厅

若您已经在《决战!平安京》内拥有角色,扫码后将直接用对应的角色登陆;若您是第一次登陆大厅,需要创建一个新的角色。


填写姓名、创建角色后,您将看到如图的大厅界面。

新手引导

设置:内含《决战!平安京》的手游相关设置及PC版Uni编辑器专属的快捷键目录;

创作:可在这里使用新建作品、提审和云盘功能;另外您也可以在这里编辑个人签名;

资源管理:可在这里管理本地的资源(曙光版第一批包体仅支持在这里管理共享场景资源,后续会逐步支持管理图片和语音);


新建作品

点击“+”新建一个作品吧!如图界面,您可以选择剧情模式或游戏模式,当然,在接下来的选择中也可以重新选择作品类型。

新手引导

新建剧情和游戏图将会有不一样的选项设置;


剧情模式:可以在这里填写作品名字,选择剧情动画模板(带有已编辑好的电影事件)或自定义创建、使用阴阳师场景;

新手引导

游戏模式:可以在这里填写作品名字,选择游戏模板(带有已编辑好的触发器)或查看新手教程;

新手引导
新手教程

点击游戏模式-右下角的教程可进入游戏模式的教程界面

新手引导

新手教程包含塔防、吃豆大作战和Uni战棋三个章节,点击对应章节可开始学习

新手引导

观看一段剧情后,需要使用游戏触发器解决一个需求,成功实现需求则可过关

新手引导
游戏模式的编辑界面

游戏模式的编辑界面包含以下三部分:

(1)场景编辑

(2)触发器逻辑编写

(3)自定义属性、运行、测试、游戏设置

新手引导

剧情模式的编辑界面包含以下三部分:

(1)场景编辑

(2)时间轴电影事件编写

(3)运行、测试、游戏设置

新手引导
运行、Debug、开房测试、游戏设置

本地运行和Debug

制作了一个游戏/剧情作品后,您可以随时点击右上角的“运行”来查看它的效果。

如图为运行中的界面示意:

新手引导

(1) 如需结束运行,您可点击如图小齿轮,打开游戏中的设置界面,并点击“退出游戏”;退出游戏后,您将直接回到编辑模式;

(2) 运行过程中,有一个Debug界面,可提示您在运行中的报错;当您返回编辑模式后,依然能在Debug面板中看到上一次运行的报错,并直接跳转到对应的触发器节点;


开房测试

运行模式默认以玩家1的身份运行,如您需要测试多人游戏,请退出编辑模式,并在作品详情右侧点击“本地开房测试”

新手引导
进入开房测试

进入开房测试后,您可以点击选择任意玩家位置(如玩家2、玩家3),并点击“开始游戏”,以对应的玩家身份运行游戏。

开房测试相当于私人房间,可以邀请好友一起来测试您做的游戏,记得要在《决战!平安京》内先添加一些好友哦!

新手引导
游戏设置

副本说明——可以编辑作品的封面、名称、描述、小地图等显示给玩家看的信息;

新手引导

载入画面——可以编辑载入时的画面信息;

新手引导

游戏设置——可以设置视野、寻路及操作界面的显示;

新手引导

操作界面——部分操作UI在实际运行时可以被屏蔽掉;

新手引导

音乐画面——可以修改默认背景音乐和各项场景效果;

新手引导

地图与镜头——可以修改编辑默认镜头、地图大小等参数;

新手引导

玩家与队伍——需要先在这里增加队伍,点击头像配置到对应的队伍中,才可以将场景中的单位设置为对应的队伍;

新手引导

编辑器设置——可以在这里调整编辑器、小地图相关的显示设置,还可以在这里关闭debug面板;

新手引导
提审

点击作品详情的“提审”可将作品提交到服务器。待运营人员过审后,作品的状态将会变成“已过审”。

新手引导 新手引导

提审后的状态:

新手引导

过审后的状态:

新手引导
云盘

云使用盘服务,可将本地的游戏文件及对应的所有自定义资源保存到服务器;重名游戏文件将会覆盖;云盘内可存不超过10张文件,自上传时起,可保留7天。

新手引导
触发器使用说明
创建触发器

触发器用于管理游戏规则、游戏逻辑、游戏流程等等,可以对地图副本的游戏玩法进行高度的自定义。每个地图包含都可以包含任意数量的触发器。

进入Uni编辑器后,只需按顺序点击下图所示按钮,即可创建触发器。

触发器使用说明 触发器使用说明

一个触发器通常由3部分组成:事件、条件、动作。

事件:确定触发器在什么时候执行。更多信息请参考『事件』。

条件:可以选择是否添加触发器执行条件,只有条件成立时才会在事件触发时执行触发器动作。更多信息请参考『条件』。

动作:当事件触发、条件成立时会执行的动作列表。更多信息请参考『动作』。



事件

事件会确定当前触发器会在什么时候执行。通常情况下,都需要为触发器添加事件,才能保证触发器的执行。

触发器使用说明

例如上图所示事件,表示当前触发器会在游戏时间过去10.0秒时执行。

多数情况下,一个触发器只有一个事件。当为触发器添加多个事件时,任意一个事件触发都会执行触发器。

关于事件,有2个比较重要的概念:事件注册、触发器副本。

1. 事件注册

在游戏运行的过程中,事件必须注册后才会生效,而且事件只会注册一次。

事件在游戏运行的过程中都是在创建触发器时注册的。而我们目前所讨论到的触发器都是在游戏初始化时创建的。因此我们目前所讨论到的事件都是在游戏初始化时注册的。使用这种事件可以理解为“静态触发器”。关于“动态触发器”,请参考『进阶功能-动态创建触发器』。

2. 触发器副本

在游戏运行的过程中,当事件触发时,就会创建一个触发器副本,每个触发器副本都会评估条件并独立地执行。

触发器使用说明

例如上图所示事件,当同时有2个单位unit_0和unit_1进入地图区域时,这2个单位都会触发这个事件,因此就会创建2个独立的触发器副本,这2个副本分别对应unit_0和unit_1的触发器副本,它们是独立执行的,彼此之间不会相互影响。



条件

为触发器添加了事件后,可以选择为触发器添加一个或多个条件,也可以选择不添加任何条件。事件触发后,只有所有条件都成立时,触发器才会执行动作列表。

若触发器中没有添加条件,则动作列表会在事件触发后立即执行。

若需要任意一条条件成立时执行动作,则需要将这些条件添加到『或』中。

触发器使用说明

例如上图所示条件表示:当全地图内单位的数量大于5且游戏逝去的时间小于10.0秒,或全地图内单位的数量大于5且游戏逝去的时间大于10.0秒时,条件成立。



动作

当事件触发、条件成立时,触发器就会从上到下依次执行所有动作。

大多数动作都是立即执行且立即完成的。动作完成后,才会执行下一条动作。因此动作列表在执行过程中,不断地执行:『执行、完成、执行、完成、执行….』这个过程。

部分动作执行后会停滞,直到触发某些特殊事件时才会完成并执行下一条动作,这些动作称为『停滞型动作』。关于停滞型动作的更多信息请参考『进阶功能-停滞型动作』。

关于动作,有2种比较特殊的动作:判断动作和循环动作。

1. 判断动作

判断动作会在动作执行的过程中判断该动作下的条件。若条件成立,则依次执行『则运行下列动作』中的动作;若条件不成立,则依次执行『否则运行下列动作』中的动作。

触发器使用说明

例如上图所示动作:若游戏逝去的时间大于10.0秒,则弹出Debug消息『111』,否则弹出Debug消息『222』。

若不添加任何条件,则执行『则运行下列动作』中的动作。

2. 循环动作

循环是一个在触发器编辑过程中只出现一次,但在游戏运行的过程中可能会连续执行多次的动作列表。循环中的动作列表会执行特定的次数,其执行顺序也是从上到下依次执行,执行到最后一个动作时,若仍未达到设定的执行次数,则会继续从动作列表中的第一个动作开始执行。

触发器使用说明

例如上图所示动作:会为玩家1弹出10条内容为『111』的系统提示。

需要注意,在使用循环的过程中,请尽量避免高频执行会影响客户端显示的动作(例如循环1000万次显示图片),避免在游戏运行的过程中造成客户端闪退的现象。



参数

参数是事件、条件、动作中的输入值,是一种信息,或如何获取信息的指令。

参数的类型非常多,有整数、浮点数、字符串、单位、玩家、区域、点、物品等等。

触发器使用说明

例如上图所示的事件中,『10.0』就是为这个事件输入的一个参数,它是一个浮点数参数,其值为10.0。这个『10.0』就是一种信息,通过编辑者的直接输入而获取。

有的时候,参数并不直接输入信息,而是输入信息的获取指令(使用变量或函数)。

触发器使用说明

例如上图所示的条件中,『((全地图 内所有单位)中单位的数量)』是一个参数,它是一种信息的获取指令,是一个函数,一个整数参数,其值为全地图区域中单位的数量。『(游戏逝去的时间)』也是一个函数,一个浮点数参数,其值为游戏已经逝去的时间。

变量也是一种信息的获取指令,更多信息参考『变量』。



变量

变量用于储存参数的值。绝大多数参数的值都能以变量的形式储存。

Uni编辑器中有4种类型的变量:全局变量、数组变量、局部变量、自定义属性。

1. 全局变量

全局变量是一种在整个游戏运行的过程中都能被获取或修改的变量。一个独立的全局变量,在游戏运行的过程中是唯一的,其值被修改后,再次获取其值时,获取到的是被修改后的值。

使用全局变量前,需要先声明全局变量。只需在触发器界面中点击右下角的『X』,然后在二级界面中点击『新建』,再在变量分类中勾选『全局变量』,并配置相关变量信息,即可声明全局变量。

触发器使用说明

声明全局变量后,可以对全局变量实现以下2种操作。

赋值:使用『变量-变量赋值』动作即可对全局变量进行赋值、修改。

读取:在配置参数时选择『读取全局变量』,即可读取全局变量的值。

需要注意的是,在游戏运行的过程中,全局变量是在游戏初始化、创建触发器之前就已经创建了。也就是说,全局变量的创建和初始值的赋值比事件注册还要早,因此可以在事件中引用全局变量。尽管如此仍然需要注意,由于事件只注册一次,即使在游戏过程中改变了全局变量的值,也不会改变事件。如果确实需要改变事件,则需要动态注册新的事件,详情请参考『进阶功能-动态创建触发器』。

2. 数组变量

数组变量是多个同类型全局变量的有序列表。

使用数组变量前,需要先声明数组变量。流程与声明全局变量基本一致,但需要在变量分类中勾选『数组变量』。数组变量的创建与赋值时机与全局变量相同。

关于数组的初始值:在游戏初始化进行数组变量的创建与赋值时,会为数组的每一个位置的值都设为初始值。

数组可以实现以下8种操作。

赋值:使用『变量-数组变量赋值』动作即可对数组变量进行赋值、修改。

读取:在配置参数时选择『读取数组变量』,即可读取数组变量的值。

添加对象:使用『变量-数组添加对象』动作即可在数组的末尾添加一个对象,并对该对象赋值,使用后数组的大小会增加1。

移除对象:使用『变量-数组移除对象』动作即可移除数组中特定下标(特定位置)的对象,同时原本在该下标之后的对象会保持原来的顺序整体前移1个位置,使用后数组的大小会减少1。

插入对象:使用『变量-数组插入对象』动作即可在数组的特定下标中插入一个对象,并对该对象赋值,同时原本处于该下标位置的对象以及该下标之后的对象会保持原来的顺序整体后移1个位置,使用后数组的大小会增加1。

数组翻转:使用『变量-数组翻转』动作即可将数组原地翻转。

数组排序:使用『变量-数组排序』动作即可根据数组中储存的值的大小进行排序,但需要数组中所储存的是数字时才能实现这种操作。

随机重排数组:使用『随机-随机重排数组』动作即可将数组中储存的值随机打乱顺序,其中数组中的每个值在数组中每个位置的概率是相等的。

关于数组,还有2个需要注意的点:

1) 在Uni编辑器中,数组的下标从1开始;

2) 声明数组变量时,数组的大小不能大于128,如果需要更大的数组,需要进行『添加对象』、『插入对象』等操作;

3. 局部变量

局部变量是一种只在当前触发器执行过程中可以被获取或修改的变量。

使用局部变量前,需要先声明局部变量。使用『变量-设置局部变量』即可声明局部变量。

局部变量可以实现以下2种操作。

赋值:使用『变量-设置局部变量』即可对局部变量进行赋值、修改。

读取:在配置参数时选择『读取局部变量』,即可读取局部变量的值。

关于局部变量,有2个比较重要的概念:局部变量独立于各个触发器副本、局部变量在创建触发器时会进行快照。

1) 局部变量独立于各个触发器副本

在『事件』中有提到,在游戏运行的过程中,当事件触发时,就会创建一个触发器副本,每个触发器副本都会评估条件并独立地执行。而局部变量在每个触发器副本中是彼此独立的,每个触发器副本中的同名局部变量并不会互相影响。

2) 局部变量在创建触发器时会进行快照

在创建触发器时,若使用已经声明过的局部变量,会对局部变量的值进行快照。详情请参考『进阶功能-动态创建触发器』。

4. 自定义属性

自定义属性是一种在获取信息时,除了变量名,还需要一个key的全局变量。自定义属性实现了一种key-value的映射关系。

数组变量可以理解成一种特殊的自定义属性,因为我们在获取数组变量的值时,除了变量名,还需要一个下标,这个下标可以理解成一个类型为整数的key。而在自定义属性中,key除了可以是整数,也可以是浮点数、字符串、单位等等。

使用自定义属性前,需要先声明自定义属性。使用『变量-设置自定义属性』即可声明自定义属性。在这个动作中,第2个参数就是key,第5个参数就是value,第3个参数就是变量名。

自定义属性可以实现以下2种操作。

赋值:使用『变量-设置自定义属性』即可对自定义属性进行赋值、修改。

读取:在配置参数时选择『读取自定义属性』,即可读取自定义属性的值。



进阶功能

1. 动态创建触发器

在游戏运行的过程中,通常情况下触发器都是在地图初始化时创建的,因此事件也通常是在地图初始化时注册的。然而有时会遇到需要在非游戏初始化时注册事件的情况。例如在游戏运行的过程中创建了一个单位,并为这个单位注册一个『任意单位进入其范围』的监听事件。在这种情况下,就需要用到动态创建触发器的功能。

使用『触发器-创建触发器』动作,即可动态创建触发器。

在动态创建触发器的过程中,需要注意使用不同类型的变量的区别。动态创建触发器的过程中使用全局型变量(全局变量、数组变量、自定义属性),使用了这些变量的参数所使用的仍然是这个变量的引用(即信息的获取指令),而不是变量的值;创建过程中使用局部变量,则会进行快照,使用了局部变量的参数所使用的是变量的值,而不是变量的引用。

要理解这个区别,可以看下面的这个例子。

触发器使用说明

如上图所示创建触发器,所创建的其实是一个这样的触发器:

触发器使用说明

可以看到,在创建触发器时,由于『unit』是一个全局变量,在使用了『unit』的事件和动作中保存的仍然是这个变量的引用。因此,在注册事件时,『unit』使用的是注册事件时『unit』的值,即『犬神_1』。而事件触发时,播放死亡动作的是『unit』,至于到底是哪个单位播放死亡,取决于事件触发时『unit』的值。

然而,另一种情况下,如果创建触发器时使用的是局部变量:

触发器使用说明

如上图所示创建触发器,所创建的其实是一个这样的触发器:

触发器使用说明

可以看到,在创建触发器时,由于『unit』是一个局部变量,在使用了『unit』的事件和动作中保存的是这个变量的值。因此,在注册事件时,直接把『犬神_1』作为参数用于注册事件。而事件触发时,播放死亡动作的也一直是这个『犬神_1』。

综上,在动态创建触发器时,需要根据具体需求合理运用不同类型的变量。

2. 计时器

计时器是一种特殊的触发器,其事件为计时器到期事件。计时器到期后,就会和触发器一样,从上到下依次执行动作列表中的动作。

计时器可以实现以下4种操作。

运行:使计时器进入运行状态。

暂停:使运行中的计时器暂停。

重置:重置计时器以运行的时间,原本运行中的计时器重置后会继续运行,原本暂停的计时器重置后会继续暂停。

设置计时周期:重新设置计时器的计时周期,但使用后会重置并暂停计时器。

需要特别注意的是,因为计时器是一种特殊的触发器,所以在创建计时器的过程中,如果需要使用父触发器中的参数,需要利用局部变量的快照功能,先设置局部变量,再在计时器中调用局部变量。

要理解这一点,可以看下面的这个例子。

触发器使用说明

这个例子中想要实现的规则是,当父触发器的事件触发时,让触发单位在10.0秒后播放死亡动作。

这个例子的写法看起来似乎没问题,然而其实是错误的。因为计时器是一种特殊的触发器,像这样创建并运行计时器,实际上是创建了下图所示的触发器。

触发器使用说明

这样就能看出问题了:这个事件触发时并没有触发单位,不能这么实现。

因此当需要使用父触发器中的参数时,就要利用局部变量的快照功能,先设置局部变量的值,再在计时器中调用局部变量。这样在创建的计时器中才能读取到正确的值。如下图所示。

触发器使用说明
3. 停滞型动作

大多数动作都是立即执行且立即完成的,部分动作执行后会停滞,直到触发某些特殊事件时才会完成并执行下一条动作,这些动作称为『停滞型动作』。

停滞型动作目前有如下4种:时间-等待、显示-停滞型单位对话框、显示-停滞型立绘对话框、触发器-运行触发器。

时间-等待:执行后停滞,直到停滞后的时间达到动作中所设定的时间时,才会完成并执行下一条动作。

显示-停滞型单位对话框、显示-停滞型立绘对话框:执行后停滞,直到对话框被关闭时,才会完成并执行下一条动作。

触发器-运行触发器:执行后停滞,直到被运行的触发器的最后一个动作执行完成时,才会完成并执行下一条动作。

由于停滞型动作的执行逻辑比较特别,在设计触发器的过程中需要谨慎使用这些动作。因为大多数情况下我们都希望触发器动作是立即执行且立即完成的,当停滞型动作使用不恰当时,很容易出现触发器动作执行时机不符合预期的情况。

4. 随机分类中的动作

随机分类中的动作可以有效地实现一些常见的随机抽样算法。

随机-以概率运行动作:执行该动作时,根据动作中所设定的概率决定是否执行子动作列表。

随机-以权重运行动作:执行该动作时,根据子动作列表中所设定的权重,执行该动作中所设定的对应组数的子动作列表。

例如下图所示的动作,其执行结果为:『unit』有10.0 / (10.0 + 30.0) = 0.25的概率播放死亡动作,有30.0 / (10.0 + 30.0) = 0.75的概率播放受击动作。

触发器使用说明

对于更为简单的随机抽样算法,可以在数组的下标中使用『范围内的随机整数』来实现。

5. 计分板

计分板是Uni编辑器已经实现好的一个用于在游戏中记录玩家游戏信息的UI组件,只需要执行计分板的相关动作,即可在游戏中记录玩家的游戏信息。

计分板的本质是一个二维表格,行的信息为玩家信息,列的信息可以自定义。一个完整计分板的显示,通常需要以下操作。

创建计分板:使用『计分板-创建计分板』动作即可创建一个计分板。

设置数据项名称:创建计分板后,需要设置数据项的名称,即计分板的每一列分别为什么数据。使用『计分板-设置计分板数据项名称』即可完成这项操作。

显示玩家数据:创建计分板后,还需要将想要展示数据的玩家加到计分板中,即计分板的每一行分别是哪位玩家的数据。使用『计分板-计分板显示玩家数据』即可完成这项操作。

设置显示内容:定义好行和列的信息后,接下来就是填充每个格子的显示内容。使用『计分板-设置计分板显示内容』即可完成这项操作,这里还需要注意3点:

1) 第3个参数需要填写『计分板-设置计分板数据项名称』动作中所设置的数据项名称,用来定位格子的位置。

2) 每个格子的显示内容可以包含多项数据,每一项数据可以是字符串或者图标,数据的索引值只用于排序,不一定从1开始,最终显示的内容会将该格子内的所有数据按照索引值从小到大的顺序串联起来,需要注意相同索引值的数据会被顶替。

3) 设置好显示内容后,若需要修改显示内容,需要再次执行该动作,才会主动刷新计分板显示内容。

显示计分板:设置好计分板后,需要将设置好的计分板显示出来。使用『计分板-管理计分板显示』即可完成这项操作。

计分板还可以自定义排序规则。在定义好每一列的数据项名称后,可以根据该列的某一索引值的对应数据进行排序。使用『计分板-设置计分板排序规则』动作即可完成此项操作。该动作只需执行一次即可,之后每一次主动刷新计分板都会根据这个排序规则对计分板进行排序。需要注意的是,当任意一名玩家的对应索引值的内容无法转换为数字或不存在对应索引值的内容时,该动作会失效。

6. 简要信息面板

简要信息面板是Uni编辑器已经实现好的一个用于显示一些游戏中的简要信息的UI组件,只需要执行简要信息面板的相关动作,即可在游戏运行的过程中在游戏界面的右上角显示出来。

简要信息面板的显示,通常需要以下操作。

创建简要信息面板:使用『创建简要信息面板』动作即可创建一个简要信息面板。

设置显示内容:使用『设置简要信息面板显示内容』动作即可设置显示内容,设置规则与计分板的显示内容设置规则相同,详情请参考『进阶功能-计分板』。

显示简要信息面板:设置好简要信息面板后,需要将其显示出来。使用『管理简要信息面板的显示』动作即可完成这项操作。

简要信息面板还可以显示计时器信息,『简要信息面板显示计时器』、『简要信息面板隐藏计时器』这2个动作中提供了相应的接口。

7. Debug与调试

Uni编辑器中的触发器提供了Debug的功能,该功能可以方便地定位到触发器中所存在的编写错误,可用于触发器的Debug。

若要使用该功能,需要先在编辑器设置中打开Debug模式的开关。

触发器使用说明

开启Debug模式后,在游戏运行的过程中,当触发器执行错误时,Debug面板就会抛出Debug信息。

遇到Debug信息时,回到编辑器中打开触发器界面,就可以看到最近一次游戏运行过程中的Debug信息。打开该界面,并点击对应Debug信息的放大镜按钮,就可以准确地定位到错误节点的位置。

触发器使用说明

当不知道触发器为何没有依照预期执行,却又没有任何Debug信息时,也可以使用『游戏-弹出Debug消息』动作主动地弹出一些必要的Debug消息进行调试,从而找到错误所在。

8. 注释

触发器中提供了注释的功能,触发器的事件、条件、动作中也提供了注释的功能。多写注释、把注释写清楚,可以帮助自己在下一次查阅自己所设计的触发器时,更清楚地看懂当时的实现。

自定义界面说明
自定义界面说明
单位属性

单位属性页签用来编辑所有单位的自定义属性。

单位的类别分为:式神、建筑、士兵、野怪、自定义。不同类别的单位属性分类不同,可编辑的字段也不同,在这里,我们开放了编辑器中所需要的可编辑字段。以式神(英雄)为例,可编辑的属性有:基础属性、成长属性、高级属性、单位技能、死亡掉落以及更多属性。在所属分类下编辑式神属性,如基础属性中的攻击、护甲,死亡掉落中的物品配置。

值得注意的是,这里的单位属性指的是单位类型的属性。比如将大天狗的攻击设置为76,那么所有创建出来的大天狗攻击都为76,想要改变某个特定单位的属性值,则需要通过触发器实现。

自定义界面说明

每一个单位右上角都有一个复制单位的功能,复制后的单位将出现在自定义分类下,作为一个新的单位类型。如上图中的惠比寿_1与惠比寿_2在这里就是两种不同的单位类型。



自定义界面说明
装备属性

装备属性页签用来编辑所有装备的自定义属性。

自定义界面说明

装备的分类沿用了平安京的分类方法,分为:武器、法器、防具、猎具、足具、辅助、自定义。装备属性分为基础属性、售卖属性和被动技能。不同装备的 基础属性是不同的,比如有的武器为攻击加成,有的武器为暴击加成,有的足具为移速加成。

自定义界面说明

被动技能是可以更改配置的,比如可以给A装备应用B装备的被动技能,技能的个数也可以手动增加/删除。



物品属性
自定义界面说明

物品属性页签是用来编辑物品的自定义属性。

物品的本身的属性分为基础属性、售卖属性、使用属性、执行效果和建造属性。这里是抽取了物品在平安京中的原有效果,比如原本是一个回蓝药,那这个道具在这里的执行效果就是回蓝效果。但是如果想通过使用一个回蓝药实现更多其他的功能,比如吃了一个糯米饭团,使用单位的攻击力+50,这样的效果是通过触发器实现的。

自定义界面说明

物品也是支持复制的,所以糯米团子_1与糯米团子_2是两种不同的物品类型。



自定义界面说明
自定义技能

自定义技能页签是编辑技能的地方。

技能分为式神技能和装备技能。式神技能拆分为技能基础、技能数值、技能buff、建造属性,每一类属性下面都有对应技能的可编辑字段。如技能基础页签中的基本信息、命中特效、子弹特效;技能数值页签用来编辑技能的数值相关内容,如通用数值中的施法距离、CD,伤害数值、子弹数值。如下图中的技能伤害数值为322.5+(0.6*法强),322.5为基础伤害值,(0.6*法强)为加成伤害值,伤害类型为魔法伤害;

自定义界面说明

技能buff页签可以编辑该技能所带buff效果,如下图中的1级无懈之翼技能带有3个buff效果,这3个buff类型可以更改配置;不同技能所带的buff个数不同。

自定义界面说明

在建造属性页签中,可以勾选该技能为建造技能,并设置相应的建造属性,使所修改的技能变为一个建塔技能。建造属性包括建造单位的单位类型、建造范围、建造时间、金钱消耗以及建造的单位是否可操控。

自定义界面说明

自定义buff
自定义界面说明

自定义buff页签是编辑buff信息的界面。

自定义buff同样也分式神buff和装备buff。Buff的信息包括基本信息、影响属性、buff伤害、buff数值、护盾数值以及特效信息。

应用buff指的是把所想要编辑的buff覆盖到一个开放式自定义buff中,开放式自定义buff可编辑所有buff相关字段,当你想用某一个式神的某个buff时,同时又不想影响该式神的原本buff效果,那么可以把这个buff通过应用buff按钮抽取到开放式自定义buff中编辑。



自定义界面说明
商店属性

商店属性界面用来设置商店相关内容。

随身商店为平安京原有的售卖装备的商店,新建商店和新建分类则是新建全新的商店,自己可以编辑所需上架的装备和物品,商品的上下架也可以通过触发器动态改变。商店的功能更多的是在触发器中实现,如商品购买事件,商品售出事件,设置商品价格,数量等,往往需要配合触发器的相关节点,才能真正实现预期的商店功能。



自定义收费
自定义界面说明

自定义收费页签用来编辑收费项目。可编辑的信息为商品名称、出售价格、有效期、以及商品描述。具体规则如下图所示,值得注意的是,只有地图热度大于10000后才可以上架收费项目。

自定义界面说明

自定义界面说明
自定义合成

自定义合成页签用来编辑装备的合成方案。可以配置多套不同的合成方案,选择使用此方案后,游戏运行中将以这套方案去合成装备。还原功能可以将已编辑的合成方案还原为初始合成方案。



全局数值
自定义界面说明

全局数值包括式神升级经验、式神击杀经验和式神击杀金钱。这里的数值是全局数值,也就是所有1级式神的升级经验都为280点。

UI编辑器指引
UI编辑器指引

一、基础概念

要编辑界面,首先我们要了解一些基础概念,这非常重要,你必须明白你在编辑的是什么,你才能完成编辑。这里主要将界面编辑和场景编辑做类比,希望可以帮助大家理解。


1.1 界面和布局

一个界面,其实就相当于一个场景。在编辑场景时,我们可以在场景中编辑单位;对应的,在编辑界面时,我们可以在界面中编辑控件。


界面布局,可能是个很陌生的概念,但是布局这个概念其实在场景编辑中就存在了。在编辑场景时,我们会定义每个单位的单位类型、单位名字、大小、朝向、位置等信息,一个场景中所有的单位的所有的以上相关信息的总和就是场景的布局。对应的,一个界面中所有控件的控件类型、名字、尺寸、旋转、位置等等信息的总和,就是界面的布局。所谓拼界面,其实就是编辑界面的布局。


编辑界面和编辑场景其实非常相似,当你用久了你就会发现,编辑界面其实就是在编辑一个2D的场景而已。如果你现在就已经有这种程度的理解,那么恭喜你已经入门了。


1.2 控件和控件事件

一个控件,其实就相当于场景里的一个单位。在编辑单位时,我们可以编辑单位的位置、大小等信息;对应的,在编辑控件时,我们也可以编辑控件的位置、大小等信息。


在编辑场景时,我们可以给单位注册一些事件:比如点击单位事件、进入单位范围事件、单位死亡事件等等;对应的,在编辑界面时,我们也可以给控件注册一些时间:比如点击控件事件、拖拽控件事件等等。


在编辑场景时,注册单位事件后就可以编辑单位的逻辑;对应的,在编辑界面时,注册控件事件后就可以编辑控件的逻辑。


二、界面布局编辑

这部分主要为大家讲解界面布局编辑的相关要点。


2.1 新建界面

在副本编辑器的右上角,点击『界面』按钮,即可进入当前副本的界面管理界面。


在这里可以选择已制作的界面进行编辑,也可以点击『新建界面』按钮,新建一个界面。


2.1.1 根节点root


每新建一个布局,都会有一个根节点root。这个根节点是必须的,不要随意删除,官方已经为这个root节点做好了一些适配,你可以直接把这个root当作是玩家的屏幕。


2.2 控件树

控件在界面布局中是以树的结构组织起来的。你可以不用了解树到底是什么结构,你只要明白几个树的基础概念:


  • 子节点(子控件):在某个控件内的新建的任何控件,都是这个控件的子控件,我们可以认为在界面编辑器中新建的任何控件都是根节点root的子控件或孙子控件;
  • 父节点(父控件):与子控件相对应,A是B的子控件,那么B就是A的父控件;

控件树非常关键,它决定了控件所使用的控件坐标系。我们在界面编辑器中所编辑的任何控件的位置,都是相对于其父节点的控件坐标系的位置。在这里只需要理解到这个程度就可以了,更多信息请参看【进阶阅读 -> 世界坐标系与控件坐标系】。


2.3 控件

界面编辑器左下角列出了我们能使用的各种控件,点击控件可以在预览区创建该控件,也可以将控件拖动到预览区来创建控件。


每种控件有若干可编辑属性,通过编辑这些属性来编辑控件。


可以在预览区或控件树上选择一个已有控件来编辑、删除。也可以通过拖拽来简单改变控件位置、尺寸。


2.3.1 按钮


按钮是最常使用的控件之一,一个按钮可由3个状态的图片、一组文字组成。按钮可以注册点击、拖拽等事件。


2.3.2 图片


图片是最常使用的控件之一,一个图片仅有一张底图构成,底图支持九宫切分。图片不能用来注册事件。


2.3.3 文字


文字是最常使用的控件之一,一个文字控件包含一段文字,此外也可以指定文字的字体、字号、颜色以及是否支持富文本等属性。文字不能用来注册事件。


2.3.4 层


层是一个特殊控件,它没有可见的外观(可以想象成一个透明图片),但是它却能用于注册一系列事件。例如点击、拖拽事件。


通常情况下,可以用层来整理各控件之间的父子关系。例如在制作一个包含图片、文字、按钮的小界面时,用层做父控件,方便管理。


2.3.5 输入框


输入框控件可以让玩家输入文字,并且获取玩家输入的文字。例如玩法中需要玩家给角色起名,就可以调用输入框来实现。输入框可以注册编辑内容确定、开始编辑、编辑内容改变三个事件。


2.3.6 进度条


进度条控件支持条形和环形进度条,你可以改变进度条的百分比来控制进度条的显示。进度条不能用于注册事件。


2.3.7 多选按钮


多选按钮可以用于制作一组多选选项,也可以用来制作标签页。多选按钮能注册的事件与按钮是相似的。


与按钮不同的是,多选按钮存在两个状态:truefalsetrue表示按钮的下压状态,false表示按钮的抬起状态。正因如此,多选按钮比按钮多了一种可注册的事件:多选状态改变。


2.3.8 滑动条


滑动条可以让玩家拖拽滑动,并获得滑动的比例数值。例如制作一个声音大小控制功能,可以使用滑动条。滑动条可以注册被滑动、点击开始、点击结束事件。


2.3.9 裁剪节点


裁剪节点可以对它的子节点进行裁剪。裁剪节点是一张图片,它的子控件被图片的透明部分裁剪,例如说,可以用一个裁剪节点将方形头像裁剪为圆形。


2.4 模板

选中节点树上的一个控件,可以将该控件以及它的所有子控件储存为模板,供其它界面调用。


从控件区的『导入模板』按钮,也可以将模板导入到控件树中。


我们也提供了一些官方模板供大家使用。


三、界面逻辑编辑

这部分主要为大家讲解界面逻辑编辑的相关要点。


3.1 注册控件事件

在界面编辑器中,我们就可以直接为控件注册事件。当事件触发时,就会运行我们在界面编辑器中所配置的对应触发器。


不同的事件的触发时机是不一样的,每个事件的触发时机如下表所示。

事件名称 触发时机
点击开始 手指或鼠标在控件范围内下压时触发
拖拽 手指或鼠标下压后没有抬起,且手指或鼠标的位置有变化时触发
点击结束 手指或鼠标抬起时触发
点击 手指或鼠标下压后在控件范围内抬起时触发
移动取消 移动取消时触发
在控件外抬起 手指或鼠标下压后在控件范围外抬起时触发
多选状态改变 多选按钮的开关状态改变时触发
被滚动 列表被滚动时触发
滚动结束 列表结束滚动时触发
翻页 列表完成翻页时触发
开始编辑 开始编辑文本内容时触发
编辑内容改变 编辑内容发生变化时触发
编辑内容确定 编辑内容确定时触发
被滑动 滑动条被滑动时触发
3.2 控件事件参数

控件事件触发时,我们可以在运行的触发器中,使用一些参数来获取事件的相关信息。可以使用的事件参数如下表所示。

参数类型 参数名 参数功能
玩家 触发玩家 获取触发控件事件的玩家
控件 触发控件 获取触发控件事件的控件
界面坐标 触发界面坐标 获取触发控件事件时手指或鼠标的位置
布尔值 触发控件的多选状态 获取触发控件事件的多选按钮的当前多选状态
整数 触发控件在多选按钮组中的索引值 获取触发控件事件的多选按钮在多选按钮组中的索引值
整数 触发滑动条的百分比 获取被滑动事件触发时滑动条的百分比
整数 触发翻页列表的当前页码 获取翻页事件触发时列表的当前页码
字符串 触发控件内已输入的内容 获取触发控件事件时控件内已输入的内容
触发界面坐标对应的场景点 获取触发控件事件时手指或鼠标的位置映射到场景中的位置

当然,需要注意,不同的事件触发时,可使用的事件参数是不同的。详见下表。

事件名称 可用事件参数
点击开始 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
拖拽 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
点击结束 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
点击 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
移动取消 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
在控件外抬起 触发玩家、触发控件、触发界面坐标、触发界面坐标对应的场景点
多选状态改变 触发玩家、触发控件、触发控件的多选状态、触发控件在多选按钮组中的索引值
被滚动 触发玩家、触发控件
滚动结束 触发玩家、触发控件
翻页 触发玩家、触发控件、触发翻页列表的当前页码
开始编辑 触发玩家、触发控件、触发控件内已输入的内容
编辑内容改变 触发玩家、触发控件、触发控件内已输入的内容
编辑内容确定 触发玩家、触发控件、触发控件内已输入的内容
3.3 注册界面事件

除了注册控件事件,我们还可以注册界面事件。界面的事件类似于,我们在编辑场景时有『游戏初始化』、『游戏开始』事件。对应的,在编辑界面时,我们有『界面初始化』事件、『界面销毁』事件。


3.3.1 界面初始化


这个是一个非常重要的事件,我们可以直接在触发器中新建一个触发器来注册这个事件。当界面被显示时,就会触发这个事件。


为什么这个事件很重要的?因为只有注册了这个事件,你才能以更便捷地方式完成界面的编辑。举个例子,我们现在想要在某个界面的某个label控件中显示当前玩家的名字。这个信息我们不可能在界面编辑器中就编辑好,我们只能在游戏运行时才能获取玩家的名字。因此如果你要实现这个需求,最好的方式就是注册这个界面的初始化事件,在每次界面初始化时,都将这个界面的label控件的文本设置为玩家的名字,这样一来我们就实现了这个需求。


3.3.2 界面销毁


这个事件同样也非常重要,会在界面被关闭时触发。如果你记录的一些玩家的信息需要在界面被关闭时被改变,那么这个事件就会派上用场。


四、界面视觉设计

4.1 界面适配

通过设置控件的锚点、位置x、位置y,可以将界面控件进行挂靠适配,以保持所有控件能够在不同分辨率下保持与挂靠点的相对距离。


4.1.1 锚点


锚点是控件的一个重要属性,是子节点相对于父节点设置位置时候的一个基准参考点,它决定了节点以自身约束框中的哪一个点作为整个节点的位置。也就是说,控件的锚点的位置就是控件的位置


另外,锚点也会作为控件缩放、倾斜、旋转的基准点。


4.1.2 位置的计算方法


控件的位置和尺寸提供了3种计算方法:


1. 数值: 纯粹数值,没有特殊的计算方法,即相对于父节点的控件坐标系的坐标;

2. 百分比: 父节点尺寸的百分比,例如某个控件的尺寸设置为(80%, 60%),该控件的父控件的尺寸为(1000, 1000),那么该控件的实际尺寸为(800, 600)

3. 百分比偏移: 父节点尺寸的百分比偏移一定的数值,例如某个控件的尺寸设置为(80%20, 60%-40),该控件的父控件的尺寸为(1000, 1000),那么该控件的实际尺寸为(820, 560)


4.1.3 官方战斗界面适配信息

官方战斗界面适配信息

官方战斗界面适配信息

4.2 九宫缩放

在使用图片资源时,可以通过勾选『九宫缩放』,并在『九宫切分』中设置图片资源拉伸区域,将图片资源只保留边角,拉伸选中的像素达到放大资源的目的。勾选『九宫缩放』后,控件可以通过修改尺寸x和尺寸y进行尺寸的变更。九宫的拉伸规则如下图,建议将水平/垂直同时拉伸区域设置在无纹理的区域,以达到最佳的拉伸效果。

九宫切分

九宫切分

图片、按钮、多选按钮等控件,在不勾选『九宫缩放』时,是不可以更改控件的尺寸的。因为不勾选九宫缩放的情况下更改图片的尺寸会导致图片变形。若要改变这类控件的尺寸,均需要勾选『九宫缩放』,并确保控件所使用的图片资源是适合进行九宫缩放的资源。


4.3 《决战!平安京》文本字色参考
文本字色参考

文本字色参考

五、管理界面层级

在副本编辑器的右上角,点击『界面』按钮,即可进入当前副本的界面管理界面。


在界面管理界面中,点击『管理界面层级』按钮,即可管理界面层级。


在这个界面中,我们可以编辑我们在当前副本中创建的自定义界面的层级以及部分官方界面的层级。其中,自定义界面的名称会被标注为橙色,官方界面的名称则是黑色的。


界面层级的管理较为简单,只需要注意以下2点:


1.界面层级越大,界面越高,会盖住层级比它低的其他界面;

2.层级相同的界面,后显示的界面会高于先显示的界面;


六、进阶阅读

这部分会为大家讲解一些比较进阶的功能。


6.1 世界坐标系与控件坐标系

界面上的一个点,通常我们都用『界面坐标』来表示。在坐标系确定的前提下,坐标才有意义,因此我们需要知道在UI编辑器中,世界坐标系和控件坐标系分别是什么。


首先是控件坐标系,如果你用过UI编辑器,那你已经用过控件坐标系很多次了,只是你可能还没有感受到。举个例子,当我们要在下图这个image下创建一个button,并将button的位置设为(0, 0),你会发现buttonimage的左下角:

世界坐标系与控件坐标系:图1

世界坐标系与控件坐标系:图1

这是因为,当我们在UI编辑器中设置控件的位置时,我们所使用的都是该控件的父控件的控件坐标系。button的父控件是imageimage的控件坐标系的原点在这张图片的左下角,所以button也位于这张图片的左下角。


同样的,当我们在触发器中设置控件的位置时,我们所传入的界面坐标也必须是相对于该控件的父控件的控件坐标系的坐标,才有意义。

世界坐标系与控件坐标系:图2

世界坐标系与控件坐标系:图2

某个控件的控件坐标系,都是以该控件的左下角为坐标原点,当控件没有发生旋转、缩放、倾斜时,控件坐标系的基向量与世界坐标系相同。也就是说,正常情况下,控件坐标系的x轴和y轴就是我们目前所理解的x轴和y轴。


在以下情况下,控件坐标系会发生变化:


1.修改控件的位置:原点平移,基向量没有变化;

2.修改控件的尺寸:当锚点不在左下角时原点会平移,基向量没有变化;

3.修改控件的锚点:原点平移,基向量没有变化;

4.修改控件的缩放:当锚点不在左下角时原点会平移,且基向量伸长或缩短,当缩放为负数时,基向量会沿着反方向伸长或缩短(本质上就是用缩放量点乘基向量得到新的基向量,水平翻转、垂直翻转其实就是在缩放x、缩放y的数值上加一个负号);

5.修改控件的倾斜:当锚点不在左下角时原点会平移,且基向量倾斜;

6.修改控件的旋转:当锚点不在左下角时原点会平移,且两个基向量同时旋转对应角度;


以上6点内容作为一个了解就好,不理解也没关系,感兴趣的同学可以拼一个和图1一样的界面,然后依次修改image的上述属性,观察button的变化,就能明白了。


明白了什么是控件坐标系,世界坐标系相对来说就简单很多了。简单一点理解,世界坐标系就是以屏幕左下角为坐标原点,朝右为x轴,朝上为y轴。或者将你的右手摆成下图这个姿势,大拇指的方向就是x轴,食指的方向就是y轴。

世界坐标系与控件坐标系:图3

世界坐标系与控件坐标系:图3

世界坐标系比控件坐标系简单,是因为他是不会变的,永远都是相对于整个游戏客户端界面的坐标。


这部分内容即使不理解也没关系,你只要知道什么时候是世界坐标系、什么时候是控件坐标系就可以了:


  • 触发控件坐标,使用的是世界坐标系;
  • 设置控件位置,使用的是控件坐标系;
  • 将世界坐标转换为控件坐标,使用触发器参数:界面坐标-转换屏幕坐标为相对控件坐标;
  • 将控件坐标转换为世界坐标:使用触发器参数:界面坐标-转换相对控件坐标为屏幕坐标;

详见示例: 控件坐标系


6.2 列表和列表项

列表是UI编辑器中一种相对复杂的控件,类比到触发器的话,列表就是一个数组。数组大家应该比较熟悉,数组是由多个对象按某种顺序排列起来的,我们可以获取整个数组,也可以获取数组中的某一项,改变数组的大小等等。同样的,列表就是由多个列表项所构成的,列表也有大小、其大小也可以被改变,列表中的每一项就是一个列表项。列表项可以很简单(比如一个按钮、一张图片),也可以很复杂(复杂的树状结构)。


无论列表还是列表项,在UI编辑器中都是一种控件。


列表在UI编辑器中不能直接创建,必须由某个原有的控件,通过『转列表』操作,转换而来。


目前共有以下5种类型的列表:水平列表、垂直列表、水平滚动列表、垂直滚动列表、水平翻页列表。控件转列表后,所创建的列表的类型默认为水平列表,可以根据实际需求修改列表类型。


列表项根节点的配置非常关键。列表项根节点的配置决定了列表项在列表中的显示大小。对于垂直列表,列表的『尺寸x』是不能编辑的,因为垂直列表的『尺寸x』是由列表项的尺寸x、列数、水平边距、水平间距这4个因素共同决定的;对于水平列表,列表的『尺寸y』是不能编辑的,因为水平列表的『尺寸y』是由列表项的尺寸y、行数、垂直边距、垂直间距这4个因素共同决定的。


详见示例: 队友信息界面


强烈推荐阅读上述示例,包含了设置列表大小、遍历列表、获取列表项子节点、获取列表项在列表中的索引值的方法。


6.3 多选按钮组

多选按钮组指的是一组多选按钮,这一组多选按钮最多只允许有1个按钮为true状态,当其中一个按钮变成true状态时,原本true状态的按钮会转为false状态。


多选按钮组主要用来实现标签页,详见 Tab页的实现


6.4 通过触发器注册控件事件

和界面编辑器注册控件事件不太一样,通过触发器可以为某个特定的控件注册事件。


通过界面编辑器中注册事件,可以理解为这个事件变成了这个控件的一个属性。例如,当我们为列表项的某个子控件在界面编辑器中注册了事件后,通过触发器在运行过程中扩充列表的大小时,新的列表项的对应子控件也会注册这些事件。


通过触发器注册控件事件则与之不同,触发器是在运行的过程中为某个特定的控件注册事件,因此可以达到同一个列表的不同列表项子控件交互效果不同的目的。但是需要注意,由于触发器是在运行的过程中为某个特定的控件注册事件,当界面关闭时,界面中的控件随之销毁,对应的通过触发器注册的事件就会失效。所以如果想要在界面再次打开时仍然保持上一次的交互效果,需要通过触发器再注册一次事件。


七、案例

这部分会给大家带来一些案例。


7.1 拖拽建塔的实现

详见 拖拽建塔的实现


7.2 列表和列表项

有很多案例都是用了列表和列表项,可以参见: Tab页的实现GUI形式输出矩阵自动切换的广告位关卡选择界面单位升星面板


下面这个案例详细说明了列表和列表项在触发器中的相关操作,包含了设置列表大小、遍历列表、获取列表项子节点、获取列表项在列表中的索引值的方法。


队友信息界面



平安京Uni对战平台