心灵终结3.3.6地图编辑器萌新教程第21篇:局部变量(二)
本篇延续上一篇的内容,举更多的例子来说明局部变量的用法。
一、局部变量用作触发的条件和结果
例1:
我们更进一步地讨论在上一篇专栏例5中的触发:
想要实现的效果:如果玩家在游戏开始前30分钟内进入过敌军基地,则在游戏开始30分钟时刷出一批敌军。
“刷出敌军”这一结果的实现需要两个条件:(1)游戏开始30分钟;(2)游戏前30分钟玩家进入过某区域。
在上一篇中,我们已经讲过为什么不能把这两个条件用作同一个触发的条件1和条件2. 我们使用了两个触发来表示这两个条件:
触发1:条件:流逝时间30分钟,结果待定;
触发2:条件:进入事件,结果待定。
如果触发1的结果写“援军”,触发2的结果写“允许触发1”,那么效果应该是玩家进入敌方基地之后,再过30分钟刷出援军;如果触发2的结果写“援军”,触发1的结果写“允许触发2”,那么效果应该是游戏开始30分钟之后,玩家首次进入敌军基地时刷出援军。这都和我们想要的效果不符。
因此,我们又建立了第三个触发:
触发3:条件待定,结果:刷出援军。
注:在这里我们不考虑游戏开始30分钟以后发生的事情,比如,如果玩家在前30分钟没有进入敌军基地,而在第40分钟进入了,那么第40分钟是会刷兵还是无事发生?根据不同的需要,我们可能还要建立新的触发。在此我们只考虑前30分钟的事。
我们需要的是当触发1和2都完成才允许触发3,然而,如果我们将触发3的条件写为任意事件,初始禁止,将触发1和触发2的结果都写成“允许触发3”,这两个“允许触发”是“或”的关系,即其中任何一个触发之后都可以单独允许触发3,但我们需要的“且”的关系。
因此,我们将其中一个“允许触发”保留,而将另一个“允许触发”改成局部变量。我们将触发1的结果写为“允许触发3”,触发2的结果写为“设置局部变量A”,将触发3的条件写为“局部变量A被设置”。
那么,大家可能会有以下几个问题:
1、是否可以将触发2的结果写为“允许触发3”,将触发1的结果写为“设置局部变量A”,将触发3的结果写为“局部变量A被设置”?
可以。当前30分钟进入敌军基地时,触发3会被允许,一旦到了30分钟局部变量被设置,就会触发援军。
2、是否可以将两个“允许触发”都转换为局部变量?
可以。比如触发1的结果为“设置局部变量A”,触发2的结果为“设置局部变量B”,触发3的条件1和条件2分别为“局部变量A被设置”和“局部变量B被设置”。
3、如果使用了局部变量,能否删去触发3,只用触发1和2实现这个效果?比如在一个触发的结果中添加“设置局部变量”,另一个触发的条件中添加“局部变量被设置”。
不可以。我们分两种情况:
(1)触发1:条件:流逝时间30分钟,结果:设置局部变量A
触发2:条件1:进入事件,条件2:局部变量A被设置,结果:刷出援军
这实际上又回到了我们在上一篇例5中提到的“第二种错误实现方法”。“进入事件”是一个“瞬间型条件”,前30分钟该条件被满足的信息不会一直保留到第30分钟局部变量被设置的时候;
(2)触发1:条件1:流逝时间30分钟,条件2:局部变量A被设置,结果:刷出援军
触发2:条件:进入事件,结果:设置局部变量A.
这涉及到了下一个问题:当一个触发有两个条件,其中一个是“流逝时间”时,具体如何判定?(只在单次触发的条件下讨论,不涉及重复触发)
当一个触发有两个条件,其中条件1为“流逝时间”时,我们按照条件2的类型,分3种情况:瞬间型条件、一般的持续型条件、局部变量条件。我们在上一篇中说“局部变量条件(条件36和37)”属于“持续型条件”,但是在这个问题中,它和一般的持续型条件还有区别,因此单独分为一项。
(i) 当条件2为瞬间型条件时,在流逝时间结束之前,不论这个瞬间型条件被满足多少次都是没有用的;在流逝时间结束之后,条件1“流逝时间”被视为一直满足(即可以将它看成一个持续型条件),此后首次满足条件2的时刻即为触发时刻。(可以结合后面举的例子来理解)
(ii)当条件2为持续型条件时,如果在流逝时间结束之前该条件被满足,则一旦流逝时间结束就会立刻触发;如果流逝时间结束时该条件还未被满足,则在此后该条件首次被满足时触发。
(iii)当条件2为局部变量型条件时,在局部变量的条件未被满足时,“流逝时间”这一项的计时不会开始。只有当局部变量条件被满足之后,再经过“流逝时间”条件相应的时间,才会触发结果。
我们通过举例来说明:
例1.1:触发条件1为“流逝时间60秒”,条件2为“关联对象被摧毁”,关联对象为地图上盟军建造场。结果为文本触发事件。那么在进入游戏之后,如果在第50秒摧毁了建造场,此时条件1还没有被满足,所以不会触发文本;再过10秒之后,条件1满足,但由于条件2是一个“瞬时型条件”,只在建造场被摧毁的一瞬间会被判定为“满足条件”,所以在第60秒时条件2不满足,因此仍然不会触发文本。如果进入游戏之后第70秒摧毁了建造场,由于在第60秒之后条件1就一直满足,在第70秒摧毁建造场时条件2也满足,因此此时会触发文本。
例1.2:触发条件1为“流逝时间60秒”,条件2为“所属方不存在科技类型”,科技类型为盟军建造场,数值填0,触发所属方为美国,在地图上放一个美国的盟军建造场。触发结果为文本触发事件。那么在进入游戏之后,如果在第50秒摧毁了盟军建造场,由于条件2是一个“持续型条件”,因此从此之后条件2就一直满足(除非地图上又出现了一个美国的盟军建造场),那么再过10秒之后就会触发文本;如果第进入游戏之后第70秒摧毁了建造场,那么与上一例类似,也会立刻显示文本。
例1.3:触发1:条件1为“流逝时间60秒”,条件2为“局部变量A被设置”,结果为文本触发事件。触发2的条件为“关联对象被摧毁”,关联对象为盟军建造场,结果为“设置局部变量A”。局部变量A的初始值为0。在触发1中,条件2为局部变量条件,只有当这个条件被满足时,条件1中的计时器才会开启。因此,如果在进入游戏50秒时摧毁了建造场,那么会在第110秒时触发文本,70秒摧毁建造场则在第130秒触发文本。
因此第(2)种触发设计方式实现的效果是“进入敌军基地之后再过30分钟刷出援军”,而不是我们想要的效果。
例2:“触发所属方”不同时使用局部变量
有的触发条件或者结果需要用到“触发所属方”,也就是在“触发选项”中的那个“所属方”选项。但有时,我们需要使用多个条件作为一个触发结果实现的前提,但这些条件要使用的“触发所属方”不同。
比如:在《守护》第2关中,当两座盟军基地均被摧毁时,判定任务完成。两个盟军基地的所属方分别是美国和欧盟。
判定一座基地被摧毁的条件是“17:不再有工厂(生产建筑)”(在此强烈谴责那些把胜利条件设为“所有对象都被摧毁”,还不做卖家冲锋触发的战役!!!)。这个条件需要设置“触发所属方”,也就是说当触发所属方不再有生产建筑时满足条件。
然而,我们没有办法把两个所属方都没有生产建筑的条件写到一个触发中,因为一个触发的“触发所属方”是唯一的。所以我们使用局部变量:
触发1:触发所属方:美国;条件:不再有工厂;结果:设置局部变量A
触发2:触发所属方:欧盟;条件:不再有工厂;结果:设置局部变量B
触发3:条件1:局部变量A被设置;条件2:局部变量B被设置;结果:与任务完成相关。
如果不使用局部变量,能实现这样的效果吗?可以,但比较麻烦:
触发1:触发所属方:美国;条件:不再有工厂;结果:任务完成;初始禁止
触发2:触发所属方:欧盟;条件:不再有工厂;结果:任务完成;初始禁止
触发3:触发所属方:美国;条件:不再有工厂;结果1:允许触发2;结果2:摧毁触发1;初始允许
触发4:触发所属方:欧盟;条件:不再有工厂;结果1:允许触发1;结果2:摧毁触发2,初始允许
如果敌军基地的数量是N个,那么使用局部变量需要建立的触发是N+1个,而不使用局部变量需要建立的触发是N * N个(感兴趣的可以想想为什么是这么多个,怎么设置)。
除此之外,当出现一个触发的条件为“占领建筑A+摧毁建筑B”这样需要使用两个关联对象的情况时,也可以使用完全相同的方法设置两个局部变量。(教程第4篇最后的问题4)
二、局部变量联系“动作脚本”和“触发”
有时候,我们想要让一个作战小队执行完一个动作脚本,或者将一个动作脚本执行到某一步时,触发某一结果。但如何将“动作脚本”和“触发结果”联系起来?局部变量可以很容易地实现这个效果。在动作脚本中,行为39和40可以用于设置和清除局部变量。
例3:运输艇卸载后返回。
我们需要实现这样一个效果:每隔300秒(重复触发),从地图外的路径点0刷出来一个苏军运输艇(SAPC),装有2个犀牛坦克(HTNK),该运输艇移动到路径点1之后卸载,然后运输艇原路返回,犀牛坦克攻击玩家。
我们在“作战小队(三)”这一篇教程中说过,“作战小队”中“运输艇卸载后返回”并没有什么用,要实现这一效果需要使用局部变量将动作脚本与触发联系起来,具体方法如下:
局部变量A:SAPC unload,初始值0
特遣部队1:1 SAPC,2 HTNK
特遣部队2:1 SAPC
动作脚本1:
(1)移动到路径点1
(2)卸载,附加选项选择“2:丢弃载具,保留载员”,这个选项意思是说只有载员(犀牛坦克)参与之后的动作脚本(攻击等),而载具(运输艇)不会。
(3)设置局部变量A
(4)攻击
动作脚本2:移动到路径点0
作战小队1:特遣部队1,动作脚本1,路径点0,勾选“装载部队”“忽视阻拦”和“小队成员可被AI重组”
作战小队2:特遣部队2,动作脚本2,路径点1,勾选“忽视阻拦”
触发1:刷出运输艇和犀牛坦克
类型:2(重复)
条件:流逝时间300秒
结果:7:援军:作战小队1
触发2:运输艇返回
类型:2(重复)
条件:局部变量A被设置
结果1:4:建立作战小队:作战小队2
结果2:清除局部变量A
例4:
在《守护》第5关开头过场中,需要实现这样一个效果:沃尔科夫和犰狳载具同时前往路径点0,然后沃尔科夫上车,前往战地医院附近(路径点1),然后沃尔科夫下车,“进入”战地医院(实际上是移动到路径点2+删除沃尔科夫)。我们采用局部变量的方法来判断沃尔科夫和犰狳载具均已“就位”:
特遣部队1:1 沃尔科夫
特遣部队2:1 犰狳载具
特遣部队3:1 沃尔科夫 + 1 犰狳载具
局部变量1:Volkov Ready,初始值0
局部变量2:ARMA Ready,初始值0
动作脚本1:(1)移动到路径点0;(2)设置局部变量1
动作脚本2:(1)移动到路径点0;(2)设置局部变量2
动作脚本3:(1)装载;(2)移动到路径点1;(3)卸载,附加选项选择2,即丢弃载具,保留载员;(4)移动到路径点2;(5)删除小队成员
作战小队1:特遣部队1,动作脚本1,勾选“小队成员可被AI重组”
作战小队2:特遣部队2,动作脚本2,勾选“小队成员可被AI重组”
作战小队3:特遣部队3,动作脚本3,勾选“忽视阻拦”
触发1:条件略,结果1:4,建立作战小队1;结果2:4,建立作战小队2
触发2:条件1:局部变量1被设置;条件2:局部变量2被设置;结果:4,建立作战小队3.
以上两篇专栏是关于局部变量的所有内容。局部变量的用法非常灵活,不限于我在专栏里讲的这些。有时当触发条件或者触发之间的“允许/禁止”关系比较复杂时,可以考虑使用局部变量来使触发设计变得更简单。之后也有可能在杂谈中分享更多我在画地图的过程中使用局部变量的例子。