|
本帖最后由 playif 于 2013-8-1 12:13 编辑
最近研究了一下Marker的使用方式,感覺網路上的資料大多不全,只教你怎麼套著用,對於要自己創造複雜技能的幫助還是有限。於是自己做了點研究,並將心得分享出來。
閱讀本文需對於Data 有基本了解,而且本文有許多假設是根據Try&Error得出,有不懂或是發現錯誤的地方歡迎交流。
先說一下Marker的功能吧,主要限制一次的施放(技能,武器或效果)中,每個目標受到影響的次數。限制的方式就是透過Validator中的Marker count 來指定。
但是具體是怎麼運作?幾乎每個effect,effect ability , weapon 都可以指定marker。還有marker本身又有許多子欄位,但Valodator 卻只能比較數量。
事實上具體的運作方式只有官方自己才會知道,在沒有文件的情況下,我經過測試後自行推測其運作機制如下:
假設1. marker 是標記在單位身上,並且有一個特定的生命週期。
這比較容易理解,我們就是在unit 上打一個marker,避免他被重複計算傷害,而且marker一定有結束的時候,否則照理說整場遊戲只會被傷害一次。
然而,這個週期似乎又不是以一次的攻擊(或技能)來決定,設定Marker 的位置(在整個effect鏈)似乎又會左右其結果。於是我們需要更多假設。
假設2. marker 的生命週期取決於設定marker 的effect,而effect週期的結束則代表該effect的所有子節點effect 都執行完。
什麼意思呢?假設你現在有一個週期性的effect (persistent),每次週期發動一個傷害effect。那marker 和驗證器(validator) 分別該放在哪裡?
有經驗的人一下就知道:在週期性effect 設定marker,在傷害effect 設定validator。但是...why?為了解釋這一問題,我又做了如下假設。
假設3. marker 的設定只決定其生命週期,並不一定會馬上套用marker 到單位身上 (至於到底會不會請看假設5)。
(先釐清一下,"套用marker"指的是marker count 真的會+1的時機,是在遊戲中才會發生; 而"設定marker"指的是你在data 中設定marker的欄位)
這樣想就說的通了,以上面的那問題為例,在週期性effect 設定marker只是先宣告之後的effect會套用該marker到單位身上。實際會增加marker 的時間點是在傷害的effect。這同時也說明了為何只在傷害effect 設定marker會導致整個驗證失效,因為每次傷害一結束(其實是一瞬間的事),marker的生命週期也跟著結束,下次的傷害(雖然是透過週期effect發動,例屬於同一次發動的攻擊/技能) ,但仍然沒有marker在目標身上。
好,看到這裡你可能會想,那如果我在週期effect 和傷害effect都設定marker,那會怎樣呢? 經過幾個實驗,我又做了一個假設如下。
假設4. 驗正器只會比較最接近於驗正器位置的marker。
也就是傷害effect所設置的marker,因此會造成結果跟只在傷害effect設置marker 一樣。
那原本週期effect的marker呢?也還是在,但是因為驗正器的位置在傷害effect 那邊,所以就被蓋掉了兒已。
這道理有點像程式的變數,scope不一樣但變數名稱一樣的時候,越接近(越小)的scope的變數會被優先使用。
其實說穿了,就是marker最好是在週期effect 那裡,然後在之後的effect 都不要設定。好啦,如果只寫到這裡,你可能會覺得廢話一堆結論卻是個屁!
到底知道上面的假設有什麼幫助呢? 其實這只是基礎而已,還有幾個問題要繼續釐清,才有辦法真正應用marker。
假設5. 不是每個effect 都會套用marker到單位身上,即使在其父結點effect 已經設定過marker。
我可以肯定的是,傷害effect和modify unit effect會套用marker。而像週期effect,search area effect,set effect等則不會。我推測是有明確target unit 才有機會基會套用marker,然而像是create unit effect 這類的也不行(我推測是要直接對target 有影響的才行)。另外,比較奇怪的是指定單位的技能會直接套用marker,而weapon則不會直接套用。
好,到這裡事情逐漸明朗了,我想說的是,marker最好只設定一次(在整個effect 鏈中),並且越接近整個effect鏈的起點越不會出錯,驗正器則放在你真正想限制是否執行的effect上。如果你想要用一些奇奇怪怪的特效,或是靠驗證器做出迴圈的效果,可以用個零傷害或無修改的effect來標記單位,配合set effect 來達到你的目的。
舉個例子,我就直接說我做了甚麼吧(這也是我研究marker,和這篇文章誕生的關係),一個不靠behavior的連鎖生成小狗的技能。所謂"連鎖"就是像連鎖閃電一樣,對於每個敵人的旁邊都產生一隻小狗,產生過小狗的敵人身邊不會重複產生,總共產生小狗的上限在驗證器裡決定(這樣一來只要改變驗正器裡的數字就可已決定總共要產生幾隻小狗)。
整個effect 鏈如下圖,將marker設定在最左邊的initial effect (一個只執行一次的週期effect),然後執行一個set effect,裡需要兩個驗正器(一個目標一個施法者),目標驗證器的上限是1,施法者驗正器的上限看你想總共產生幾知小狗(施法者的驗正器要改unit 欄位為caster)。另外需要一個產生小狗的effect,兩個"無修改"effect(目標跟師法者各套一個,施法者那個要改impact unit 欄位為caster),一個週期effect(為了delay用)。然後週期effect執行搜尋effect(可以設定排序找最接近的單位),只找一個為上限,就再執行set effect (也就是圖中最下面那條怪怪的線,靠他實現了迴圈,終止條件則靠驗證器控制,要注意marker的設定要在迴圈的外層,理由前面提過,所以才需要最左邊那個initial effect)。
最後的最後,一直提到設定marker,但marker 到底要怎麼設定?
首先,link欄位跟底下match flags 的link 有關(也就是如果你下面沒有勾選link,那上面的link 也不用設定了)。
count數一般設為1就好,就是套用一次marker 實際增加的次數。
右下的mismatch flags 可以忽略了,幾乎用不到。
剩下的match flags (原則上四選一就好,複選的話就是邏輯且的運算):
casting player: 同一個玩家不會重複對目標造成傷害,對於你有兩個以上的施法者,而且要在設定marker 的effect 結束前才有效(簡而言之如果沒有週期性之類的effect 的話其實marker 幾乎都拍不上用場,不然就要剛好同時發動)。
casting unit: 同一個單位不會重複對目標造成傷害,對於你有一個單位擁有兩個一樣的技能(或因為CD很短讓你可以在effect結束前施放兩次該技能),其他同上。
casting id: 同一次施放技能/武器/效果,不會重複對目標造成傷害,其他同上。基本上沒有特殊理由的話,勾這個就好,比較不會有問題。
Link: 同一個effect/ability/weapon 不會重複對目標造成傷害,其他同上。基本上這個可以配合casting player,不然範圍有點太大,除非你想做類似無差別攻擊之類的marker。
總算完成了~注意一下,之所以說假設就是不確定,只是我盡可能的實驗過各種情況得出的結論而已。歡迎交流。
補充:
看了頭目提示的連結:
裡面提問者問到這個效果:
發射8個光束,平均攻擊附近的單位。
有8個單位就每人打一下,2個單位就每人4下,1個單位就8下全中。
是靠目標排序實現的吧?
我嘗試用文章提到的概念和我自己的理解來實現,
用了三個effect,整個鏈如下:
週期 Effect --> search area effect --> 傷害 effect
代碼如下:
週期 Effect: 週期設8次,設定marker。 (可以在這裡設定時間間格)- <CEffectCreatePersistent id="HitInitial">
- <EditorCategories value=""/>
- <PeriodCount value="8"/>
- <PeriodicEffectArray value="HitSearch"/>
- <Marker Link="">
- <MatchFlags index="Id" value="1"/>
- </Marker>
- </CEffectCreatePersistent>
复制代码 search area effect: 以marker 排序,以自己為中心(CenterAtLaunch)- <CEffectEnumArea id="HitSearch">
- <EditorCategories value=""/>
- <SearchFilters value="-;Self,Player,Ally,Neutral,Missile,Item,Cloaked,Dead"/>
- <TargetSorts>
- <SortArray value="TSMarker"/>
- </TargetSorts>
- <AreaArray MaxCount="1" Radius="5" Effect="HitDamage"/>
- <SearchFlags index="CenterAtLaunch" value="1"/>
- <SearchFlags index="OffsetAreaByAngle" value="0"/>
- </CEffectEnumArea>
复制代码 傷害effect 沒啥好說的~- <CEffectDamage id="HitDamage">
- <EditorCategories value=""/>
- <Amount value="5"/>
- </CEffectDamage>
复制代码 居然就成功了~~ (頗有成就感XD)
|
|