WorldEdit触发器(Trigger)浅析:第一章★Trigger事件

本羊看了多个的魔兽编辑器触发教程,综合比较,只有551155大佬的适合萌新。理由:

1、内容详实。551155大佬从触发的事件,触发的重要函数,进行详细解析。这种解析正是萌新所需要的!让萌新系统的、结构性的熟悉了一遍触发函数。

2、案例丰富。551155大佬针对重要函数做了触发演示。你只要打开WE,自己动手做一遍就会有更深刻的理解。

源文地址:http://bbs.islga.org/read-htm-tid-14454.html

若有缘停留在本羊博客学习,你将得到一份宝贵的学习心得,因为我现在正在一遍学习一遍写博文^_^。


作者:551155

序言:

WE发展至今,该研究的都被研究出来了,有人说,已经到了WE日暮时光,但我觉得现在WE依然在燃烧,还有很多人对此产生了兴趣。网上有各种各样的教程,包含我自己早年写的,但很多内容,特别是重点的触发器(Trigger)方面,却大多没有一个相对详细的说明,很多新手止步的原因就在于此。尽管SC2即将发布,但WAR3也不会这么快就没落,何况风格不同,而且触发器方面多少会有一些共通的地方;因此,我决定再制作一部教程,浅析关于触发器(Trigger)的方方面面,希望可以帮助喜欢WE的新人们。

DarkSheep:教程是2008年的,那时星际争霸2还没发布。现在是北京时间2018年4月11日。时隔10年,魔兽争霸3依然在燃烧着。1.29补丁更是为War3注入了一丝生机。

《浅析》的内容是分析Trigger的界面操作,并不包含JASS部分,而分析的主要目的是引导新人做出准确的判断和更加简洁的触发器触发器是由事件、条件和动作组成,其关系就是由事件运行触发器,条件判断运行内容,动作就是执行具体动作。文中有说明,也有一些即兴演示,但相对会更加突出重点,比如在事件的说明中,着重介绍事件,但也会带有具体的条件或动作,可做参考。

DarkSheep:文中的即兴演示,你只有打开WE,依葫芦画瓢尝试下,才会知道它的美妙。

在具体的分析之前,我想说一下的是,其实运用触发器真的很简单,因为是完全界面化的,你只需要点击再点击基本上就可以了。我们要做的,是熟悉各个触发函数(内部设定好的一个动作模块,我们就是使用这些函数来制作触发)的作用,并将他们相互搭配起来。演示的作用只是提供一个思考的方式,而不是需要照本宣科,同样的事件和动作经过不同的组合就可以产生不一样的效果,不要一味的模仿。



第一章 ★ Trigger事件

Trigger是由事件、条件、动作组成。事件是Trigger的开端,所有事件都是并行的,也就是说,在多个事件的情况下,只要触发一个事件就会执行触发器。大部分事件可以直接指定,但有部分事件却需要后期添加或者必须要有指定类型的变量才可以添加,后期添加也比较方便,后面会介绍到“动态注册事件”,这里我们先说一下具体的事件内容。还有需要注意到触发的关联性,比如“玩家事件”产生的触发是不可能会有“触发单位”这样的单位函数的,对应的只是“触发玩家”之类的玩家函数,但可以通过一些特殊情况转换,比如可以通过单位组动作的条件来选取玩家的单位,而且“触发单位所属玩家”就是一个很典型的单位事件调用玩家的函数。

第一节 ☆ 单位事件
Unit – Specific Unit Event
指定单位事件
Unit – Player-Owned Unit Event
玩家单位事件
Unit – Generic Unit Event
一般单位事件
Unit – Unit Enters Region
单位进入区域
Unit – Unit Leaves Region
单位离开区域
Unit – Unit Within Range
接近指定单位
Unit – Life
单位生命变化
Unit – Mana
单位法力变化

这里先说明一下“指定单位”的定义,顾名思义,这个需要针对已经存在的可以直接选取的具体的单位;不单单是事件,还包括一些条件和动作;不过不同事件可以用“动态注册”来达到添加事件的目的,而条件和动作可以通过“单位类型”的变量来读取。

DarkSheep:事件这块都比较好理解。不好理解的“动态注册事件”也不用太着急。

551155大佬是一个个事件类型进行解析。当你熟悉事件类型后,你可以选择对应事件类型,快速定位自己要。而不是在“全部”里一条条找。减少视觉疲劳,节约编辑时间。

三种单位事件所对应的事件稍有不同,如下表:

Dies
单位死亡
共有
Decays
单位腐烂
共有
Changes owner
改变单位所属
共有
Damaged
单位接受伤害
指定单位事件
Gains a level
单位提升一个等级
共有
Learns a Skill
单位学习一个技能
共有
Becomes revivable
单位变为可重生的
共有
Uses an item
单位使用一个物品
共有
Acquires an item
单位获得一个物品
共有
Loses an item
单位掉落一个物品
共有
Sells a unit
出售一个单位
共有
Sells an item (from shop)
购买物品(从商店)
共有
Pawns an item (to shop)
出售物品(到商店)
共有
Is attacked
单位被攻击
共有
Is rescued
单位被营救
共有
Selected
单位被选择
指定单位事件
Deselected
单位被取消选择
指定单位事件
Spawns a summoned unit
召唤一个单位
共有
Begins channeling an alility
准备施放技能
共有
Begins casting an ability
开始施放技能
共有
Stops casting an ability
停止施放技能
共有
Starts the effect of an ability
发动技能效果
共有
Finishes casting an ability
技能施放结束
共有
Is loaded into a transport
被运输机装载的单位
共有
Acquired target
获得一个目标
指定单位事件
Target in range
获得攻击范围内目标
指定单位事件
Begins training a unit
开始训练的单位
共有
Cancels training a unit
取消训练的单位
共有
Finishes training a unit
完成训练的单位
共有
Begins construction
开始建造的单位
玩家/一般单位事件
Cancels construction
取消建造的单位
玩家/一般单位事件
Finishes construction
完成建筑的单位
玩家/一般单位事件
Begins reviving
正在复活的单位
共有
Cancels reviving
取消复活的单位
共有
Finishes reviving
完成复活的单位
共有
Begins an upgrade
正在升级的单位
共有
Cancels an upgrade
取消升级的单位
共有
Finishes an upgrade
完成升级的单位
共有
Begins research
正在研究的单位
共有
Cancels research
取消研究的单位
共有
Finishes research
完成研究的单位
共有
Is issued an order targeting an object
单位目标是物品的命令
共有
Is issued an order targeting a point
单位目标是点的命令
共有
Is issued an order with no target
发布没有目标的命令
共有

在制作触发的时候,我们先要考虑到,自己需要在什么样的情况下运行这个触发器,然后再有选择的添加事件。

例题1:如何让敌对的某某玩家(玩家6)某某单位(圣骑士0000)死亡后执行游戏胜利

这里分别对应三种事件来说明各自的用法:

1、指定单位事件:

[trigger]

事件:
(圣骑士 0000) 死亡
条件:
(死亡单位)所属是(玩家6)
动作:
游戏-设置 (凶手单位)所属玩家 胜利

[/trigger]

2、玩家单位事件
[trigger]
事件:
(玩家6)的单位死亡
条件:
(死亡单位)是(圣骑士0000)
动作:
游戏-设置 (凶手单位)所属玩家 胜利
[/trigger]

3、一般单位事件
[trigger]
事件:
任意单位死亡
条件:
(死亡单位)是(圣骑士 0000)
(死亡单位)所属是(玩家6 )
动作:
游戏-设置 (凶手单位)所属玩家 胜利
[/trigger]

DarkSheep:上面的三个触发,通过三种不同的形式实现了同一个结果。但是记住作者的话:如何做出准确的判断和更加简洁的触发器是本教程的主要目的。


“单位进入区域”和“单位离开区域”这个就很好理解了,以练功房为例简单说明。

例题2:当(大法师0001)进入(区域0000)的时候开始刷兵,单位离开(区域0000)的时候停止刷兵-练功房区域。

1、 单位进入区域
[trigger]
事件:
单位进入(区域0000)
条件:
触发单位 等于 (大法师0001)
动作:
运行触发器 <刷兵>
[/trigger]

2、 单位离开区域
[trigger]
事件:
单位离开(区域0000)
条件:
触发单位 等于 (大法师0001)
动作:
关闭触发器 <刷兵>
[/trigger]

3、 刷兵<暂时只简单的调用一下,后面会细说> PS:这里的刷兵事件触发器默认是初始关闭的。
[trigger]
事件:
每2秒触发事件
条件:

动作:
创建1个 步兵 在 区域0000 的中心点,面向 默认的建筑角度
[/trigger]

 

DarkSheep:这可能是你的第一个触发。所以,我将它写详细来。

1、准备工作:打开地形面板,“画”一圈草。打开区域面板,来一块矩形区域。打开单位面板,放只大法师。

2、按照551155大佬的做法,新建3个触发,并按F2重命名。PS:触发名字最好用英文或者拼音。

—-触发1:Jinru—

事件
单位 – 任意单位进入 矩形区域 000 <预设>
条件
(触发单位) 等于 大魔法师 0000 <预设>
动作
触发器 – 运行 Shuabing <预设> (检查条件)

—-触发2:LiKai—-

事件
单位 – 任意单位离开 矩形区域 000 <预设>
条件
(触发单位) 等于 大魔法师 0000 <预设>
动作
触发器 – 关闭 Shuabing <预设>

但是第3个触发你得改动下:

—-触发3:Shuabing—-

事件
时间 – 每当游戏逝去 2.00 秒
条件
动作
单位 – 创建 1 个 步兵 给 中立敌对 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度

并且将它设置为默认关闭。你不关闭,那大法师都不用进入区域,该区域每隔2秒刷1个小兵。

然后Ctrl+F9测试地图。测试结果是:每当大法师进入这个区域,过2秒,会在中心位置刷出1个小兵。但是注意,只会刷出1个。这和我们的触发条件有关系,我们的触发条件是:大法师进入区域。所以,只要你离开区域再进入,那么又会刷出1个步兵。要做出一般魔兽地图的练功房系统,我们继续往下学吧。


“接近指定单位事件”就像前面所说,需要用到具体的可指定的单位才可以使用。

例题3:(大法师0001)靠近(圣骑士0000)500码内会召唤水元素。

[trigger]

事件:
单位进入500 范围距离 (圣骑士0000)
条件:
触发单位 等于 (大法师0001)
动作:
单位 – 对 (触发单位) 发布 人族大法师 – 召唤水元素 命令

[/trigger]

DarkSheep:做任务触发经常用到这个。当英雄靠近某个单位时,就触发任务事件。这个触发案例需要注意的是:大法师一定要手动或者自动学了召唤水元素技能,靠近圣骑士才会自动施放。所以,建议改成:

事件
单位 – 任意单位进入 500.00 以 圣骑士 0002 <预设> 为中心的范围内
条件
(触发单位) 等于 大魔法师 0000 <预设>
动作
英雄 – 命令 (触发单位) 学习技能 人族大法师 – 召唤水元素
单位 – 对 (触发单位) 发布 人族大法师 – 召唤水元素 命令


“单位生命值变化”和“单位法力值变量”这个同样属于“指定单位”事件。

例题4:当(大法师0001)生命值少于100的时候使物品“生命药水”。

[trigger]
事件:
单位 – (大法师0001)的生命值变为小于 100.00
条件:

动作:
英雄 – 命令 (大法师0001) 使用 (大法师0001) 所持有的 生命药水
[/trigger]

DarkSheep:目测做BOSS AI用到这个。当BOSS血量低于XX,自动使用血瓶。

第一节 完


第二节 ☆ 玩家事件

Player – Chat Message
聊天信息
Player – Cinematic Skipped
按下ESC
Player – Selection Event
选择事件
Player – Keyboard Event
键盘事件
Player – Properties
属性变化
Player – Alliance Change(Any)
同盟改变 (任何)
Player – Alliance Change(Specific)
同盟改变 (指定)
Player – Victory
胜利
Player – Defeat
失败
Player – Leaves Game
离开游戏

玩家事件就是和玩家相关的事件(废话—。—)。

这个在制作事件的时候需要判断事件事件发生源是哪一个,这样才可以正确使用事件;另外玩家事件是针对单一玩家设置的,所以如果你想有几个玩家都可以触发就必须对应每一个需要触发的玩家添加事件。

DarkSheep:几个玩家都可以触发,就是向下面这样,对应每一个需要触发的玩家添加事件。

事件
玩家 – 玩家1(红色) 选择 一个单位
玩家 – 玩家2(蓝色) 选择 一个单位
玩家 – 玩家3(青色) 选择 一个单位
玩家 – 玩家4(紫色) 选择 一个单位

聊天信息事件,是指捕获的玩家输入的信息,一般像输入密技之类都属于聊天信息;但这里需要说明的是,官方默认的密技是无法通过聊天信息捕获的,因此无法防止,也就是像现在大家为了防作弊而制作的各种各样的演示的原因。

聊天信息捕获有两种方式,一是完全匹配,二是部分匹配,以实例说明:

例5:让玩家输入GO来执行增加1000金币。

1、完全匹配
[trigger]
事件:
玩家 – 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 完全匹配
条件:
动作:
玩家 – 增加 1000 (触发玩家) 的 现有黄金
[/trigger]

2、 部分匹配
[trigger]
事件:
玩家 – 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 包含字符串
条件
动作:
玩家 – 增加 1000 (触发玩家) 的 现有黄金
[/trigger]

PS:这两个触发器运行会有什么不同呢?完全匹配的需要你输入的就是GO,而不能附带其它任何多余的字符,而包含字符串的话,类似于GOO或者GGO之类的,都会执行。


按下ESC键和键盘事件同属于按键事件,默认的键盘事件可以按方向键上下左右来触发,键盘事件和按下ESC事件的区别还在于,可以分别捕获按下和放开按键事件。

例6:按下ESC键来显示玩家当前的金币数

[trigger]
事件:
玩家 – 玩家1(红色) 按下Esc键
条件:
动作:
游戏 – 对 (所有玩家) 发送文本信息: (转换 ((触发玩家) 现有黄金) 为字符串)
[/trigger]

PS:因为显示出来的文本必须是字符串,所以需要把属于整数的黄金数转换成字符串(后面详解)


选择事件,就是玩家选择了一个单位后执行的事件,选择事件包括选择和取消选择两个类型。

例7:使玩家锁定选择(血魔法师0003),无法选择其它单位<默认设置已选择该单位>

[trigger]
事件:
玩家 – 玩家1(红色) 取消选择 一个单位
条件:
(触发单位) 等于 血魔法师 0003 <预设>
动作:
选择 – 选择 (触发单位) 对 (触发玩家)
[/trigger]


属性变化事件,是指玩家的某个属性发生改变,来执行触发,属性类型有如下:

现有黄金
现有木材
剩余可用英雄
金钱维持费率
木材维修费率
总黄金采集量
总木材采集量
已使用人口数
可使用人口数
最大人口数
游戏得分

 

 

例8:当中立敌对的(兵步)只有2个以后,再次刷新10个兵步,步兵占用人口数2。

[trigger]
事件:
玩家 – 玩家1(红色) 的 已使用人口数 变为 小于或等于 4.00
条件:
动作:
单位 – 创建 10 个 步兵 给 (触发玩家) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
[/trigger]

PS:这里需要说明一下,属性必须是发生变化的时候才会触发的;一般情况下,我们做地图会先选择英雄,然后就会占用5个人口(默认情况下),这个时候属性就已经发生变化了,不过进行比较的话,就需要改成小于或等于5才会触发。


同盟改变(任何)/ 同盟改变(指定),是基于同盟关系发生变化而触发事件,前者只需要任何一项关系发生改变就会执行,后者需要在特定的情况下才会执行,同盟关系如下:

结盟(不侵犯)
共享视野
共享单位
共享完全控制权
共享经验
盟友魔法锁定
救援请求
救援回应
例9:当玩家1(红色)对玩家2(蓝色)设置结盟(不侵犯)后奖励玩家1(红色)1000金币。
[trigger]
事件:
玩家 – 玩家1(红色) 更改 结盟(不侵犯) 设置
条件:
((触发玩家) 对 玩家2(蓝色) 开启 结盟(不侵犯)) 等于 TRUE
动作:
玩家 – 增加 1000 玩家1(红色) 的 现有黄金
[/trigger]
PS:这里需要说明的是,同盟改变是单向设置,也就是说,如果玩家1(红色)对玩家2(蓝色)设置结盟,而玩家2(蓝色)没有设置结盟;那结果就是玩家1(红色)的单位不会主动攻击玩家2(蓝色)的单位,而玩家2(蓝色)还会主动攻击玩家1(红色)的单位,因此在设置结盟的时候必须要双方都进行操作。

游戏胜利 / 游戏失败 / 离开游戏

这三个都是玩家的游戏状态,都是单独执行的,很容易进行判断。

例10:当玩家2(蓝色)离开游戏后,把所有金币给玩家1(红色)

[trigger]
事件:
玩家 – 玩家2(蓝色) 离开游戏
条件:
动作:
玩家 – 增加 (玩家2(蓝色) 现有黄金) 玩家1(红色) 的 现有黄金
[/trigger]

PS:在一些地图的设置中,当其中一个玩家离开就把金钱分给其它在线的玩家,就个只需要把离开玩家的金币除以在线的玩家数量,再把这个值给所有在线玩家(利用玩家组动作,后详)。

第二节 完


第三节 ☆ 游戏事件&普通事件&时间事件&可破坏物事件

Game – Time Of Day
游戏中时间变化
Game – Value Of Real Variable
实数变量Real数值变化
Game – Game Load
游戏读取
Game – Game Save
游戏保存
Game – Hero Abilities Button Clicked
按下英雄升级技能按钮
Game – Build Structure Button Clicked
按下建造按钮

游戏中的时间事件通过游戏时间流逝来进行判断,可利用不同时间做不同事。而实数变量,操作方式和时间事件是一样的,区别在于,必须创建一个实数变量才可以使用这个事件,而且必须要在游戏中制造改变这个变量的事件,就像游戏时间改变会触发游戏时间变化事件一样。

例11:当每天6点和18点的时候,给玩家1发放500金币的工钱。
[trigger]
事件:
游戏 – 游戏时间变为 等于 6.00
游戏 – 游戏时间变为 等于 18.00
条件:
动作:
玩家 – 增加 500 玩家1(红色) 的 现有黄金
[/trigger]

PS:这里用到了两个事件,前面已经提过,事件是并行的,所以这两个事件是会分别触发增加玩家黄金的事件


游戏读取&游戏保存&按下英雄升级技能&按钮按下建造按钮

这几个事件基本上和现在的主流事件无关,适用于单机游戏时候;前两者就不用介绍了,看字面意思应该就能了解。而后两者,分别是英雄学习技能的那个红色十字被按下和农民建造按钮被按下,这两个都无法捕获触发单位,因此这几个事件可以忽略掉了。

Map Initialization
地图初始化

 

普通事件只有地图初始化事件,就是在读取地图的最后阶段执行的事件,一般作用于对变量进行赋值等并不涉及改变游戏数据的动作(比如创建多面版之类的不会被执行)。
Time – Time Elapsed
时间流逝经过
Time – Periodic Event
周期性事件
Time – Timer Expires
计时器过期

 

时间流逝事件,在正式进入地图以后开始计时,在一定程度上可以当成对游戏事件的补充,比如将时间经过设为0.01的话,就可以执行一些初始化操作而不受地图初始化的一些限制。周期性事件和时间流逝事件的区别在于,当周期性事件定义的时间到达的时候,会执行触发并重新计时,而时间流逝事件只会执行一次。
例12:每隔10秒创建3个骑士在(区域000),并命令他们攻击移动到(区域001)
[trigger]
事件:
时间 – 每 10.00 秒触发事件
条件:
动作:
For循环整数A从 1 到 3, 做动作
Loop – 动作
单位 – 创建 1 个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
单位 – 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)
[/trigger]
PS:这里用到了FOR循环语句,执行3次同样的动作,这样可以针对每一个创建的单位发布命令而不需要担心因为数量过多而有些单位没有获得命令(超过12只时)。
DarkSheep:这个触发其实在后面也会讲到。你可以试着如下改动,看看效果:
事件:
时间 – 每 10.00 秒触发事件
条件:
动作:
For循环整数A从 1 到 3, 做动作
Loop – 动作
单位 – 创建 3个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
单位 – 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)
测试结果:一共会创造9个骑士,但是只有最后创建的3个会移动到目标区域。所以上面这种触发写法是存在问题的。

Destructible – Destructible Dies
可破坏物体被摧毁
Destructible – Destructible Within Region Dies
在区域中被摧毁

 

可破坏物,就像树、门之类的装饰物,有一定生命值,会被破坏。
例13:当区域001内的夏树墙被摧毁后(区域判断上限为64),5秒后复活。
[trigger]
事件:
可破坏物 – 可破坏物在 矩形区域 001 <预设> 内死亡
条件:
((死亡的可破坏物) 的类型) 等于 夏季树木
动作:
等待 5.00 秒
可破坏物 – 复活 (死亡的可破坏物) 并设置生命值为 ((死亡的可破坏物) 的最大生命值) , 显示 复活动画 [/trigger]
PS:这里利用了等待语句,但如果死亡的可破坏物过多可能会造成无法复活或无法判断的情况,还有个方式就是利用周期性事件来执行刷新动作,利用选区范围内的可破坏物来复活(后详)。
第三节 完

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.