触发器是事件编辑器的精髓所在,游戏中多样的任务、不同的事件、胜利/失败的条件、天气的变化等等这些全部都是触发器的功劳。
触发器由三个部分组成,事件、条件、动作。
事件:或称为触发事件,顾名思义,就是当某个事件发生的时候就运行触发器。
条件:判断是否达到指定的条件,如果没有达到条件将不执行动作。可以留空,表示直接执行动作。一般来说,条件越多越容易出错,所以尽量只使用一两个条件。
动作:条件通过后所要做的事情。
我用个简单例子来说明,比如一个英雄进入地区后游戏胜利,那么就要这样设置。
事件:一个单位进入地区
条件:判断单位是一个英雄为Turn
动作:游戏胜利。
在每个新建地图中都会有个叫做初始化的类,其中有个叫做对战初始化的触发器,它设定了每张地图默认的初始设置,其中包括:
Use melee time of day (for all players) - 启用默认的游戏中开始时间。
Limits Heros to 1 per Hero-type (for all players) - 限制玩家同一种英雄只能生产一名。
Hero trained Heroes a Scroll of Town Portal (for all players) - 给英雄一个传送卷轴。
Set starting resources (for all players) - 设置起始资源,给每个玩家分配一开始拥有的资源。
Remove creeps and critters from used start locations (for all players) - 移除开始点附近的野生单位、障碍物等。
Create starting units (for all players) - 在开始点上创建玩家开始对战游戏需要的主基地和工人
Run melee AI scripts - 让所有计算机玩家执行对战游戏人工智能。
Enforce victory/defeat conditions - 使用默认的胜利失败条件,所有建筑物被破坏即失败。
如果不需要,删除掉它们就可以了,事实上大部分RPG地图都不需要这些条件。
触发器的所有指令都是英文的,不过没关系,我专门为此制作了一个中英对照表,并在其中做了简要说明。请参阅附录:触发器中英对照表。
除此之外,触发器中还有很多函数,例如:Last Created Unit,最后创建的单位。合理运用这些函数也是非常重要的,在触发器的使用中将会大量使用到这些函数。
触发器的使用是千变万化的,本章我介绍一些常见的例子,希望你能够举一反三,了解触发器的使用。
注意:类可以用中文命名,注释也可以用中文命名,但触发器不能用中文命名!
这里要讲到函数和变量的运用。编辑器里还有许多内置的函数,与变量不同,函数是固定的不能够改变,它有一个最大的特点就是所有函数都有返回值,例如:Last Created Unit返回最后创建的单位;Triggering Unit返回触发此触发器的单位等等。现在我就为你介绍函数和变量的使用方法。
很多RPG地图都可以让你选择英雄,并且英雄死亡的时候能够复活,这是个非常实用的例子,很多地方你都能运用,但要怎么做呢?
首先打开变量编辑器新建一个变量PlayerUnit,类型设置为单位。可参阅基础知识:变量。
然后在地形编辑器中选择地区面板,添加三块区域,默认名字为地区 000、地区 001、地区 002。
在单位面板上选择中立无敌意,然后在地区 001和地区 002上各放置一个英雄,然后选择玩家 1 (红色),放置一个小精灵。
在触发事件编辑器里增加一个新触发器,就命名为ChooseHero1,并为加入指令。
触发事件
单位 - Unit Enters Region
如果单位进入地区1就运行触发器
单击Region出现以下对话框,选择地区 001。
两次确定后完成事件的设置,现在新建一个条件。
条件
Unit-Type Comparison
判断触发的单位类型是否是一个小精灵。
点击步兵出现单位类型对话框,选择暗夜精灵族,再选择小精灵后确定。
现在就要设置动作了,也就是给玩家一个英雄单位,并将这个单位储存到变量PlayerUnit中。
动作
单位 - Kill
杀死小精灵,默认(Triggering unit)表示是触发此触发器的单位,也就是小精灵。
单位 - Cearte a Unit
在地区 000当中创建一个英雄给玩家1,如下图修改,(Unit-type of 圣骑士 0000 )这是创建给玩家的单位,单击选择一个单位按钮,然后在地图上单击圣骑士,玩家 1 (红色)表示此单位给玩家1,(Center of 地区 000 )创建位置在地区 000正中,默认的建筑朝向单位面向哪个方向。 Set Variable 这条指令将最后创建的英雄赋值给变量PlayerUnit。选择变量为PlayerUnit,然后将默认函数(Triggering unit)改为(Last created unit),(Triggering unit)表示触发此触发器的单位,也就是已经被杀死的小精灵,(Last created unit)表示最后创建的英雄。 特效 - Create Special Effect On Unit 创建一个传送的特效给PlayerUnit,这句仅仅是为了好看。:) 点击Abilities\Spells\NightElf\Blink\BlinkTarget.mdl就能选择特效模型了,同时,这里也用到了变量PlayerUnit。 现在要判断第二个英雄,这很简单,只要复制一份触发器,选择触发器ChooseHero1点复制,然后点粘贴,就有了一份与ChooseHero1相同的触发器。 然后单击复制的触发器,将其改名为ChooseHero2,并修改其中的指令,只用把事件中地区 001修改为地区 002,然后再把Cearte a Unit指令中圣骑士改为山丘之王就可以了,很简单吧。 从上面可以看出,如果你想改变可选择的英雄时,只用修改Cearte a Unit这一条命令中的英雄就行了。运用了变量以后,不管你选择的是那个英雄,只用创建特效给变量PlayerUnit就行了,并且在例二英雄复活的时候我也就可以直接调用PlayerUnit这个变量。 由此可看出,为可能多次运用的对象创建变量是个很好的习惯,合理运用将大大减少你的工作量。 如果你想问,我要做一个多人游戏呢?难到每个人都要设置一次?如果有10个英雄可选,共5个玩家,难道要设置10x5=50个触发器?事实上这个问题很好解决,在这里一个函数起到关键的作用。 首先要把变量PlayerUnit下的数组打上钩,使其成为变量数组。 然后修改单位 - Cearte a Unit,将其中的玩家 1 (红色)改为功能转化 - Convert Player Index To Player,然后点击1,把功能改为游戏 - Number Of Players (如下图),确定。 同样修改Set Variable,变量这时候变成了PlayerUnit [序号]的形式,把序号也改为游戏 - Number Of Players就行了。 游戏 - Number Of Players表示是触发此触发器的玩家的序号,所以Player [游戏 - Number Of Players]就是触发此触发器的玩家,这就使触发器能够自动判断是哪个玩家选择了这个英雄。在调用变量时只用选择数组的序号就行了,比如要调用玩家2的英雄,那么就只用调用对应的变量PlayerUnit[2]就行了。 如果你不想玩家选择相同的英雄呢?只要增加一句: Trigger - Turn off 关闭触发器。 This trigger返回当前触发器,这条指令表示关闭当前触发器,触发器将不会再被触发。这句可以放在动作中任何位置,动作不会因此中止,所以建议放在第一条运行,避免因为没有及时关闭而导致其他玩家再次触发此触发器。 你可以多放几个小精灵在地图上测试。