心靈終結(jié)3.3.6地圖編輯器萌新教程第21篇:局部變量(二)
????本篇延續(xù)上一篇的內(nèi)容,舉更多的例子來說明局部變量的用法。
一、局部變量用作觸發(fā)的條件和結(jié)果
例1:
????我們更進(jìn)一步地討論在上一篇專欄例5中的觸發(fā):
????想要實(shí)現(xiàn)的效果:如果玩家在游戲開始前30分鐘內(nèi)進(jìn)入過敵軍基地,則在游戲開始30分鐘時(shí)刷出一批敵軍。
????“刷出敵軍”這一結(jié)果的實(shí)現(xiàn)需要兩個(gè)條件:(1)游戲開始30分鐘;(2)游戲前30分鐘玩家進(jìn)入過某區(qū)域。
????在上一篇中,我們已經(jīng)講過為什么不能把這兩個(gè)條件用作同一個(gè)觸發(fā)的條件1和條件2. 我們使用了兩個(gè)觸發(fā)來表示這兩個(gè)條件:
????觸發(fā)1:條件:流逝時(shí)間30分鐘,結(jié)果待定;
????觸發(fā)2:條件:進(jìn)入事件,結(jié)果待定。
????如果觸發(fā)1的結(jié)果寫“援軍”,觸發(fā)2的結(jié)果寫“允許觸發(fā)1”,那么效果應(yīng)該是玩家進(jìn)入敵方基地之后,再過30分鐘刷出援軍;如果觸發(fā)2的結(jié)果寫“援軍”,觸發(fā)1的結(jié)果寫“允許觸發(fā)2”,那么效果應(yīng)該是游戲開始30分鐘之后,玩家首次進(jìn)入敵軍基地時(shí)刷出援軍。這都和我們想要的效果不符。
????因此,我們又建立了第三個(gè)觸發(fā):
????觸發(fā)3:條件待定,結(jié)果:刷出援軍。
????注:在這里我們不考慮游戲開始30分鐘以后發(fā)生的事情,比如,如果玩家在前30分鐘沒有進(jìn)入敵軍基地,而在第40分鐘進(jìn)入了,那么第40分鐘是會(huì)刷兵還是無事發(fā)生?根據(jù)不同的需要,我們可能還要建立新的觸發(fā)。在此我們只考慮前30分鐘的事。
????我們需要的是當(dāng)觸發(fā)1和2都完成才允許觸發(fā)3,然而,如果我們將觸發(fā)3的條件寫為任意事件,初始禁止,將觸發(fā)1和觸發(fā)2的結(jié)果都寫成“允許觸發(fā)3”,這兩個(gè)“允許觸發(fā)”是“或”的關(guān)系,即其中任何一個(gè)觸發(fā)之后都可以單獨(dú)允許觸發(fā)3,但我們需要的“且”的關(guān)系。
????因此,我們將其中一個(gè)“允許觸發(fā)”保留,而將另一個(gè)“允許觸發(fā)”改成局部變量。我們將觸發(fā)1的結(jié)果寫為“允許觸發(fā)3”,觸發(fā)2的結(jié)果寫為“設(shè)置局部變量A”,將觸發(fā)3的條件寫為“局部變量A被設(shè)置”。
????那么,大家可能會(huì)有以下幾個(gè)問題:
????1、是否可以將觸發(fā)2的結(jié)果寫為“允許觸發(fā)3”,將觸發(fā)1的結(jié)果寫為“設(shè)置局部變量A”,將觸發(fā)3的結(jié)果寫為“局部變量A被設(shè)置”?
????可以。當(dāng)前30分鐘進(jìn)入敵軍基地時(shí),觸發(fā)3會(huì)被允許,一旦到了30分鐘局部變量被設(shè)置,就會(huì)觸發(fā)援軍。
????2、是否可以將兩個(gè)“允許觸發(fā)”都轉(zhuǎn)換為局部變量?
????可以。比如觸發(fā)1的結(jié)果為“設(shè)置局部變量A”,觸發(fā)2的結(jié)果為“設(shè)置局部變量B”,觸發(fā)3的條件1和條件2分別為“局部變量A被設(shè)置”和“局部變量B被設(shè)置”。
????3、如果使用了局部變量,能否刪去觸發(fā)3,只用觸發(fā)1和2實(shí)現(xiàn)這個(gè)效果?比如在一個(gè)觸發(fā)的結(jié)果中添加“設(shè)置局部變量”,另一個(gè)觸發(fā)的條件中添加“局部變量被設(shè)置”。
????不可以。我們分兩種情況:
????(1)觸發(fā)1:條件:流逝時(shí)間30分鐘,結(jié)果:設(shè)置局部變量A
???????????? 觸發(fā)2:條件1:進(jìn)入事件,條件2:局部變量A被設(shè)置,結(jié)果:刷出援軍
????????這實(shí)際上又回到了我們?cè)谏弦黄?中提到的“第二種錯(cuò)誤實(shí)現(xiàn)方法”。“進(jìn)入事件”是一個(gè)“瞬間型條件”,前30分鐘該條件被滿足的信息不會(huì)一直保留到第30分鐘局部變量被設(shè)置的時(shí)候;
????(2)觸發(fā)1:條件1:流逝時(shí)間30分鐘,條件2:局部變量A被設(shè)置,結(jié)果:刷出援軍
???????? ????觸發(fā)2:條件:進(jìn)入事件,結(jié)果:設(shè)置局部變量A.
??? 這涉及到了下一個(gè)問題:當(dāng)一個(gè)觸發(fā)有兩個(gè)條件,其中一個(gè)是“流逝時(shí)間”時(shí),具體如何判定?(只在單次觸發(fā)的條件下討論,不涉及重復(fù)觸發(fā))
??? 當(dāng)一個(gè)觸發(fā)有兩個(gè)條件,其中條件1為“流逝時(shí)間”時(shí),我們按照條件2的類型,分3種情況:瞬間型條件、一般的持續(xù)型條件、局部變量條件。我們?cè)谏弦黄姓f“局部變量條件(條件36和37)”屬于“持續(xù)型條件”,但是在這個(gè)問題中,它和一般的持續(xù)型條件還有區(qū)別,因此單獨(dú)分為一項(xiàng)。
??? (i) 當(dāng)條件2為瞬間型條件時(shí),在流逝時(shí)間結(jié)束之前,不論這個(gè)瞬間型條件被滿足多少次都是沒有用的;在流逝時(shí)間結(jié)束之后,條件1“流逝時(shí)間”被視為一直滿足(即可以將它看成一個(gè)持續(xù)型條件),此后首次滿足條件2的時(shí)刻即為觸發(fā)時(shí)刻。(可以結(jié)合后面舉的例子來理解)
??? (ii)當(dāng)條件2為持續(xù)型條件時(shí),如果在流逝時(shí)間結(jié)束之前該條件被滿足,則一旦流逝時(shí)間結(jié)束就會(huì)立刻觸發(fā);如果流逝時(shí)間結(jié)束時(shí)該條件還未被滿足,則在此后該條件首次被滿足時(shí)觸發(fā)。
??? (iii)當(dāng)條件2為局部變量型條件時(shí),在局部變量的條件未被滿足時(shí),“流逝時(shí)間”這一項(xiàng)的計(jì)時(shí)不會(huì)開始。只有當(dāng)局部變量條件被滿足之后,再經(jīng)過“流逝時(shí)間”條件相應(yīng)的時(shí)間,才會(huì)觸發(fā)結(jié)果。
????我們通過舉例來說明:
????例1.1:觸發(fā)條件1為“流逝時(shí)間60秒”,條件2為“關(guān)聯(lián)對(duì)象被摧毀”,關(guān)聯(lián)對(duì)象為地圖上盟軍建造場(chǎng)。結(jié)果為文本觸發(fā)事件。那么在進(jìn)入游戲之后,如果在第50秒摧毀了建造場(chǎng),此時(shí)條件1還沒有被滿足,所以不會(huì)觸發(fā)文本;再過10秒之后,條件1滿足,但由于條件2是一個(gè)“瞬時(shí)型條件”,只在建造場(chǎng)被摧毀的一瞬間會(huì)被判定為“滿足條件”,所以在第60秒時(shí)條件2不滿足,因此仍然不會(huì)觸發(fā)文本。如果進(jìn)入游戲之后第70秒摧毀了建造場(chǎng),由于在第60秒之后條件1就一直滿足,在第70秒摧毀建造場(chǎng)時(shí)條件2也滿足,因此此時(shí)會(huì)觸發(fā)文本。
????例1.2:觸發(fā)條件1為“流逝時(shí)間60秒”,條件2為“所屬方不存在科技類型”,科技類型為盟軍建造場(chǎng),數(shù)值填0,觸發(fā)所屬方為美國(guó),在地圖上放一個(gè)美國(guó)的盟軍建造場(chǎng)。觸發(fā)結(jié)果為文本觸發(fā)事件。那么在進(jìn)入游戲之后,如果在第50秒摧毀了盟軍建造場(chǎng),由于條件2是一個(gè)“持續(xù)型條件”,因此從此之后條件2就一直滿足(除非地圖上又出現(xiàn)了一個(gè)美國(guó)的盟軍建造場(chǎng)),那么再過10秒之后就會(huì)觸發(fā)文本;如果第進(jìn)入游戲之后第70秒摧毀了建造場(chǎng),那么與上一例類似,也會(huì)立刻顯示文本。
????例1.3:觸發(fā)1:條件1為“流逝時(shí)間60秒”,條件2為“局部變量A被設(shè)置”,結(jié)果為文本觸發(fā)事件。觸發(fā)2的條件為“關(guān)聯(lián)對(duì)象被摧毀”,關(guān)聯(lián)對(duì)象為盟軍建造場(chǎng),結(jié)果為“設(shè)置局部變量A”。局部變量A的初始值為0。在觸發(fā)1中,條件2為局部變量條件,只有當(dāng)這個(gè)條件被滿足時(shí),條件1中的計(jì)時(shí)器才會(huì)開啟。因此,如果在進(jìn)入游戲50秒時(shí)摧毀了建造場(chǎng),那么會(huì)在第110秒時(shí)觸發(fā)文本,70秒摧毀建造場(chǎng)則在第130秒觸發(fā)文本。
????因此第(2)種觸發(fā)設(shè)計(jì)方式實(shí)現(xiàn)的效果是“進(jìn)入敵軍基地之后再過30分鐘刷出援軍”,而不是我們想要的效果。
例2:“觸發(fā)所屬方”不同時(shí)使用局部變量
????有的觸發(fā)條件或者結(jié)果需要用到“觸發(fā)所屬方”,也就是在“觸發(fā)選項(xiàng)”中的那個(gè)“所屬方”選項(xiàng)。但有時(shí),我們需要使用多個(gè)條件作為一個(gè)觸發(fā)結(jié)果實(shí)現(xiàn)的前提,但這些條件要使用的“觸發(fā)所屬方”不同。
????比如:在《守護(hù)》第2關(guān)中,當(dāng)兩座盟軍基地均被摧毀時(shí),判定任務(wù)完成。兩個(gè)盟軍基地的所屬方分別是美國(guó)和歐盟。
????判定一座基地被摧毀的條件是“17:不再有工廠(生產(chǎn)建筑)”(在此強(qiáng)烈譴責(zé)那些把勝利條件設(shè)為“所有對(duì)象都被摧毀”,還不做賣家沖鋒觸發(fā)的戰(zhàn)役!?。。?/span>。這個(gè)條件需要設(shè)置“觸發(fā)所屬方”,也就是說當(dāng)觸發(fā)所屬方不再有生產(chǎn)建筑時(shí)滿足條件。
????然而,我們沒有辦法把兩個(gè)所屬方都沒有生產(chǎn)建筑的條件寫到一個(gè)觸發(fā)中,因?yàn)橐粋€(gè)觸發(fā)的“觸發(fā)所屬方”是唯一的。所以我們使用局部變量:
????觸發(fā)1:觸發(fā)所屬方:美國(guó);條件:不再有工廠;結(jié)果:設(shè)置局部變量A
????觸發(fā)2:觸發(fā)所屬方:歐盟;條件:不再有工廠;結(jié)果:設(shè)置局部變量B
????觸發(fā)3:條件1:局部變量A被設(shè)置;條件2:局部變量B被設(shè)置;結(jié)果:與任務(wù)完成相關(guān)。
????如果不使用局部變量,能實(shí)現(xiàn)這樣的效果嗎?可以,但比較麻煩:
????觸發(fā)1:觸發(fā)所屬方:美國(guó);條件:不再有工廠;結(jié)果:任務(wù)完成;初始禁止
????觸發(fā)2:觸發(fā)所屬方:歐盟;條件:不再有工廠;結(jié)果:任務(wù)完成;初始禁止
????觸發(fā)3:觸發(fā)所屬方:美國(guó);條件:不再有工廠;結(jié)果1:允許觸發(fā)2;結(jié)果2:摧毀觸發(fā)1;初始允許
????觸發(fā)4:觸發(fā)所屬方:歐盟;條件:不再有工廠;結(jié)果1:允許觸發(fā)1;結(jié)果2:摧毀觸發(fā)2,初始允許
????如果敵軍基地的數(shù)量是N個(gè),那么使用局部變量需要建立的觸發(fā)是N+1個(gè),而不使用局部變量需要建立的觸發(fā)是N * N個(gè)(感興趣的可以想想為什么是這么多個(gè),怎么設(shè)置)。
????除此之外,當(dāng)出現(xiàn)一個(gè)觸發(fā)的條件為“占領(lǐng)建筑A+摧毀建筑B”這樣需要使用兩個(gè)關(guān)聯(lián)對(duì)象的情況時(shí),也可以使用完全相同的方法設(shè)置兩個(gè)局部變量。(教程第4篇最后的問題4)
二、局部變量聯(lián)系“動(dòng)作腳本”和“觸發(fā)”
????有時(shí)候,我們想要讓一個(gè)作戰(zhàn)小隊(duì)執(zhí)行完一個(gè)動(dòng)作腳本,或者將一個(gè)動(dòng)作腳本執(zhí)行到某一步時(shí),觸發(fā)某一結(jié)果。但如何將“動(dòng)作腳本”和“觸發(fā)結(jié)果”聯(lián)系起來?局部變量可以很容易地實(shí)現(xiàn)這個(gè)效果。在動(dòng)作腳本中,行為39和40可以用于設(shè)置和清除局部變量。
例3:運(yùn)輸艇卸載后返回。
????我們需要實(shí)現(xiàn)這樣一個(gè)效果:每隔300秒(重復(fù)觸發(fā)),從地圖外的路徑點(diǎn)0刷出來一個(gè)蘇軍運(yùn)輸艇(SAPC),裝有2個(gè)犀牛坦克(HTNK),該運(yùn)輸艇移動(dòng)到路徑點(diǎn)1之后卸載,然后運(yùn)輸艇原路返回,犀牛坦克攻擊玩家。
????我們?cè)凇白鲬?zhàn)小隊(duì)(三)”這一篇教程中說過,“作戰(zhàn)小隊(duì)”中“運(yùn)輸艇卸載后返回”并沒有什么用,要實(shí)現(xiàn)這一效果需要使用局部變量將動(dòng)作腳本與觸發(fā)聯(lián)系起來,具體方法如下:
????局部變量A:SAPC unload,初始值0
????特遣部隊(duì)1:1 SAPC,2 HTNK
????特遣部隊(duì)2:1 SAPC
????動(dòng)作腳本1:
????(1)移動(dòng)到路徑點(diǎn)1
????(2)卸載,附加選項(xiàng)選擇“2:丟棄載具,保留載員”,這個(gè)選項(xiàng)意思是說只有載員(犀牛坦克)參與之后的動(dòng)作腳本(攻擊等),而載具(運(yùn)輸艇)不會(huì)。
????(3)設(shè)置局部變量A
????(4)攻擊
????動(dòng)作腳本2:移動(dòng)到路徑點(diǎn)0
????作戰(zhàn)小隊(duì)1:特遣部隊(duì)1,動(dòng)作腳本1,路徑點(diǎn)0,勾選“裝載部隊(duì)”“忽視阻攔”和“小隊(duì)成員可被AI重組”
????作戰(zhàn)小隊(duì)2:特遣部隊(duì)2,動(dòng)作腳本2,路徑點(diǎn)1,勾選“忽視阻攔”
????觸發(fā)1:刷出運(yùn)輸艇和犀牛坦克
????????類型:2(重復(fù))
????????條件:流逝時(shí)間300秒
????????結(jié)果:7:援軍:作戰(zhàn)小隊(duì)1
????觸發(fā)2:運(yùn)輸艇返回
????????類型:2(重復(fù))
????????條件:局部變量A被設(shè)置
????????結(jié)果1:4:建立作戰(zhàn)小隊(duì):作戰(zhàn)小隊(duì)2
????????結(jié)果2:清除局部變量A
例4:
????在《守護(hù)》第5關(guān)開頭過場(chǎng)中,需要實(shí)現(xiàn)這樣一個(gè)效果:沃爾科夫和犰狳載具同時(shí)前往路徑點(diǎn)0,然后沃爾科夫上車,前往戰(zhàn)地醫(yī)院附近(路徑點(diǎn)1),然后沃爾科夫下車,“進(jìn)入”戰(zhàn)地醫(yī)院(實(shí)際上是移動(dòng)到路徑點(diǎn)2+刪除沃爾科夫)。我們采用局部變量的方法來判斷沃爾科夫和犰狳載具均已“就位”:
????特遣部隊(duì)1:1 沃爾科夫
????特遣部隊(duì)2:1 犰狳載具
????特遣部隊(duì)3:1 沃爾科夫 + 1 犰狳載具
????局部變量1:Volkov Ready,初始值0
????局部變量2:ARMA Ready,初始值0
????動(dòng)作腳本1:(1)移動(dòng)到路徑點(diǎn)0;(2)設(shè)置局部變量1
????動(dòng)作腳本2:(1)移動(dòng)到路徑點(diǎn)0;(2)設(shè)置局部變量2
????動(dòng)作腳本3:(1)裝載;(2)移動(dòng)到路徑點(diǎn)1;(3)卸載,附加選項(xiàng)選擇2,即丟棄載具,保留載員;(4)移動(dòng)到路徑點(diǎn)2;(5)刪除小隊(duì)成員
????作戰(zhàn)小隊(duì)1:特遣部隊(duì)1,動(dòng)作腳本1,勾選“小隊(duì)成員可被AI重組”
????作戰(zhàn)小隊(duì)2:特遣部隊(duì)2,動(dòng)作腳本2,勾選“小隊(duì)成員可被AI重組”
????作戰(zhàn)小隊(duì)3:特遣部隊(duì)3,動(dòng)作腳本3,勾選“忽視阻攔”
????觸發(fā)1:條件略,結(jié)果1:4,建立作戰(zhàn)小隊(duì)1;結(jié)果2:4,建立作戰(zhàn)小隊(duì)2
????觸發(fā)2:條件1:局部變量1被設(shè)置;條件2:局部變量2被設(shè)置;結(jié)果:4,建立作戰(zhàn)小隊(duì)3.
????以上兩篇專欄是關(guān)于局部變量的所有內(nèi)容。局部變量的用法非常靈活,不限于我在專欄里講的這些。有時(shí)當(dāng)觸發(fā)條件或者觸發(fā)之間的“允許/禁止”關(guān)系比較復(fù)雜時(shí),可以考慮使用局部變量來使觸發(fā)設(shè)計(jì)變得更簡(jiǎn)單。之后也有可能在雜談中分享更多我在畫地圖的過程中使用局部變量的例子。