魔兽争霸触发器Trigger解析

来源:互联网 发布:sql的select语句总结 编辑:程序博客网 时间:2024/05/01 05:43
第一章 ★ 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 
单位法力变化 

  这里先说明一下“指定单位”的定义,顾名思义,这个需要针对已经存在的可以直接选取的具体的单位;不单单是事件,还包括一些条件和动作;不过不同事件可以用“动态注册”来达到添加事件的目的,而条件和动作可以通过“单位类型”的变量来读取。 
三种单位事件所对应的事件稍有不同,如下表: 
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、指定单位事件: 
 事件:
 (圣骑士 0000) 死亡

 条件:
 (死亡单位)所属是(玩家6)

 动作:
 游戏-设置 (凶手单位)所属玩家 胜利



2、玩家单位事件 
 事件:
 (玩家6)的单位死亡

 条件:
 (死亡单位)是(圣骑士0000)

 动作:
 游戏-设置 (凶手单位)所属玩家 胜利



3、一般单位事件 
 事件:
 任意单位死亡

 条件:
 (死亡单位)是(圣骑士 0000)
 (死亡单位)所属是(玩家6 )

 动作:
 游戏-设置 (凶手单位)所属玩家 胜利




“单位进入区域”和“单位离开区域”这个就很好理解了,以练功房为例简单说明。 
例题2:当(大法师0001)进入(区域0000)的时候开始刷兵,单位离开(区域0000)的时候停止刷兵-练功房区域。 
1、 单位进入区域 
 事件:
 单位进入(区域0000)

 条件:
 触发单位 等于 (大法师0001)

 动作:
 运行触发器 <刷兵>



2、 单位离开区域 
 事件:
 单位离开(区域0000)

 条件:
 触发单位 等于 (大法师0001)

 动作:
 关闭触发器 <刷兵>



3、 刷兵<暂时只简单的调用一下,后面会细说> 
 事件:
 每2秒触发事件

 条件:
 无

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



PS:这里的刷兵事件触发器默认是初始关闭的。 

“接近指定单位事件”就像前面所说,需要用到具体的可指定的单位才可以使用。 
例题3:(大法师0001)靠近(圣骑士0000)500码内会召唤水元素。 
 事件:
 单位进入500 范围距离 (圣骑士0000)

 条件:
 触发单位 等于 (大法师0001)

 动作:
 单位 - 对 (触发单位) 发布 人族大法师 - 召唤水元素 命令




“单位生命值变化”和“单位法力值变量”这个同样属于“指定单位”事件。 
例题4:当(大法师0001)生命值少于100的时候使物品“生命药水”。 
 事件:
 单位 - (大法师0001)的生命值变为小于 100.00

 条件:
 略

 动作:

 英雄 - 命令 (大法师0001) 使用 (大法师0001) 所持有的 生命药水


第二节 ☆ 玩家事件 

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 
离开游戏 

  玩家事件就是和玩家相关的事件(废话—。—),这个在制作事件的时候需要判断事件事件发生源是哪一个,这样才可以正确使用事件;另外玩家事件是针对单一玩家设置的,所以如果你想有几个玩家都可以触发就必须对应每一个需要触发的玩家添加事件。 
  聊天信息事件,是指捕获的玩家输入的信息,一般像输入密技之类都属于聊天信息;但这里需要说明的是,官方默认的密技是无法通过聊天信息捕获的,因此无法防止,也就是像现在大家为了防作弊而制作的各种各样的演示的原因。 
  聊天信息捕获有两种方式,一是完全匹配,二是部分匹配,以实例说明: 
  例5:让玩家输入GO来执行增加1000金币。 
1、完全匹配 
 事件:
 玩家 - 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 完全匹配

 条件:
 动作:
 玩家 - 增加 1000 (触发玩家) 的 现有黄金



2、 部分匹配 
 事件:
 玩家 - 玩家1(红色) 输入的聊天信息包含 GO ,匹配方式: 包含字符串

 条件
 动作:
 玩家 - 增加 1000 (触发玩家) 的 现有黄金



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

  按下ESC键和键盘事件同属于按键事件,默认的键盘事件可以按方向键上下左右来触发,键盘事件和按下ESC事件的区别还在于,可以分别捕获按下和放开按键事件。 
  例6:按下ESC键来显示玩家当前的金币数 
 事件:
 玩家 - 玩家1(红色) 按下Esc键

 条件:
 动作:
 游戏 - 对 (所有玩家) 发送文本信息: (转换 ((触发玩家) 现有黄金) 为字符串)



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

  选择事件,就是玩家选择了一个单位后执行的事件,选择事件包括选择和取消选择两个类型。 
  例7:使玩家锁定选择(血魔法师0003),无法选择其它单位<默认设置已选择该单位> 
 事件:
 玩家 - 玩家1(红色) 取消选择 一个单位

 条件:
 (触发单位) 等于 血魔法师 0003 <预设>

 动作:
 选择 - 选择 (触发单位) 对 (触发玩家)




  属性变化事件,是指玩家的某个属性发生改变,来执行触发,属性类型有如下: 
现有黄金 
现有木材 
剩余可用英雄 
金钱维持费率 
木材维修费率 
总黄金采集量 
总木材采集量 
已使用人口数 
可使用人口数 
最大人口数 
游戏得分 

例8:当中立敌对的(兵步)只有2个以后,再次刷新10个兵步,步兵占用人口数2。 
 事件:
 玩家 - 玩家1(红色) 的 已使用人口数 变为 小于或等于 4.00

 条件:
 动作:
 单位 - 创建 10 个 步兵 给 (触发玩家) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度



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

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

结盟(不侵犯) 
共享视野 
共享单位 
共享完全控制权 
共享经验 
盟友魔法锁定 
救援请求 
救援回应 

  例9:当玩家1(红色)对玩家2(蓝色)设置结盟(不侵犯)后奖励玩家1(红色)1000金币。 
 事件:
 玩家 - 玩家1(红色) 更改 结盟(不侵犯) 设置

 条件:
 ((触发玩家) 对 玩家2(蓝色) 开启 结盟(不侵犯)) 等于 TRUE

 动作:
 玩家 - 增加 1000 玩家1(红色) 的 现有黄金



  PS:这里需要说明的是,同盟改变是单向设置,也就是说,如果玩家1(红色)对玩家2(蓝色)设置结盟,而玩家2(蓝色)没有设置结盟;那结果就是玩家1(红色)的单位不会主动攻击玩家2(蓝色)的单位,而玩家2(蓝色)还会主动攻击玩家1(红色)的单位,因此在设置结盟的时候必须要双方都进行操作。 

游戏胜利 / 游戏失败 / 离开游戏 
这三个都是玩家的游戏状态,都是单独执行的,很容易进行判断。 
例10:当玩家2(蓝色)离开游戏后,把所有金币给玩家1(红色) 
 事件:
 玩家 - 玩家2(蓝色) 离开游戏

 条件:
 动作:
 玩家 - 增加 (玩家2(蓝色) 现有黄金) 玩家1(红色) 的 现有黄金



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金币的工钱。 
 事件:
 游戏 - 游戏时间变为 等于 6.00
 游戏 - 游戏时间变为 等于 18.00

 条件:
 动作:
 玩家 - 增加 500 玩家1(红色) 的 现有黄金



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

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

Map Initialization 
地图初始化 

  普通事件只有地图初始化事件,就是在读取地图的最后阶段执行的事件,一般作用于对变量进行赋值等并不涉及改变游戏数据的动作(比如创建多面版之类的不会被执行)。 

Time - Time Elapsed 
时间流逝经过 
Time - Periodic Event 
周期性事件 
Time - Timer Expires 
计时器过期 
  时间流逝事件,在正式进入地图以后开始计时,在一定程度上可以当成对游戏事件的补充,比如将时间经过设为0.01的话,就可以执行一些初始化操作而不受地图初始化的一些限制。周期性事件和时间流逝事件的区别在于,当周期性事件定义的时间到达的时候,会执行触发并重新计时,而时间流逝事件只会执行一次。 
  例12:每隔10秒创建3个骑士在(区域000),并命令他们攻击移动到(区域001) 
 事件:
 时间 - 每 10.00 秒触发事件

 条件:
 动作:
 For循环整数A从 1 到 3, 做动作
 Loop - 动作
 单位 - 创建 1 个 骑士 给 玩家1(红色) 在 (矩形区域 000 <预设> 的中心点) ,面向角度为 默认建筑朝向 度
 单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 001 <预设> 的中心点)






  PS:这里用到了FOR循环语句,执行3次同样的动作,这样可以针对每一个创建的单位发布命令而不需要担心因为数量过多而有些单位没有获得命令(超过12只时)。 
Destructible - Destructible Dies 
可破坏物体被摧毁 
Destructible - Destructible Within Region Dies 
在区域中被摧毁 

  可破坏物,就像树、门之类的装饰物,有一定生命值,会被破坏。 
  例13:当区域001内的夏树墙被摧毁后(区域判断上限为64),5秒后复活。 
 事件:
 可破坏物 - 可破坏物在 矩形区域 001 <预设> 内死亡

 条件:
 ((死亡的可破坏物) 的类型) 等于 夏季树木

 动作:
 等待 5.00 秒
 可破坏物 - 复活 (死亡的可破坏物) 并设置生命值为 ((死亡的可破坏物) 的最大生命值) , 显示 复活动画



  PS:这里利用了等待语句,但如果死亡的可破坏物过多可能会造成无法复活或无法判断的情况,还有个方式就是利用周期性事件来执行刷新动作,利用选区范围内的可破坏物来复活(后详)。 

第二章 ★ Triggert条件 
  
  Trigger是由事件、条件、动作组成。条件是执行动作之前的门槛,正确的使用条件,对增加触发执行准确率有至关重要的影响。一个触发器可以添加多个条件,默认情况下条件是串行的(AND),也就是说,必须全部达成这些条件才会开始执行动作;也可以设定并行(OR),只需要达成一个条件就会执行动作。条件的内容取值于触发事件相关的函数,就像如果是玩家事件,就无法直接调用“触发单位”的函数。 
  说判断函数之前,先说一下“变量”,变量可以通过赋值来保存和调用数据。很多人可能对“变量”有些理解,却不知道“变量”可以调用哪一些数据。通过下面对一些条件的分析,大家应该可以比较清楚的理解“变量”可使用的一些类型。如果变量是布尔值,那么,这个变量的值就是TRUE(真)或者FALSE(假);如果变量是单位,那么这个值就是“指定单位”,已存在的单位;如果变量是单位类型,这个值就可以赋值我们在物体编辑器里设定的单位类型的数据,然后通过调用这些变量来创建新的单位。变量组是对变量的扩展方式,同一个变量组的变量类型相同,变量组的格式是“变量名[下标值]”,下标值必须为整数,每一个变量组中的变量都是独立的。

第一节 ☆ 布尔值 
Boolean Comparison
布尔值Boolean判断

  布尔值采用TRUE(真)FALSE(假)来进行判断,同时也可以对两个不同数据的比较进行判断,也就是说双重判断。布尔值包含了所有非对称(同类)比较的默认函数,涉及范围非常之广,因此当你发现其它条件中没有自己需要的时候,就要仔细查找布尔值的条件,很可能就找到你要的。因为布尔值的函数太多,所以我就不全部帖出来了,只取几个重要的做一些例子。 
  单位类别检查,这个就是检查单位的分类,最常用的就是判断单位是否英雄。 

  例14:如果玩家1的英雄死亡,那么就让这个英雄在玩家1的初始地点复活。 
 事件:
 单位 - 玩家1(红色) 的单位 死亡

 条件:
 ((触发单位) 是 英雄) 等于 TRUE

 动作:
 英雄 - 立即复活 (触发单位) 在 (玩家1(红色) 的游戏开始位置) , 显示 复活动画



PS:这只是一个简单的例子,具体要判断的内容是会比较丰富的,如下例。 

  例15:在(区域000内)的(玩家1)的(同盟,包含玩家1)的(英雄)死亡后复活在(各自的初始地点)。 
 事件:
 单位 - 任意单位 死亡

 条件:
 ((触发单位) 是 英雄) 等于 TRUE
 (地区 000 <预设> 内存在 (触发单位)) 等于 TRUE
 ((触发玩家) 是 玩家1(红色) 的盟友) 等于 TRUE

 动作:
 英雄 - 立即复活 (触发单位) 在 (((触发单位) 的所有者) 的游戏开始位置) , 显示 复活动画

第二节 ☆ 单位&单位类型

  单位和单位类型是两个不同的概念,单位就是“指定单位”,具体化存在的单位;单位类型就是游戏中已设定的数据,可用来创建单位或判断条件。 
  先说一下单位,前面已经介绍过,单位的函数(设定好的数据调用方式)必须通过“单位事件”才可以调用,而且不同的单位事件对应不同的单位函数。除了一个总而概括的“触发单位”可以替代大部分的单位函数以外,跟据事件的不同,可调用的单位函数也是不同的。另外,在动作中也同样需要调用这些函数来执行动作。单位函数如下表: 

Last Created Unit 
最后一个创造的单位 
Last Restored Unit 
最后一个恢复的单位 
Last Replaced Unit 
最后一个代替的单位 
Last Haunted Gold Mine 
最后一个闹鬼金矿 
Picked Unit 
选择的单位 
Random Unit From Unit Group 
从单位组随机选择的单位 
事件响应 - Attacked Unit 
完成攻击的单位 
事件响应 - Attacking Unit 
正在攻击的单位 
事件响应 - Buying Unit 
正在购买的单位 
事件响应 - Cancelled Structure 
取消的建筑 
事件响应 - Casting Unit 
抛投的单位 
事件响应 - Constructing Structure 
建造中的建筑 
事件响应 - Constructed Structure 
建造完成的建筑 
事件响应 - Decaying 
腐烂 
事件响应 - Dying Unit 
垂死的单位 
事件响应 - Entering Unit 
进入的单位 
事件响应 - Hero Manipulating Item 
使用物品的英雄 
事件响应 - Killing Unit 
杀死单位 
事件响应 - Learning Hero 
学习的英雄 
事件响应 - Learing Unit 
学习的单位 
事件响应 - Leveling Hero 
升级的英雄 
事件响应 - Loading Unit 
装载单位 
事件响应 - Ordered Unit 
命令的单位 
事件响应 - Ownership-Changed Unit 
改变所有权的单位 
事件响应 - Revivable Hero 
可复活的英雄 
事件响应 - Reviving Hero 
复活的英雄 
事件响应 - Selling Unit 
正在卖的单位 
事件响应 - Sold Unit 
完成卖的单位 
事件响应 - Summoned Unit 
召唤的单位 
事件响应 - Summoning Unit 
使用召唤的单位 
事件响应 - Target Unit Of Issued Order 
事件发生顺序的目标单位 
事件响应 - Targeted Unit 
目标单位 
事件响应 - Trained Unit 
训练的单位 
事件响应 - Transporting Unit 
传送的单位 
事件响应 - Triggering Unit 
触发触发器的单位 
  在条件的比较中,我们需要明确一些概念,有些函数就是相对应的。 

  例16:当(剑圣0005)杀死(先知0006)的时候,执行动作复活(先知0006)。 
 事件:
 单位 - 任意单位 死亡

 条件:
 (死亡单位) 等于 先知 0006 <预设>
 (凶手单位) 等于 剑圣 0005 <预设>

 动作:
 英雄 - 立即复活 (死亡单位) 在 ((触发单位) 的位置) , 显示 复活动画



  PS:看看这里有没有什么奇怪的地方呢?应该可以发现,在复活的位置上,我用了“触发单位”,前面已经提到过,“触发单位”是一个通用型的函数,是跟据事件而变化的。在这个触发里,“触发单位”所代表的含义就是“死亡单位”,因为触发的事件是“单位死亡”,这个是相对应的,所以在这个触发中我们所有的“死亡单位”和“触发单位”都是可以互换的。 

  例17:当(先知0006)对(剑圣0005)施放闪电链技能,修改先知力量属性添加10点。 
 事件:
 单位 - 任意单位 开始施放技能

 条件:
 (施法单位) 等于 先知 0006 <预设>
 (技能施放目标) 等于 剑圣 0005 <预设>
 (施放技能) 等于 闪电链

 动作:
 英雄 - 修改 力量 对 (触发单位) : 添加 10 点



  PS:这里应该比较好理解了,同样对于“触发单位”的定位跟据事件,就是“施法单位”,也就是(先知0006)。 

  单位类型的判断就是基于对事件数据和游戏设定数据进行比较,比较常用的是“单位的类型”,就是调用“单位”函数来判断单位类型再进行比较。 

Unit-Type Of Unit 
单位的类型 
Random Creep Unit-Type 
随机的野外单位类型 
Random Neutral Building Unit-Type 

随机的中立建筑单位类型 
转化 - Convert String To Unit-Type 
转化字符串到单位类型 
事件响应 - Trained Unit-Type 
训练的单位类型 


  例18:如果暗影猎手死亡,奖励凶手单位所属的玩家1000金币。 
 事件:
 单位 - 任意单位 死亡

 条件:
 ((死亡单位) 的类型) 等于 暗影猎手

 动作:
 玩家 - 增加 1000 ((凶手单位) 的所有者) 的 现有黄金


第三节 ☆ 玩家&玩家颜色&玩家游戏状态&玩家控制者


  玩家函数并不多,“选取的玩家”和“匹配的玩家”在后面的“玩家组”动作中会使用到;而转化索引就是把整数转换成玩家索引,在Trigger是从1开始到12分别是玩家,13是中立敌对,14是中立受害,15是中立特殊,16是中立被动。玩家索引在多人游戏中调用的很频繁,主要作用于变量组的应用。玩家函数列表如下: 
Picked Player
选取的玩家
Matching player
匹配的玩家
Owner Of Unit
单位所属的玩家
Owner Of Item
物品所属的玩家
Random Player From Player Group
玩家组里的随机玩家
转化 - Convert Player Index To Player
转化索引到玩家
事件响应 - Previous Owner
变换前的玩家
事件响应 - Triggering Player
触发玩家
排行榜 - Player In Position
排行榜指定位置的玩家
  关于“选取的玩家”和前面“选取的单位”都是在动作,“玩家组”和“单位组”中使用(在后面动作部分具体介绍),一般最常用的是“单位所属玩家”,这里的“单位”就是调用“单位函数”的。 

  例19:当玩家1(红色)的单位杀死玩家2(蓝色)的英雄时,奖励玩家1(红色)1000金币。
 事件:
 单位 - 任意单位 死亡

 条件:
 ((凶手单位) 的所有者) 等于 玩家1(红色)
 ((触发单位) 的所有者) 等于 玩家2(蓝色)
 ((触发单位) 是 英雄) 等于 TRUE

 动作:
 玩家 - 增加 1000 ((凶手单位) 的所有者) 的 现有黄金




  有很多人想知道怎么输入密码得到隐藏英雄;这,其实很简单。如果想多个玩家都可以获得,就要多添加几个事件才可以。 
例20:当玩家1(红色)输入“SS”,创建一个“巫妖”给玩家1(红色)。
 事件:
 玩家 - 玩家1(红色) 输入的聊天信息包含 SS ,匹配方式: 完全匹配

 条件:
 略

 动作:
 单位 - 创建 1 个 巫妖 给 (触发玩家) 在 ((触发玩家) 的游戏开始位置) ,面向角度为 默认建筑朝向 度



  玩家颜色的比较用得不多,实际上感觉用这个比较反而不如直接调用玩家函数。而玩家游戏状态和玩家控制者在“玩家组”的动作中应用很多,一般是做为判断是否在线或者是否由玩家或电脑在控制。这里就略过了,以后在“玩家组”动作进行详细解说。


第四节 ☆ 物品&物品分类&物品类型


  同单位一样,物品和物品类型分别是指存在的物品(指定物品)和物品类型的数据,而物品分类是指“可充的”或者“人造的”之类的归类,每个物品都可以调整分类。物品的函数表如下: 
Last Created Item 
最后一个创造的物品 
Last Dropped Item 
最后一个掉落的物品 
Random Item In Region 
指定区域上的随机物品 
Random Item In Region Matching Condition 
指定区域上的随机物品并匹配条件 
Picked Item 
精选的物品 
Matching Item 
匹配的物品 
Item Carried By Hero 
英雄携带的第几格物品 
Item Carried By Hero Of Type 
英雄携带的物品类型 
事件响应 - Item Being Manipulated 
被操作物品 
事件响应 - Sold Item 
出售的物品 
事件响应 - Target Item Of Issued Order 
指令目标物品 
事件响应 - Target Item Of Ability Being Cast 
技能施放目标物品 

  事件响应对应的是单位事件中的对物品进行操作的事件,其中“获得物品”“丢弃物品”“使用物品”对应 “被操作物品”(类似于触发物品的意思,比较通用),而“出售物品”和“购买物品”都对应“出售的物品”,一般类似于物品栏移动或者单位发布的右键点击等命令就会用到“指令目标物品”。 

  例21:当英雄获得类型为“可充的”物品的时候,输出提示“获得的物品名字”。 
 事件:
 单位 - 任意单位 获得物品

 条件:
 ((被操作物品) 的分类) 等于 可充

 动作:
 游戏 - 对 (所有玩家) 发送文本信息: ((被操作物品) 的名字)




  例22:当使用物品“装备合成”的时候,如果英雄身上物品栏第一格为“攻击之爪”,第二格为“影子之球”,那合成物品“影子之爪”。 
 事件:
 单位 - 任意单位 获得物品

 条件:
 ((被操作物品) 的类型) 等于 装备合成
 (((触发单位) 物品栏第 1 格的物品) 的类型) 等于 攻击之爪
 (((操作物品的单位) 物品栏第 2 格的物品) 的类型) 等于 影子之球

 动作:
 物品 - 删除 ((操作物品的单位) 物品栏第 1 格的物品)
 物品 - 删除 ((操作物品的单位) 物品栏第 2 格的物品)
 英雄 - 创建 影子之爪 给 (触发单位)



  PS:这里有一个需要注意的地方,我用了“操作物品的单位”和“触发单位”,前面已经说过“触发单位”是通用型的,在很多情况下都可以代替一些函数,这里就是代替“操作物品的单位”。另外,像“装备合成”这个物品,可以利用书本或者符文等不需要判断物品栏是否有空位并直接使用的物品来制作,就不会因为物品栏满而无法实现升级。 

  例23:英雄不管任何一件物品都只充许获得一个,再次捡到就被丢弃 
 事件:
 单位 - 任意单位 获得物品

 条件:
 (被操作物品) 不等于 ((触发单位) 所持有的 ((被操作物品) 的类型))

 动作:
 英雄 - 丢弃 (被操作物品) ,从 (触发单位) 身上



  PS:像这样不管捡到什么物品,都只能捡一个,同样的物品再次捡到就会被丢弃,如果希望特定物品只充许捡一个的话,就再添加一些条件,比如物品分类为“人造”,那么只要是“人造”的物品都只能捡一个。

第五节 ☆ 整数&实数&字符串

  之所以把这三项放在一节里说,是因为它们有一定的共通性,在特定情况下可以相互转换。整数,我想大家都理解吧,标准的阿拉伯数字;实数是带有小数点后两位数的,一般实数的作用于没有精确到整数的数值,比如游戏的时间以及单位的生命等都属于实数;字符串看似和前面两个数值没有关系,但在输出显示文本的时候,整数和实数必须要转换成字符串,而如果字符串的内容是数值的话,同样可以转换成整数或实数。 
  关于这三个分类的函数实在太多了>。<,而且这些内容的应用非常广,所以这里只是举一些实例来说明一些用法,只要你知道标准的数字就是整数,带小数点的就是实数,文本的就是字符串就OK了;达到必要条件的时候相互都可以转换。 

  例24:当英雄“骑士”升级到20级的时候,自动转职成“圣骑士”。 
 事件:
 单位 - 任意单位 提升等级

 条件:
 ((触发单位) 的类型) 等于 骑士
 ((触发单位) 的英雄等级) 等于 20

 动作:
 单位 - 将 (触发单位) 替换为 圣骑士 使用 新单位的最大 生命和魔法
 英雄 - 设置 (最后替换的单位) 的英雄等级为 1 , 隐藏 升级动画



  PS:这里用了一个“单位-替换”动作,会把单位整个替换掉,但物品全部保留,也可以保留生命值百分比。而第二个动作“英雄-设置英雄等级”为1,主要是为了让转职显得更加真实,当然不修改的话,转职后的单位就会是20级;属性方面,和转职后单位自己的设定有关,和转职前的单位的设定无关。 

  例25:当8级英雄大法师-吉安娜死亡以后,等待死亡英雄的等级*2秒的时间,复活死亡的英雄在自己开始位置,然后输出文字“英雄名字+英雄等级+‘已经复活!’” 
 事件:
 单位 - 任意单位 死亡

 条件:
 ((触发单位) 是 英雄) 等于 TRUE

 动作:
 等待 ((转换 ((触发单位) 的等级) 为实数) x 2.00) 秒
 英雄 - 立即复活 (触发单位) 在 (((触发单位) 的所有者) 的游戏开始位置) , 显示 复活动画
 游戏 - 对 (所有玩家) 发送文本信息: (((触发单位) 的称谓) + ((Lv + (转换 ((触发单位) 的英雄等级) 为字符串)) + 已经复活!))



  PS:这里可以看到,因为计算的方式不同,显示的内容也不同。在等待语句中,因为等待是时间,也就是实数,而英雄等级是整数,因此必须要把整数转换成实数,然后再乘以2.00,取得正确的等待时间。而游戏中输出的,是字符串的计算方式;字符串相加的话,就是把字符串连在一起,所以输出的是“吉安娜lv8已经复活!” 

  例26:当中立敌对的单位死亡以后,有30%的机率掉落物品。
 事件:
 单位 - 中立敌对 的单位 死亡

 条件:
 (随机整数,最小值: 1 最大值: 100) 小于或等于 30

 动作:
 物品 - 创建 (等级 8 的随机 任何 物品类型) 在 ((触发单位) 的位置)



  PS:在这个例子里,用到了两个随机,一个是条件中的随机整数(整数函数里面),取一个从1到100之间的数,再判断这个数小于或等于30,也就是达到30%的机率的目的。而后面一个是创建物品动作里面的一个函数,按物品的等级来算,等级8就有机率掉落“国王之冠”“死亡面罩”“能量之书”其中之一。随机数的用处很多,基本上一些带概率的事件都可以利用随机数来做,掌握随机数会让触发更加有意思。

第六节    ☆ AND&OR&废话


  条件的内容的确还有,但一般都很少用到,所以这里就不详细介绍了,大体上和其它的几种条件比较的方式是差不多的,如可破坏物,就是指树或大门之类的,这种比较和单位比较没啥大的区别。再简单介绍一下条件的通配符。
  “AND”就是“与”的意思,使用AND做为通配符连接两个条件的话,是并行的,也就是说,必须完全达成这些条件才可以执行动作,默认采用的是AND方式。“OR”就是“或”的意思,是串行的,OR中的条件只要达成一个,就会执行动作。这两个存在于条件的最下面,“标准”和“多个条件”的区别也只是在条件的数量上,默认的是两个,多个就不限数量了。
  例27:当英雄“牧师”“法师”“祭祀”到10级以上的时候,获得“圣光的预言”,会转职成为“大预言师”。
 事件:
 单位 - 任意单位 获得物品

 条件:
 ((触发单位) 的英雄等级) 大于或等于 10
 ((被操作物品) 的类型) 等于 圣光的预言
 任一条件成立
 条件
 ((触发单位) 的类型) 等于 牧师
 ((触发单位) 的类型) 等于 法师
 ((触发单位) 的类型) 等于 祭祀



 动作:
 单位 - 将 (触发单位) 替换为 大预言师 使用 新单位的最大 生命和魔法
 英雄 - 设置 (最后替换的单位) 的英雄等级为 1 , 隐藏 升级动画



  PS:这里可以看到,前面两个条件,英雄等级和物品类型是默认的,也就是AND的条件模式,必须完全达成,而后面的“任一条件成立”就是OR的模式,只要达成其中之一就可以了。

第三章 ★ Triggert动作 
  
  Trigger是由事件、条件、动作组成。在完成事件的触发,条件的判断以后,才会执行动作;作是触发器执行的步骤,也是触发器的灵魂,我们需要的功能都是由动作来执行。正因为动作的内容如此丰富,就像积木一样由我们自己搭配;因此,对每一块积木的形态的掌握至关重要,不要好高骛远,等你熟悉各条动作的作用,你就可以组合出各种自己需要的触发器。

第一节 ☆ 基础动作 

  这些动作不包括在各个分类中,但对于具体的执行却有至关重要的影响。如下表: 
Do Nothing 
无动作 
不做任何动作 
Comment 
注释 
仅用做分隔及说明 
Custom Script 
定制脚本 
自定义脚本 
Wait 
等待 
等待指定秒数后执行 
Wait (Game-Time) 
等待(游戏时间) 
等待游戏中时间后执行 
Wait For Condition 
等待条件 
等待条件满足后开始计时 
Wait For Sound 
等待音乐 
等待音乐播放完毕后开始计时 
Set Variable 
设置变量 
为变量赋值 
Skip Remaining Actions 
跳过余下动作 
不再执行此动作以下的所有动作
  注释的作用就是对你的触发做一下说明,特别是在动作复杂的情况下,添加一些注释会看得更加清楚,注释不会对动作本身的执行产生任何影响。 
  脚本就是利用触发器的API界面来运行JASS,但受限于API的功能,无法像JASS一样随性的书写,因此这个只能作为辅助动作来使用。 
  等待的话,就是在一定的时间或条件达成以后再执行下面的动作,一般情况下等待语句尽量少用,特别是在各个触发相互调用数据的时候,可能会造成冲突;当然,事情也并没有这么严重,等待的使用频率还是会很高的,必要的时候还可以用计时器。 
  设置变量,这个是非常重要的一个动作,其使用方式是赋值“设置 变量名=被赋值的同类型内容”,注意这里的“=”不是“等于”的意思,是把后面的数据赋值给变量,而使变量可以代替这个数据。例如“设置 单位变量Unit=大法师0001”,那么再次对“Unit”变量赋值之前,对“Unit”的操作就等同于对“大法师0001”的操作。不同的变量对应不同的数据类型,所以我们在需要对数据进行赋值到变量的操作的时候,先要确定这个数据是什么类型,然后再创建同一类型的变量来执行赋值语句。 
  跳过余下动作就是不再执行剩下的动作,在一个触发的动作中,也显得比较重要,一般是在达成一定的条件以后,跳过余下不再需要执行的动作,但有一点,在组动作执行的时候无效。 
If / Then / Else, Multiple Functions 
如果/然后/否则,多动作
if条件成立then执行动作else执行另一动作,多个动作 
If / Then / Else 
如果/然后/否则,单动作
if条件成立then执行动作else执行另一动作,单个动作 
  IF是不是和条件像呢?实际上IF就是条件语句,IF是在动作执行的时候判断的,所以IF和条件所用的判断是完全相同的。另外,IF执行的判断分正确(THEN)和否则(ELSE),也就是说,达成条件的会执行THEN的动作,而没有达成条件的执行ELSE动作。多个动作的就是可以写多条动作语句,而单动作只能执行正确和否则各一条动作。 
For Each Integer A, Do Multiple Action 
判断整数 A,循环执行动作 
以整数A循环执行多个动作,相当于For A=x to y do 
For Each Integer B, Do Multiple Action 
判断整数 B,循环执行动作 
以整数B循环执行多个动作,相当于For B=x to y do 
For Each Integer Variable, Do Multiple Action 
判断整数变量,循环执行动作 
以整数变量循环执行多个动作,相当于For 变量=x to y do 
  FOR循环语句,主要作用就是重复执行动作。FOR循环的组成是一个整数变量(系统默认的全局变量有两个,分别是循环数A和循环数B),一个基础值,一个上限值,还有可以执行的动作。整数变量是用来保存和判断执行次数的,第一次执行的时候,整数变量会赋值为基础值;然后每循环一次(执行完FOR循环里面的所有动作),该变量自动增加1,也就是说,如果基础值是1,那么执行一次以后整数变量就是2了。上限值是一个顶点,当整数变量超过上限值的时候,FOR循环结束。 
  正因为该变量是一直在变化的,所以我们可以利用这个变化来执行我们需要的一些重复动作,还可以对该变量进行赋值以达到跳跃执行或重复执行的效果。 
  例28:创建12个单位,并命令他们攻击移动到区域000。 
 动作:
 For循环整数A从 1 到 12, 做动作
 Loop - 动作
 单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
 单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 000 <预设> 的中心点)





  PS:可以看到,这里的基础值是1,上限值是12,也就是说,这个循环会执行12次,每次会创建一个步兵,然后会命令这个步兵攻击移动到区域000。另外,还有需要说明的是“最后创建的单位”只对应一个单位,而且是在这条语句执行前创建的单位,所以如果一次创建2个或更多单位的时候,也只会对一个单位发布命令;利用FOR循环就可以对每一个单位独立发布命令了。 
  例29:设定单位变量组保存步兵、女巫、骑士、火枪手四个单位类型,每五秒创建同一种类型12个单位,并命令他们攻击移动到区域000。 
 动作:
 设置 Unit[1] = 步兵
 设置 Unit[2] = 女巫
 设置 Unit[3] = 骑士
 设置 Unit[4] = 矮人火枪手
 For循环整数A从 1 到 4, 做动作
 Loop - 动作
 For循环整数B从 1 到 12, 做动作
 Loop - 动作


 单位 - 创建 1 个 Unit[(循环整数A)] 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度
 单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (矩形区域 000 <预设> 的中心点)

 等待 5.00 秒



  PS:这里用到了变量组,关于变量组的设定就是同一个名称的变量因为下标值的不同也可以每一个当成独立的变量,这里分别赋值了四个单位的类型。然后可以看到FOR的嵌套,作用就是利用两个或两个以上的循环以达到复数执行动作的目的。 
比如例中循环A的上限是4,也就是该循环会执行4次,然后在这个循环里包含了循环B,上限是12,会执行12次,也就是说,每一次循环A的执行都会执行循环B的动作12次,一共是4*12=48次循环B的动作。 
  然后可以看到,Unit[(循环整数A)]这个值,前面可以看到,我们分别对应Unit[1]到Unit[4]进行了赋值,而循环数A在执行的过程中会分别变成1、2、3、4,所以这就好理解了,当把循环数A为1的时候放置在下标值中,那么Unit[(循环整数A)]就等同于Unit[1]了。 
  例30:当随机整数1-100小于30的时候,结束循环动作(已设定整数变量X)。 
 动作:
 For X 从 1 到 2, 做动作
 Loop - 动作
 如果所有条件成立则做动作1,否则做动作2

 If - 条件
 (随机整数,最小值: 1 最大值: 100) 小于 30

 Then - 动作
 设置 X = 2

 Else - 动作
 设置 X = 1





  PS:这里利用了自定义值X来做循环,虽然这个循环从1到2只能执行两次,但是里面有一个IF的动作,其作用就是判断取得的随机值是不是小于30,当这个值小于30的时候,对变量X进行赋值为2.。前面已经提过,FOR循环每执行一次就会对整数变量做增加1的动作,那么当X=2的时候,本循环结束后X=2+1=3了,已经超过上限值2,所以不会再执行了。而如果值不小于30,也就是条件没有成立的时候,X=1,执行结束以后X=1+1=2,还会继续执行。如果条件继续不成立,X结束时还是2,还是会执行,直到条件达到为止。

第二节 ☆ 单位动作 


  单位动作是我们使用频率最高的动作,所以这里只是简单分析一下动作的使用方式,而在其它章节中,会多次使用这些动作。 
Create Unit Facing Angle 
创建单位并指定面向角度
创建单位,并指定其面向角度 
Create Unit Facing Point 
创建单位并指定面向点 
创建单位,并指定其面向点 
Create Corpse 
创建尸体 
创建单位的尸体 
Create Permanent Corpse 
创建永久的尸体 
创建永久存在的尸体 

  创建单位,在我们刷兵之类的触发中经常利用到,尸体的话,除了一些利用尸体的技能,主要是做为装饰物而存在吧。创建单位的格式如下: 
  单位 - 创建 1 个 步兵 给 玩家1(红色) 在 ((可用地图区域) 的中心点) ,面向角度为 默认建筑朝向 度 
  其中,“1个”表示创建的单位数量,“步兵”是单位的类型,“玩家 1(红色)”是创建的单位所属,就是这个单位创建以后是归谁的,“((可用地图区域)的中心点)”这个是创建单位的位置,“面向角度”就是单位的朝向,默认是270度,可自已改。另外需要说明的是,这个动作所对应的单位函数是“最后创建的单位”,在调用时会利用到。 
Kill 
杀死 
杀死单位 
Remove 
删除 
从游戏中移除单位 
Explode 
爆炸 
使单位以炸开形式死亡 
Replace 
替换 
用一个单位替换现有单位 
Hide 
隐藏 
隐藏单位 
Unhide 
解除隐藏 
解除隐藏单位 
Change Color 
改变颜色 
改变单位颜色,控制权不会改变 
Change Owner 
改变所有者
改变单位的所有者 
Shared Vision 
分享视野 
玩家分享单位的视野 
  一般来说,当我们不再使用这个单位的时候,就需要从地图上抹掉该单位。“杀死单位”的功能就像说明一样,让这个单位死亡,但同时会触发单位死亡事件的触发器,“爆炸”的话和杀死单位一样,但会出现爆炸死亡的动画效果。如果不希望触发到事件,那么就用“删除单位”,把这个单位从地图中不留痕迹的抹掉。 
  “替换单位”的作用比较奇特,普通单位的替换就是将一个单位完全替换成另一个单位,而英雄的替换会保留物品和经验值。这个动作的单位函数是“最后替换的单位”,可以在替换以后调用。“隐藏”和“解除隐藏”就是让单位可见或不可见,被隐藏的单位无法选择到,在使用的时候要用变量来保存以便控制。“改变所有者”就是改变控制权到指定玩家,同时可以决定是否改变颜色,而“改变颜色”的动作只会变化颜色。“共享视野”在特定的情况下可以给其它玩家一起看到指定单位的行动,同盟并共享视野的情况下并不需要这个动作。 
Move Unit (Instantly) 
移动单位 (立即) 
让单位瞬间移动到另一位置 
Move Unit And Face Angle (Instantly) 
移动单位并指定面向角度 (立即) 
让单位瞬间移动到另一位置,并指定面向角度 
Move Unit And Face Point (Instantly) 
搬移单位并指定面向点 (立即) 
让单位瞬间移动到另一位置,并指定面向点 
  “移动单位”就是将指定的单位从一个区域瞬间移动到另一个区域,和后面要讲的发布命令不同,这个是直接移动的。“面向角度”和“面向点”在创建单位的时候就有看到过了,作用是相同的,在制作影片的时候可以考虑使用来达到一些效果。 
Set Pally-Point To Point 
设置集结点到区域 
设置单位集结点到区域 
Set Pally-Point To Unit
设置集结点到单位 
设置单位集结点到单位 
Set Pally-Point To Destructible 
设置集结点到可破坏物体
设置单位集结点到可破坏物体 
  “集结点”在对战时用得很多,基于建造单位的方式而使用,指定训练的单位攻击移动到某个点,最快的训练单位速度是1秒,可以做为另类的刷兵触发使用。 
Set Life(To Percentage) 
设置生命 (百分比)
以百分比方式设置生命值 
Set Mana(To Percentage) 
设置法力 (百分比)
以百分比方式设置法力值 
Set Life(To Value) 
设置生命 (数值) 
设置生命值 
Set Mana(To Value) 
设置法力 (数值) 
设置法力值 
  “设置生命”和“设置法力”就是设定当前生命和法力值,前面是按百分比来设的,后面是具体数值,也可以利用这些直接加减来对单位造成伤害的模拟,只是没有伤害源。 
Make Invulnerable/Vulnerable 
成为无敌的/可被攻击的 
设定单位为无敌的/可被攻击的状态 
Pause/Unpause 
暂停/解除暂停 
暂停/解除暂停单位的动作,玩家将不可控制单位
Pause/Unpause All Unit 
暂停/解除暂停所有单位 
暂停/解除暂停所有单位的动作,玩家将不可控制单位 
Pause/Unpause Expiration Timer 
暂停/解除暂停到期的定时器 
暂停/解除暂停生命周期 
Add Expiration Timer 
设置生命周期 
给单位设置生命周期 
  “设置无敌状态”简单的说和添加“无敌”技能效果是一样的。“暂停”的动作主要是用在电影制作上,以防止一些单位自由行动。“生命周期”就是该单位可以存活的时间,现在用得最多的就是对T技能的辅助单位设定以达到自动消除的效果。 
Make Unit Explode On Death 
设置是否爆炸死亡 
使单位死亡方式成为以炸开形式死亡 
Suspend Corpse Decay 
暂缓尸体腐烂 
让尸体腐烂暂缓 
Reset Ability Cooldowns 
重置技能CD 
重置单位所有技能的CD 
  前面已经提到过单位爆炸死亡的动作,不过那个直接导至单位死亡,而现在这个动作就是设置单位的死亡形式,当单位死亡在其它方式死亡以后也会以设置的形式来死亡。“暂停尸体腐烂”是作用于单位死亡以后尸体腐烂之前,用来保存死亡的尸体在便在特殊的时候使用。“重置技能CD”就是直接将单位所有技能的冷却时间设为到期,显示技能可使用状态。 
Set Building Construction Progress 

设置建造建筑物进度 
设置建造建筑物所要消耗的时间 
Set Building Upgrade Progress 

设置建造升级进度 
设置建筑升级所要消耗的时间 
  这里设定的是按百分比来计算的,不管是建造的还是升级的都是如此,在特殊情况下可以利用这个来做“加速建造”的特殊使用方式。 
Make Unit Sleep 
成为睡眠单位 
使单位处于睡眠状态 
Make Unit Sleep At Night 
成为夜间睡眠单位
使单位在夜晚的时候处于睡眠状态
Wake Up 
醒来 
使睡眠中的单位醒过来 
Turn Alarm Generation On/Off 
警戒范围开/关 
打开/关闭单位警戒范围 
  控制单位直接睡眠的话,该单位必须要有“一直睡眠”的技能,设置夜晚睡眠的单位只对中立单位有效,醒来就是让单位清醒,但并不影响“催眠魔法”的效果。“警戒范围”只对建筑有效。 
Rescue Unit 
营救单位 
设置单位被营救 
Make Rescuable 
成为可营救的 
设置单位为可营救单位,玩家接触时营救单位将加入玩家阵营 
Set Rescue Range 

设置营救范围 
设置进入范围后单位即被营救 
Set Rescue Behavior For Units 
设置单位营救行为 
设置营救后单位颜色是否变化 
Set Rescue Behavior For Buildings 
设置建筑营救行为 
设置营救后建筑颜色是否变化 
  营救是一种特殊状态,当开启营救状态以后,指定可营教的单位进入营救范围,就会改变这个单位所属(被营救,可设定营救后所属玩家),同时可以设定是否改变颜色等。 
Enable/Disable Supply Usage
开启/关闭人口占用
开启/关闭人口占用

  对指定单位开关占用人口,也就是说,把该单位所需要的人口数降为0。 
Make Unit Face Unit 
使单位面向单位 
使单位面向单位 
Make Unit Face Point 
使单位面向地点 
使单位面向地点 
Make Unit Face Angle 
使单位面向角度 
使单位面向角度 
  这个在前面已经遇到好多次了,主要是设定单位的前面角度。在电影的制作中,可以设定单位面向单位以取得对话效果;面向地点可以在播放某些动作的时候设定所有单位面对的方向,点是不动的,每个单位所设定的角度是不同的;单位面向角度就是对单位设定具体的角度。 
Set Movement Speed 
设置移动速度 
设置移动单位速度 
Turn Collision On/Off
碰撞开/关 
设置单位是否可与其他单位重叠 

  单位的移动速度如果设为0的话,这个单位就不会移动了,可以利用这个把单位变成类似于建筑的守卫,上限是522。“碰撞开关”是一个很有趣的东西,设定了以后,该单位可以穿越其它单位而不会被阻撞,但这个是单向的,也就是说,其它单位依然无法越过该单位。现在比较常用的就是利用在T技能的辅助单位上,让两个单位重叠以实现技能从原始单位身上发出的效果。 
Set Acquisition Range 

设置主动攻击范围
设置单位的主动攻击范围 
Set Custom Value 
设置自定义数值 
设置自定义数值 
  “主动攻击范围”就是当敌人进入这个范围以后会自动攻击,可以通过T来改变范围大小。“自定义数值”简单的说,就是把单位当成一个整数变量,可以对单位设定整数以达到一些效果,比如做为ID区别单位等等。 
Remove Buffs 
移除持续性魔法 
移除单位上的持续性魔法 
Remove Buffs By Type 
移除持续性魔法类型 
按类型移除单位上的持续性魔法 
Remove Specific Buff 
移除魔法效果 
移除单位身上的魔法效果 
  移除持续魔法效果,前一个全移除全部效果,后一个可以设定移除有益或有害的BUFF,最后面一个是移除“指定的技能”的魔法效果。 
Add Ability 
增加技能 
增加单位的技能
Remove Ability 
移除技能 
移除单位的技能
Add Classification 
增加分类 
增加分类到单位
Remove Classification 
移除分类 
移除分类到单位
Decrease Lvevl Of Ability For Unit 
降低技能等级 
降低技能等级 
Increase Level Of Ability For Unit 
提升技能等级 
提升技能等级 
Set Level Of Ability For Unit 
设定技能等级 
设定技能等级 

  添加技能,可以直接给单位添加各个技能,删除正好相反。降低和提升技能等级都只是对原来技能等级进行加减1的动作,最低是1级,最高是技能上限,如果单位没有指定技能则不执行动作,设定技能等级就是直接改变到一定等级。因为技能的目标选择和单位分类有直接关系,所以如何设定不同分类也是区分不同单位的重要部分。 
Issue Order Targeting A Unit 
当前目标是一个单位的命令 
让单位执行目标是单位的命令 
Issue Order Targeting A Point 
当前目标是一个点的命令 
让单位执行目标是地点的命令 
Issue Order Targeting A Destructible 
当前目标是一个可破坏物体的命令 
让单位执行目标是可破坏物体的命令 
Issue Order With No Target 
没有目标的命令 
让单位执行没有目标的命令 
Issue Train/Upgrade Order 
训练/升级的命令 
执行训练/升级的命令 
Issue Research Order 
研究科技的命令 
执行研究科技的命令 
Issue Build Order 
建造的命令 
执行建造的命令 

  对单位发布命令,是制作AI的最基础部分,不同的命令发布对应不同的命令。比如需要攻击一个单位,那么就发布目标是单位的命令,选择里面的“攻击”命令来执行,同时也可以发布针对单位施放的技能(说明一下,自定义技能的命令发布方式是对原技能进行发布命令);目标是一个点的作用是对一个点的动作和施放技能,比如大法师的暴风雪等,而在一些守护图中,也经常用到命令单位“攻击移动”到指定点,然后单位就会跑过去,并且遇到敌人就会主动攻击。像“采集”之类的技能针对的是树木(可破坏物)。而没有目标的命令就是不指定单位或点,直接施放的,例如山丘之王的震击,或者一些带有自动施放能力的技能的开关等等都在这个选项。“训练”“研究”“建造”这个就不需要多说明了,玩过对战的都知道。 
Drop Item On Point 
掉落物品到区域 
掉落单位身上的指定物品到区域 
Drop Item In Slot 
移动物品 
移动单位身上的物品到物品栏指定格 
Drop Item On A Unit 
给予其它单位物品
把指定物品给予另一个单位 
  这些是对单位身上的物品栏是行操作,我们可以设定一个带有单位物品栏的单位帮忙捡取物品,然后交给我们的英雄,可以通过这些动作来实现。 
Damage Area 
伤害区域目标 
对区域内的单位造成伤害 
Damage Target 
伤害单位目标 
对指定单位造成伤害 

  这个动作的最大作用,现在来看就是做属性强化伤害时使用。例如一个技能附加智力*3的伤害,那么就可以利用这个对目标单位增加伤害。简单的例子: 
  单位 - 命令 (伤害来源) 对 (被攻击单位) 造成 ((转换 (智力 对 (伤害来源) (不包括 加成)) 为实数) x 3.00) 点伤害,攻击类型: 法术 伤害类型: 普通


第三节 ☆ 英雄动作 



  英雄动作是单位动作的衍生动作,主要是针对英雄的特性来执行一些动作。 

Learn Skill
学习技能
让英雄学习到新的技能
Set Level
设置等级
设置英雄当前等级
Set Experience
设置经验
设置英雄当前累计的经验值
Add Experience
增加经验
增加英雄累计的经验值
Enable/Disable Experience Gain
开启/关闭经验获取
设定英雄是否能够获得经验
Set Experience Rate
设置经验比率
按百分比方式设置英雄当前的经验值

  学习技能的话,就是英雄自带的英雄技能,在还有技能点数的情况下,可以自动让他学习,制作AI的又一个基础要素。 
  设置等级,就是改变英雄的当前等级,并设定经验为当前等级的初始值。设置经验,改变英雄的当前经验,就是累计经验,只可以升不可以降。增加经验,和前面一样,但不同的是增加在累计基础上,同样只升不降。开启和关闭经验就是决定是否让英雄获得经验,设置经验比率对改变游戏难度有帮助,设置英雄获得的经验值百分比。 
  这里有一个很有趣的东西,“设置等级”是可以改变等级,在改变等级的情况下,比如7级改6级,就会回到6级的初始值。而“设置经验”是只可以增长而不能降低的,但如果把两者结合呢? 
  演示31:随意改变英雄的经验值,只需要输入数值就可以改变经验。 
 事件:
 玩家 - 玩家1(红色) 输入的聊天信息包含 <空字符串> ,匹配方式: 包含字符串

 条件:
 动作:
 英雄 - 设置 血魔法师 0000 <预设> 的英雄等级为 1 , 隐藏 升级动画
 英雄 - 设置 血魔法师 0000 <预设> 的经验值为 (转换 (输入的聊天信息) 为整数) , 隐藏 升级动画



  PS:因为前面已经说过了,改变等级就会重置经验,等级1的初始值为0,然后再设定经验值的话就完成了改变经验的过程,因为只是增加而不是减少。如果在高级界面里修改掉有关“等级”的数据为空格的话,就不会显示等级了,可以做成随意控制的能量条哦。 


Revive (Instantly)
复活 (立即)
让英雄立即复活
Modify Hero Attribute
修改英雄属性
修改英雄的属性
Modify Hero Skill Point
修改技能点
修改英雄拥有的技能点
Reserve Hero Button
保留英雄图标
保留英雄图标数量
  英雄复活,这个在RPG地图用的非常多,配合计时器就可以完成英雄复活的计数流程了(在计时器部分有演示)。修改属性就是针对英雄的三围,力敏智进行直接修改。技能点前面说过了,学习英雄自带的英雄技能用的。保留英雄图标就是显示几个英雄头像,共享操作的话,从保留数开始下面才是共享的他人英雄头像。 

Give Item To Hero
给予英雄物品
给英雄一件物品
Create Item For Hero
创建物品给英雄
创建一件物品给英雄
Drop Item From Hero
从英雄掉落物品
从英雄身上掉落一件物品
Drop Item From Hero Inventory Slot
从英雄掉落指定位置的物品
从英雄物品栏中掉落指定位置的物品
Use Item On A Unit
将物品用于一个单位
让英雄对一个单位使用物品
Use Item On A Point
将物品用于一个点
让英雄对一个区域使用物品
Use Item On A Destructible
将物品用于一个可破坏物体
让英雄对可破坏物体使用物品
Use Item
直接使用物品
让英雄使用一个直接作用于自身的物品
  给予英雄物品和创建物品给英雄很明显的区别就在于,一个是直接把地图中已存在的物品给予“指定英雄”,而另一个是创建一个新的给英雄,主要是利用在物品合成或任务给予上面。掉落物品同样是“指定物品”从“指定英雄”身上掉落,而指定位置就是在六格中的其中一格的物品掉落。使用物品同样可以归为基础AI的一部分。跟据物品的使物方式不同而用不同的使用动作,像幻像权杖可以用在单位身上,而生命药水是直接使用(例4)等。



第四节 ☆ 玩家动作


  玩家动作,针对“指定玩家”执行的动作,主要作用于属性的变化上面。 

Set Property 
设置拥有资源 
设置玩家拥有的资源 
Add Property 
增加拥有资源 
增加/减少玩家所拥有的资源数
Turn Player Flag On/Off 
玩家奖励开/关 
打开和关闭玩家金钱奖励 
Divert Player Income (Tax)
转移玩家收入 
转移一定比例收入给另一玩家 
  设置资源和增加资源的区别是,前者直接设定资源数,而后者在原始基础上增加一定的量。玩家奖励开关杀死敌方单位有金钱奖励,除了默认的中立敌对,一般玩家的单位被杀人是不会奖励资源的。转移收入,这个就很明显了,可以做为辅助手法来增强玩家(交税)。 

  例32:设置所有玩家初始金钱为1500,而且打开每一个玩家的金钱奖励(玩家之间杀死单位增加金钱)。 
 事件:
 地图初始化

 条件:
 动作:
 玩家组 - 选取 (所有玩家) 内所有玩家做动作
 Loop - 动作
 玩家 - 设置 (选取玩家) 的 现有黄金 为 1500
 玩家 - 设置 给予奖励 打开 对 (选取玩家)





  PS:这里用到了“选取玩家”,这个是玩家组应用的方式,对应玩家组选择的每一个玩家。 

Enable/Disable Sleeping For All Creeps 
开启/关闭野外生物睡眠 
开启/关闭野外生物睡眠 
Set Alliance 

设置同盟 
设置玩家同盟 
Set Aspect Of Alliance 

设置同盟状态 
设置玩家之间的同盟状态
  
  开关睡眠只影响夜晚中立生物的睡眠状态,不会对催眠技能产生影响。设置同盟只对同盟和敌对各方面关闭进行设定,而设定同盟状态,是设置同盟之间的细节关系。 

Enable/Disable Ability 
充许/禁用技能 
充许/禁用玩家的技能 
Set Training/Construction Availability Of Unit 
设置单位训练/建造可用 
限制玩家是否可以训练/建造单位 

  这两个动作的作用很相似,都是充许和禁用。其中禁用技能的话,指定玩家的单位就不能使用这个技能。而设置单位可用性,被禁止的单位不可以训练也不可以建造,但不影响触发的创建动作。 

演示33:在酒馆当有玩家购得一个英雄以后,其它玩家无法再购得同类型英雄。 
 事件:
 单位 - 任意单位 出售单位

 条件:
 ((被贩卖单位) 是 英雄) 等于 TRUE

 动作:
 玩家组 - 选取 (所有玩家) 内所有玩家做动作
 Loop - 动作
 玩家 - 设置 ((被贩卖单位) 的类型) 可取得的 对 (选取玩家)






Limit Training Of Unit-Type 
限制训练单位类型
限制玩家可训练的单位类型
Limit Training Of Heroes 
限制训练英雄 
限制玩家可训练的英雄 
  这两个动作具体是限制可建造的数量,限制单位类型就是针对某一类型的单位,而限制英雄就是玩家可以正常获取(建造或购买)的英雄数量限制。 

Set Current Research Level
设置当前科技等级 
设置玩家当前的科技等级 
Set Max Research Level 
设置最大科技等级 
设置玩家科技最高可以研究到的等级 
Change Color 
改变颜色 
改变玩家颜色 
Set Handicap 
增加生命障碍 
增加生命障碍 
Show/Hide In Score Screen 
显示/隐藏得分画面
在得分画面中显示/隐藏玩家 
Set Name 
设置名字 
设置玩家名字 
  需要说明的是,科技等级只能升不能降,在RPG地图中,科技等级往往可以做为难度设定的辅助方式。改变颜色只是改变玩家的颜色,而且只影响存在的单位。生命障碍是另一种难度设定方式,按百分比来设定生命值上限。显示隐藏得分画面只是在战斗结束以后有用,基本上我们也很少用到这个。改置玩家名字,只是在游戏中改变原来我们进入游戏时设定的名字。 
  PS:关于科技增强难度,首先需要确定一下科技的属性,比如增加生命值的科技,设每级增加100生命,然后把这个科技给予所有需要受到影响的单位(单位编辑“使用科技”栏),同样可以设定攻击力等数值的科技。这样在必要的时候只要修改科技等级就可以达到改变难度的效果了。


第五节 ☆ 单位组&玩家组动作


  组的作用就是对多个的单位或玩家或物品或可破坏物进行同一个操作。把单位组和玩家组放在一起是因为两者的操作方式很相似,在一些函数应用上也差不多。这里先稍稍解释一下组动作中常用的函数:选取和匹配,前者的作用是在选择好的单位组中可以针对发布命令,而后者是在选择的过程中的条件中使用。 

Pick Every Unit In Unit Group And Do Multiple Actions
选择单位组中全部单位并执行多个动作
选择单位组中全部单位并执行多个动作
Pick Every Unit In Unit Group And Do Actions
选择单位组中全部单位并执行动作
选择单位组中全部单位并执行动作
Add Unit
增加单位
增加单位到单位组中
Add Unit Group
增加单位组
增加单位组到另一单位组中
Remove Unit
移除单位
从单位组中移除单位
Remove Unit Group
移除单位组
从单位组中移除一个单位组
Clear
清除
清除单位组中所有单位
  例34:对玩家10执行刷兵(12名骑士)动作,并命令他们攻击到玩家5的初始点。当玩家10的骑士死完以后重新刷出12名骑士,预设单位组变量“G”。 
 事件:
 时间 - 游戏开始 5.00 秒
 单位 - 玩家10(淡蓝) 的单位 死亡

 条件:
 动作:
 如果所有条件成立则做动作1,否则做动作2
 If - 条件
 (G 中所有单位死亡) 等于 TRUE

 Then - 动作
 单位组 - 清空 G 内所有单位
 For循环整数A从 1 到 12, 做动作
 Loop - 动作
 单位 - 创建 1 个 骑士 给 玩家10(淡蓝) 在 (玩家10(淡蓝) 的游戏开始位置) ,面向角度为 默认建筑朝向 度
 单位组 - 添加 (最后创建的单位) 到 G
 单位 - 对 (最后创建的单位) 发布 攻击移动 命令到目标点: (玩家5(黄色) 的游戏开始位置)



 Else - 动作
 无动作





  PS:这个演示特殊的地方,在于用了两个并不冲突的事件,一个是在游戏开始时进行刷兵的时间,另一个是单位死亡以后再判断的是否所有单位死亡后执行的刷兵动作,两个不冲突的事件是可以并行使用的,不过需要注意细节问题,比如不同事件对应不同的函数,必须要通用的函数才会被正确执行。单位组G在这里的应用就是判断单位的存活数,只有当单位死完以后才可以执行动作。 

  例35:选择地图中所有的步兵,并执行转换为骑士动作,这里用了两种方式: 
1.利用匹配单位比较
 事件:
 时间 - 游戏开始 5.00 秒

 条件:
 动作:
 单位组 - 选取 ((可用地图区域) 内满足 (((匹配单位) 的类型) 等于 步兵) 的所有单位) 内所有单位做动作
 Loop - 动作
 单位 - 将 (选取单位) 替换为 骑士 使用 旧单位的百分比 生命和魔法





2.利用选取单位比较
 事件:
 时间 - 游戏开始 5.00 秒

 条件:
 动作:
 单位组 - 选取 ((可用地图区域) 内的所有单位) 内所有单位做动作
 Loop - 动作
 如果所有条件成立则做动作1,否则做动作2
 If - 条件
 ((选取单位) 的类型) 等于 步兵
 Then - 动作
 单位 - 将 (选取单位) 替换为 骑士 使用 旧单位的百分比 生命和魔法

 Else - 动作
 无动作









  PS:以上两个演示很好的阐述了组动作的两个函数的作用,在我们选取单位进行执行判断的时候,经常会用到判断语句来筛选我们需要的单位。 


Issue Order Targeting A Unit
当前目标是一个单位的命令
让单位组执行目标是单位的命令
Issue Order Targeting A Point
当前目标是一个点的命令
让单位组执行目标是地点的命令
Issue Order Targeting A Destructible
当前目标是一个可破坏物体的命令
让单位组执行目标是可破坏物体的命令
Issue Order Targeting A Item
当前目标是一个物品的命令
让单位组执行目标是物品的命令
Issue Order With No Target
没有目标的命令
让单位组执行没有目标的命令
Issue Train Order
训练命令
让单位组执行升级的命令
  这里是对单位组发布命令,但不得不说的是,单位组的命令都只针对最多12个单位发布的,超过的数量不会执行动作。所以必要的话,最好还是像前面针对每一个选取的单位单独发布命令,才可以避免这个问题产生。 

Pick Every Player In Player Group And Do Multiple Actions
选择玩家组中全部玩家并执行多个动作
选择玩家组中全部玩家并执行多个动作
Pick Every Player In Player Group And Do Actions
选择玩家组中全部玩家并执行动作
选择玩家组中全部玩家并执行动作
Add Player
增加玩家
增加玩家到玩家组中
Remove Player
移除玩家
从玩家组中移除玩家
Clear
清除
清除玩家组
Set Alliance

设置同盟
设置玩家组中玩家的同盟

  玩家组的操作方式和单位组基本相同的,而且在前面已经介绍过具体的玩家动作,所以这里就不再多解释了。不过有一点需要注意的,就是在对玩家组进行操作的时候,不能同时对玩家组中的玩家数进行判断。因为玩家组的执行方式是移出(就是把执行过动作的玩家移出玩家组),所以不要在执行玩家组动作时添加额外的操作,单位组不存在此问题。