本羊看了多个的魔兽编辑器触发教程,综合比较,只有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的开端,所有事件都是并行的,也就是说,在多个事件的情况下,只要触发一个事件就会执行触发器。大部分事件可以直接指定,但有部分事件却需要后期添加或者必须要有指定类型的变量才可以添加,后期添加也比较方便,后面会介绍到“动态注册事件”,这里我们先说一下具体的事件内容。还有需要注意到触发的关联性,比如“玩家事件”产生的触发是不可能会有“触发单位”这样的单位函数的,对应的只是“触发玩家”之类的玩家函数,但可以通过一些特殊情况转换,比如可以通过单位组动作的条件来选取玩家的单位,而且“触发单位所属玩家”就是一个很典型的单位事件调用玩家的函数。
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才会触发。
同盟改变(任何)/ 同盟改变(指定),是基于同盟关系发生变化而触发事件,前者只需要任何一项关系发生改变就会执行,后者需要在特定的情况下才会执行,同盟关系如下:
结盟(不侵犯) | 共享视野 | 共享单位 | 共享完全控制权 | 共享经验 | 盟友魔法锁定 | 救援请求 | 救援回应 |
[trigger]
事件:
玩家 - 玩家1(红色) 更改 结盟(不侵犯) 设置
条件:
((触发玩家) 对 玩家2(蓝色) 开启 结盟(不侵犯)) 等于 TRUE
动作:
玩家 - 增加 1000 玩家1(红色) 的 现有黄金
[/trigger]
游戏胜利 / 游戏失败 / 离开游戏
这三个都是玩家的游戏状态,都是单独执行的,很容易进行判断。
例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 |
计时器过期 |
[trigger]
事件:
时间 - 每 10.00 秒触发事件
条件:
动作:
For循环整数A从 1 到 3, 做动作
Loop - 动作
单位 - 创建 1 个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)