|
SC2的AI控制函数比War3强大多了。所以很多刷兵和攻击只需要两三条刷兵操作就能由AI代劳。
用war3触发器做过刷兵和进攻的同学可能都遇到过这样一个问题。由于命令用的是攻击-移动。结果半路上部队被人晕了什么的,直接就会导致单位呆在原地不继续前进什么的。需要每隔一段时间重复发布攻击命令才行。而采用AI的强智能化的AI的话就没有这样的问题。
我这里就以“大贤良师”同学提的刷兵问题为基础做一个最傻瓜化的刷兵及攻击的演示。
http://bbs.islga.org/read.php?tid=53013#547992
“大贤良师”希望做出这样的效果。开始游戏10秒后电脑刷100只小狗,然后进攻你的基地。当小狗数量小于X以后,那么就刷下一波100只。无限这样下去只到你的指挥中心被推掉。
以下是步骤,总共只需要三道触发器:
在地图初始化时,先为电脑玩家开启AI。注意要是不开启AI的话以下的命令全部都是没用的。这里是开启战役AI。
[trigger]
对战初始化
Events
Game - Map initialization
Local Variables
Conditions
Actions
AI - Start the campaign AI for player 2
[/trigger]
为了照顾简体中文版的玩家。我也贴下简体中文版本:
注意这个触发器和上面那个触发器是同一个触发器。只是一个是英文版,一个是中文版。下同。
[trigger]
对战初始化
事件
游戏 -地图初始化
局部变量
条件
动作
AI -为玩家2启用战役AI
[/trigger]
然后我们做个简单的游戏失败设定:
也就是当指挥中心死亡时,游戏就告失败。具体的失败条件大家可以随便填。
[trigger]
游戏失败
Events
Unit - Logistics Headquarters [72.50, 97.50] dies
Local Variables
Conditions
Actions
Game - End game in Defeat for player 1 (Show dialogs, Show score screen)
[/trigger]
[trigger]
游戏失败
事件
单位 -后勤总部 [72.50, 97.50]死亡
局部变量
条件
动作
游戏 -为玩家1以战败结束游戏(显示对话,显示得分画面)
[/trigger]
然后,最主要的是第三个触发器:
我会对这个触发器的每一条动作作逐一讲解。
[trigger]
Spawn & Attack
Events
Timer - Elapsed time is 10.0 Game Time seconds
Unit - Any Unit dies
Local Variables
Conditions
(Number of Living units in AttackingGroup) <= X
Actions
Debug - Display "新的一波跳虫来袭!" as debug output using Type 1, and Do display it in the game window
Unit - Create 100 Zergling (Burrowed) for player 2 at 跳虫刷新点 facing 270.0 degrees (No Options)
Variable - Set AttackingGroup = (Any units in (Entire map) owned by player 2 matching Excluded: Missile, Dead, Hidden, with at most Any Amount)
AI - Add AttackingGroup to the next attack wave for player 2
AI - Set the target for player 2 attack waves to Logistics Headquarters [72.50, 97.50]
AI - Send the attack wave from player 2 to attack in 0 seconds and Don't Wait
[/trigger]
[trigger]
跳虫攻击
事件
计时器 -已流逝时间为10.0游戏时间秒
单位 -任意单位死亡
局部变量
条件
(在跳虫数量内的活体单位数)<=X
动作
纠错 -显示"新的一波跳虫来袭!"为使用类型1的纠错输出,并执行在游戏窗口中将其显示
单位 -为玩家2 在跳虫刷新点创建100个面向270.0度(无选项)的跳虫 (已潜地)
变量 -设置跳虫数量 = (在(整张地图)内的属于玩家2的,并且匹配不包括: 发射物, 死亡的, 隐藏的的任意单位,最多有任意数量个)
AI -为玩家2添加跳虫数量到下一个攻击波次中
AI -将玩家2的攻击波次的目标设为后勤总部 [72.50, 97.50]
AI -将取自玩家2的攻击波次发送到0秒后的攻击并不要等待
[/trigger]
其中,全局变量X为整数类型。我们可以随便指定它的值。比如说10。就代表当上一波死剩10个之后就开始刷下一波。
而全局变量AttackingGroup为一个单位组。
大家可以看到,这个触发器有两个动作,一个是游戏开始后10秒,另一个是单位死亡。触发器初学者要特别注意的一点是。触发器的事件之间都是或的关系。而条件之间都默认是与的关系(当然条件也可以强制指定为或关系,但是默认是与关系)。意思是两个事件只要一个被引发,这个触发器就会开始判断条件,然后执行。
理由很简单,在队列处理的触发器里,是没有“同时”这个概念的。如果两个兵一起死,触发器必定会先处理一个再处理另一个,所以事件是不存在“与”的关系的。
所以我这个第三条触发器,其实可以理解为两个单独的触发器。一个以游戏开始后10秒为事件。另一个以任意单位死亡为事件。而它们的条件和动作是完全一样的。
当发生单位死亡事件或时。会判断条件(AttackingGroup单位组里的活着的单位数是否小于等于X)。而AttackingGroup我们可以在下面发现,每次刷兵后都设置为玩家2也就是电脑当前拥有的所有单位。所以当判断AttackingGroup单位组里的活着的单位数量时就代表看电脑还死胜了几个小狗了。
当出现单位死亡事件,而且条件成立,也就是死剩到小于X时(我附的演示地图里,X的数量为10,所以也就是死剩10只或者以下时)。这个触发器的动作就会被执行。当出现游戏开始后10秒事件时。由于当时玩家2还没有任何单位,所以条件必定成立。动作也会被执行。
我们的第一条动作只是输出一条提示:下一波来了。没什么实际作用,接下去5条动作才是关键。
我们先为玩家2创造100只潜伏状态的跳虫。(在此之前,先在地形编辑器里你想要刷兵的地方放一个点。比如名字叫“ 跳虫刷新点”什么的,这样才给这条刷兵动作指定刷兵点)。之所以是潜伏状态,只是100只跳虫一起从土里钻出来比直接凭空刷出来酷一点而已。
然后,将AttackingGroup设为玩家2现有的所有单位。这里要说明的一点是。之所以设为所有单位,而不是“最后创建的所有单位”,是为了把上一波死剩下的那些家伙都包括进去。否则计数会不准确。
然后以下3条触发都是关于给AI指定出击方针的了。
这里我要先给大家说明一下的是,AI里的Attack Wave(简体中文版翻译为“攻击波次”)这个东西。所谓攻击波次,在AI里是很重要的一个东西。你可以为AI指定下一波攻击的攻击方针,攻击目标,出击的部队构成。以及何时出击。
所以,这三条触发里的第一条。就是给玩家2指定出击的部队构成的。这里我直接把整个AttackingGroup加了过去。因为AttackingGroup已经包括了玩家2的所有单位了。
第二条,给攻击指定目标。这里指定了一个确定的目标,就是我们基地里的那个指挥部。指定目标后,AI会以消灭这个目标为战略方针展开进攻。也许你会问。我指定了指挥中心作为目标。那么电脑会不会到时候一股脑儿一路就往这个指挥中心冲过来,不管中途的敌人了?当然不会。AI不是傻子。它会排除攻击路线上所有有威胁的目标,甚至还会释放通常的技能。当然你真要让AI对一个目标展开自杀性攻击,不顾沿路任何阻拦也不是不行。不过不是本文要讨论的内容。
另外。给AI指定目标的方式并不单一。这里指定一个单独单位只是一个例子。仔细看看AI类的动作的话,你会发现你可以把目标指定为各种各样的东西。比如你可以把一个区域指定为目标,让AI攻击这个区域内的所有敌人,或者是镇守那里。甚至可以把一个单位组指定为目标,也可以笼统的把一家玩家指定为目标。也可以把另一拨攻击部队指定为会师目标,这两拨部队就会会师一处,等等。你也可以让部队进行巡逻、骚扰等等。反正SC2的AI功能函数都超强的。不过这是初级演示,更多的就暂且不提了。
第三条动作让部队立刻出击了。你可以指定下一拨攻击波次多久后出击,我这里设为0,也就是立刻出动。
所以要让AI部队进攻只需要做三件事:1]指定哪些人出击、2]指定攻击目标、3]指定出击时间。
怎么样,超简单的吧? |
|