最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

騎砍mod程序理論獨(dú)家--物體頂點(diǎn)動(dòng)畫(huà)控制原理及應(yīng)用

2023-01-09 10:25 作者:killyouready  | 我要投稿

前言:在騎砍里大家所接觸到的動(dòng)畫(huà)大多是骨骼動(dòng)畫(huà),并且是代碼程序可控的;還有少量頂點(diǎn)動(dòng)畫(huà),大多數(shù)人處理的場(chǎng)合就是大地圖的圖標(biāo)以及部分盾牌弓箭類(lèi)的武器;以及shader等手段產(chǎn)生的類(lèi)似UV材質(zhì)變化的動(dòng)畫(huà)效果。實(shí)際上動(dòng)畫(huà)對(duì)于游戲是一個(gè)比較廣義的概念,比如粒子的放大縮小、貼圖的rgb變化都可以看作動(dòng)畫(huà),并且部分系統(tǒng)能夠用代碼進(jìn)行模擬也可以用模型手段做出。所以我將對(duì)大家不經(jīng)?;蛉狈Ρ匾夹g(shù)研究支持的頂點(diǎn)動(dòng)畫(huà)和2D序列圖動(dòng)畫(huà)系統(tǒng)作出獨(dú)家系統(tǒng)研究體系的分享和講解。
本貼主要講下頂點(diǎn)動(dòng)畫(huà)。主要是場(chǎng)景物的頂點(diǎn)動(dòng)畫(huà),因?yàn)槠渌淦鞔蟮貓D圖標(biāo)的常規(guī)ms不可控并且不是技術(shù)盲區(qū)可搜索到,所以這些我不講。


一、頂點(diǎn)動(dòng)畫(huà)模型的制作
1.騎砍適用的頂點(diǎn)動(dòng)畫(huà)即md3格式的動(dòng)畫(huà)模型的來(lái)歷:
最初來(lái)自一款射擊游戲鼻祖雷神之錘的續(xù)作quake3,基于制作反恐精英cs的半條命1代,steamG胖發(fā)家的游戲就是由這個(gè)quake1和2代引擎結(jié)合編出來(lái)的,quake系列123,分別采用的模型格式mdl、md2、md3進(jìn)化,也就是md3是最古老的真正的3d動(dòng)畫(huà)格式,是游戲史上頂點(diǎn)動(dòng)畫(huà)向骨骼動(dòng)畫(huà)的最后的過(guò)渡技術(shù)(因?yàn)閙d3其實(shí)也算骨骼動(dòng)畫(huà),quake3的人物基本分成upper上半身,lower下半身和head頭部,三個(gè)部分,每個(gè)部分都是純md3頂點(diǎn)動(dòng)畫(huà),但是有一個(gè)cfg文件強(qiáng)行以骨骼模擬的方式在upper與head,lower與upper之間分別構(gòu)造了一根骨骼,也就是兩個(gè)單根骨骼動(dòng)畫(huà)串了3個(gè)頂點(diǎn)動(dòng)畫(huà),所以說(shuō)這個(gè)是骨骼動(dòng)畫(huà)過(guò)渡的雛形)。


2.md3動(dòng)畫(huà)技術(shù)在騎砍深度運(yùn)用的模型動(dòng)畫(huà)技術(shù)瓶頸:
一般對(duì)于有一點(diǎn)模型動(dòng)畫(huà)軟件使用基礎(chǔ)的人來(lái)說(shuō),頂點(diǎn)動(dòng)畫(huà)的制作他們會(huì)采用模型動(dòng)畫(huà)軟件對(duì)動(dòng)畫(huà)模型逐幀導(dǎo)出obj再導(dǎo)入openbrf在滿足各幀模型頂點(diǎn)面數(shù)坐標(biāo)一樣時(shí)全選右鍵點(diǎn)擊“merge frames as in a vertex ani”合成頂點(diǎn)動(dòng)畫(huà)模型,這個(gè)是一個(gè)繁瑣的方法,試問(wèn),如果幀數(shù)成百上千,你該怎么辦,如果模型具有多個(gè)分割部分對(duì)應(yīng)多個(gè)材質(zhì)貼圖,那你還要每個(gè)mesh部分分別合成幀,你的工作量又是成倍,甚至你導(dǎo)出后并不能保證各幀模型頂點(diǎn)面數(shù)坐標(biāo)一樣。


3.模型動(dòng)畫(huà)技術(shù)瓶頸在騎砍如何突破:
所以我手上有一個(gè)這種動(dòng)畫(huà)高效處理的軟件,可以對(duì)主流綁定動(dòng)畫(huà)的模型格式dae,fbx等等進(jìn)行一鍵整體轉(zhuǎn)化md3,哪怕一萬(wàn)幀也是幾秒轉(zhuǎn)化的事情,這個(gè)軟件看大家對(duì)此技術(shù)學(xué)習(xí)的需求積不積極再分享。

所以我的制作步驟是,先準(zhǔn)備好綁定全體動(dòng)畫(huà)的動(dòng)畫(huà)模型,最佳模型格式是fbx(最好設(shè)置成2014二進(jìn)制格式,ASCII版本整體轉(zhuǎn)換后容易塌陷)或mdl(這個(gè)常見(jiàn)半條命反恐精英這種游戲,因?yàn)閙dl是md3的兒子,轉(zhuǎn)換會(huì)比較完美),如果是max請(qǐng)導(dǎo)出fbx,dae等容易被其他動(dòng)畫(huà)格式導(dǎo)出塌陷。然后用我的軟件資源直接轉(zhuǎn)換md3格式.

其他建議:如果源動(dòng)畫(huà)比較多,最好在max里先等比壓縮一下關(guān)鍵幀數(shù)量再導(dǎo)出fbx等常規(guī)動(dòng)畫(huà)模型再轉(zhuǎn)md3.??給個(gè)參考數(shù)據(jù),單個(gè)頂點(diǎn)動(dòng)畫(huà)導(dǎo)入brf后的brf文件大小一般是模型面數(shù)(單位:萬(wàn))x關(guān)鍵幀數(shù)/5~7 =。。。(單位MB),也就是打比方我的嘉然模擬器一個(gè)嘉然頂點(diǎn)動(dòng)畫(huà)模型就是接近20萬(wàn)面的模型x26幀數(shù),結(jié)果到達(dá)80多兆,所以單體玩家使用的頂點(diǎn)動(dòng)畫(huà)模型你可以偶爾有個(gè)達(dá)到100兆的,但是其他ai單位最好限制在20兆以下。至于brf最大能容納多大一個(gè)頂點(diǎn)動(dòng)畫(huà)模型,我最大塞過(guò)500兆的,但是塞之前的原始md3模型沒(méi)這么大,因?yàn)槿M(jìn)去后brf大小會(huì)是模型大小擴(kuò)大后的3~6倍,所以一般往brf塞80兆以上的md3原始文件就容易導(dǎo)致brf奔潰跳出了。至于對(duì)性能的影響,這個(gè)不能拋開(kāi)數(shù)量談性能,就是哪怕你一個(gè)動(dòng)畫(huà)模型200兆,只要你只一個(gè)場(chǎng)景加載一兩個(gè),不會(huì)影響流暢,如果電腦比較好,理想情況是運(yùn)行還流暢著然后很快到了內(nèi)存溢出的上限c++run error,所以就看吧,你一個(gè)場(chǎng)景加載的這種模型總大小有沒(méi)有超出1個(gè)gb,太多容易跳出。


然后是關(guān)于碰撞體設(shè)置的問(wèn)題,場(chǎng)景物的頂點(diǎn)動(dòng)畫(huà)不會(huì)改變碰撞體,也就是場(chǎng)景物定義的是什么碰撞體模型,無(wú)論怎么播放動(dòng)畫(huà)都不會(huì)改變,所以這個(gè)碰撞體怎么設(shè)置要具體對(duì)象具體分析,比如和戰(zhàn)團(tuán)差不多的人如果采用跟隨agent換皮控制的方式,可以不設(shè)實(shí)際的場(chǎng)景物碰撞體為空,如果是一些機(jī)械類(lèi),可以根據(jù)本身的形態(tài)簡(jiǎn)化處理,降低負(fù)擔(dān),比如坦克,你可以兩個(gè)柱體重合加個(gè)桿子,避免直接按原始高面數(shù)生成碰撞體,因?yàn)閳?chǎng)景物控制運(yùn)動(dòng)帶來(lái)的負(fù)擔(dān)受模型面數(shù)的影響,碰撞體的面數(shù)影響是遠(yuǎn)大于顯示的模型外形本身的。

4.一些頂點(diǎn)動(dòng)畫(huà)模型參考實(shí)例:
我的魔獸爭(zhēng)霸modhttps://bbs.mountblade.com.cn/thread-2094063-1-1.html和七龍珠modhttps://bbs.mountblade.com.cn/thread-2093251-1-1.html擁有騎砍界絕大部分的高幀頂點(diǎn)動(dòng)畫(huà)模型數(shù)量,包含各種生物機(jī)械裝置戰(zhàn)車(chē)飛行器以及含有頂點(diǎn)動(dòng)畫(huà)的特效模型。你在其他mod基本很少能看到這類(lèi)模型,有也不超過(guò)30幀并且動(dòng)作種類(lèi)單一??梢詤⒖伎纯矗遣灰S意提取用到其他mod里.然后下面我具體代碼示例的魔獸英雄模型是到第一個(gè)鏈接里找所有human_,orc_,nightelf_,undead_,monster_這些前綴的brf,這些一個(gè)brf裝一個(gè)英雄或普通單位動(dòng)畫(huà)模型。然后動(dòng)畫(huà)特效一般是eft后綴的brf里。




二、相關(guān)op制作mod的騎砍版本最好要高于1.161,也就是你一般騎砍版本高于1.161就會(huì)得到很多新的神奇實(shí)用操作,基本滿足目前特殊題材mod制作的高度和大部分mod的運(yùn)行,后續(xù)版本更新的東西只是為了dlc的小補(bǔ)充,所以如果不用最新版本制作至少也要保證版本大于1.161


講op前先介紹相關(guān)參數(shù)在brf里的體現(xiàn):打開(kāi)有頂點(diǎn)動(dòng)畫(huà)模型的brf,選中頂點(diǎn)動(dòng)畫(huà)模型看右側(cè)面板的數(shù)據(jù),和動(dòng)畫(huà)幀數(shù)有關(guān)的有兩個(gè)格子的數(shù)據(jù)排列,右處為幀時(shí)刻,是下列op的value或frame要填的數(shù)據(jù),也就是動(dòng)畫(huà)模型的某幀狀態(tài)的控制參數(shù),而左側(cè)數(shù)據(jù)代表的關(guān)鍵幀序號(hào),沒(méi)有任何op需要這個(gè)數(shù)據(jù),因?yàn)殛P(guān)鍵幀序號(hào)就是一個(gè)連續(xù)從0開(kāi)始用于關(guān)鍵幀排序的序號(hào),相連關(guān)鍵幀之間可以填間隔不同的幀時(shí)間,比如0號(hào)關(guān)鍵幀是0時(shí)刻,1號(hào)關(guān)鍵幀是5時(shí)刻,2號(hào)關(guān)鍵幀是15時(shí)刻,那么動(dòng)畫(huà)第1幀代表的模型形態(tài)變到第2幀所用的時(shí)間是第0幀變第1幀的2倍時(shí)間,但一般為了控制方便,宜設(shè)置間隔連續(xù)均勻。
可能大家沒(méi)處理過(guò),不了解,一般你導(dǎo)入做好的頂點(diǎn)動(dòng)畫(huà)模型后各幀時(shí)刻參數(shù)會(huì)均為0或者散亂不成等差數(shù)列,所以以前我這個(gè)帖子說(shuō)了下如何快速讓頂點(diǎn)動(dòng)畫(huà)的各幀序的幀時(shí)刻從0開(kāi)始成差值為10的等差數(shù)列https://bbs.mountblade.com.cn/thread-2050522-1-1.html,假如你學(xué)會(huì)了頂點(diǎn)動(dòng)畫(huà)的制作,這個(gè)小細(xì)節(jié)不掌握也會(huì)使你在代碼控制前的模型處理環(huán)節(jié)就卡住思路。

此外注意沒(méi)有頂點(diǎn)動(dòng)畫(huà)的場(chǎng)景物也可以控制幀狀態(tài),所以這種特殊的情況可以用來(lái)還沒(méi)有制作動(dòng)畫(huà)時(shí)隨便用一個(gè)沒(méi)有動(dòng)畫(huà)的模型先留空寫(xiě)好代碼,以及利用頂點(diǎn)動(dòng)畫(huà)控制op是可以操作模型在一個(gè)幀時(shí)刻區(qū)間變換時(shí)限定總完成時(shí)間的特性,構(gòu)造一個(gè)看不見(jiàn)的無(wú)動(dòng)畫(huà)模型將控制頂點(diǎn)動(dòng)畫(huà)來(lái)當(dāng)作一個(gè)計(jì)時(shí)器來(lái)使用。但是注意控制頂點(diǎn)動(dòng)畫(huà)的場(chǎng)景物可以沒(méi)有頂點(diǎn)動(dòng)畫(huà)但是需要有具體模型,也就是要有點(diǎn)線面,如果你的模型是none空的,頂點(diǎn)動(dòng)畫(huà)op強(qiáng)制執(zhí)行到某幀時(shí)刻后你獲取的當(dāng)前幀時(shí)刻始終為0。


prop_instance_deform_to_time? ?? ?? ?? ?? ? = 2610??# (prop_instance_deform_to_time, <prop_instance_no>, <value>),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? # value參數(shù)代表幀時(shí)刻,也就是prop_instance_no場(chǎng)景物id的場(chǎng)景物一次性設(shè)置到value這個(gè)幀時(shí)刻


prop_instance_deform_in_range? ?? ?? ?? ?? ?= 2611??# (prop_instance_deform_in_range, <prop_instance_no>, <start_frame>, <end_frame>, <duration-in-1/1000-seconds>),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? # 強(qiáng)制場(chǎng)景物id<prop_instance_no>的場(chǎng)景物自起點(diǎn)幀時(shí)刻<start_frame>向終點(diǎn)幀時(shí)刻<end_frame>勻速變化,在<duration-in-1/1000-seconds>(單位千分之一秒)時(shí)間內(nèi)完成一次動(dòng)畫(huà),然后模型便停留在終點(diǎn)幀時(shí)刻<end_frame>的形態(tài)上。此外注意這里面控制動(dòng)畫(huà)變化區(qū)間的時(shí)候是可以取值到<end_frame>,不要去類(lèi)比is between、try for range這些取不到終值的op,因?yàn)檫@個(gè)是行為操作而不是判斷類(lèi)操作。


prop_instance_deform_in_cycle_loop? ?? ?? ? = 2612??# (prop_instance_deform_in_cycle_loop, <prop_instance_no>, <start_frame>, <end_frame>, <duration-in-1/1000-seconds>),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? # 強(qiáng)制場(chǎng)景物id<prop_instance_no>的場(chǎng)景物自起點(diǎn)幀時(shí)刻<start_frame>向終點(diǎn)幀時(shí)刻<end_frame>勻速變化,在<duration-in-1/1000-seconds>(單位千分之一秒)時(shí)間內(nèi)完成一次動(dòng)畫(huà),然后重新到<start_frame>時(shí)刻反復(fù)循環(huán)動(dòng)畫(huà)。也就是與上面的op區(qū)別是一個(gè)不循環(huán)動(dòng)畫(huà)一個(gè)循環(huán)動(dòng)畫(huà),這個(gè)你們要結(jié)合骨骼動(dòng)畫(huà)的機(jī)理聯(lián)系想想。


prop_instance_get_current_deform_progress? ?= 2615??# (prop_instance_get_current_deform_progress, <destination>, <prop_instance_no>),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? # 獲取<prop_instance_no>場(chǎng)景物正在用2611或2612操作播放頂點(diǎn)動(dòng)畫(huà)時(shí),已經(jīng)播放的百分比0-100取值<destination>,實(shí)際上,這個(gè)用的不多,下面的op具有等效替代作用。



prop_instance_get_current_deform_frame? ?? ?= 2616??# (prop_instance_get_current_deform_frame, <destination>, <prop_instance_no>),
? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? #獲取<prop_instance_no>場(chǎng)景物操作播放頂點(diǎn)動(dòng)畫(huà)時(shí),當(dāng)前時(shí)點(diǎn)播放到的幀時(shí)刻<destination>。



該系列op功能的總體分析(為了寫(xiě)方便,下面以op的序號(hào)簡(jiǎn)稱(chēng)):
1.實(shí)際上操作號(hào)2611,2612和2616已經(jīng)可以滿足頂點(diǎn)動(dòng)畫(huà)控制的需求,操作號(hào)2610和2615用的場(chǎng)合不多并且可以被其他3個(gè)op等效操作。

2.<duration-in-1/1000-seconds>的填寫(xiě)與<end_frame>-<start_frame>的差值的關(guān)系有一點(diǎn)關(guān)系但不多,具體填多少還要看你關(guān)鍵幀動(dòng)畫(huà)變化的幅度結(jié)合實(shí)際行為,比如說(shuō)同樣是兩個(gè)頂點(diǎn)動(dòng)畫(huà)人物的走路動(dòng)畫(huà),一個(gè)步伐夸張一個(gè)步伐緩慢甚至有切變多動(dòng)作,或者一個(gè)模型走路動(dòng)畫(huà)每10幀數(shù)動(dòng)作變化幅度較明顯,但另一個(gè)模型的走路動(dòng)畫(huà)每10幀甚至不仔細(xì)看都沒(méi)怎么動(dòng)作幅度,所以這兩個(gè)模型一個(gè)特定動(dòng)畫(huà)區(qū)間的長(zhǎng)度相等時(shí),滿足我們觀感適宜的<duration-in-1/1000-seconds>值很多時(shí)候不一定相等。這個(gè)要在brf里手動(dòng)播放幀數(shù)記錄各行為關(guān)鍵幀起始終止幀時(shí)刻時(shí)看感覺(jué)心中有個(gè)估值設(shè)置好后到游戲調(diào)整。然后如果涉及到動(dòng)作有被加減速動(dòng)畫(huà)速度的條件,比如施法加速技能,那這些<duration-in-1/1000-seconds>值還要進(jìn)一步變量化控制。


3.2611和2612代表了頂點(diǎn)動(dòng)畫(huà)的不循環(huán)和循環(huán),這個(gè)要類(lèi)比骨骼動(dòng)畫(huà)smd特別是其標(biāo)簽作用,骨骼動(dòng)畫(huà)按照一些標(biāo)簽應(yīng)付不同場(chǎng)合的需求,需要?jiǎng)幼骺梢匝h(huán)執(zhí)行或僅執(zhí)行一次,然后我們?cè)兕?lèi)比下,骨骼動(dòng)畫(huà)強(qiáng)制切換動(dòng)作是怎么做的,其實(shí)采用的是具有高優(yōu)先級(jí)標(biāo)簽的動(dòng)作去覆蓋當(dāng)前正在執(zhí)行的動(dòng)作,優(yōu)先級(jí)高,則直接打斷,優(yōu)先級(jí)次一點(diǎn),可能等當(dāng)前動(dòng)作做完續(xù)上或不打斷。


所以對(duì)于同一個(gè)物體的頂點(diǎn)動(dòng)畫(huà)中兩個(gè)不同區(qū)間的幀動(dòng)畫(huà)進(jìn)行切換時(shí),操作號(hào)2611或2612需要和2616來(lái)組合使用,比如某物體假設(shè)是一個(gè)怪獸,頂點(diǎn)動(dòng)畫(huà)總共0-400的幀時(shí)間,通過(guò)我自己的人為設(shè)定,停止發(fā)呆動(dòng)作的幀時(shí)刻區(qū)間是0-100,走路是101-200(看到?jīng)]有,因?yàn)閯?dòng)畫(huà)控制可以取終值,所以這個(gè)相鄰兩個(gè)區(qū)間前一個(gè)終值100不可以等于后一個(gè)起始值101),攻擊是201-300,死亡是301-400。所以這個(gè)也表明了大部分情況,你需要把一個(gè)頂點(diǎn)動(dòng)畫(huà)所有行為壓到一個(gè)頂點(diǎn)動(dòng)畫(huà)模型里,然后記個(gè)筆記人為分分類(lèi),哪個(gè)區(qū)間是作什么行為作用的動(dòng)畫(huà)來(lái)使用。


這時(shí)候你們要聯(lián)系實(shí)際生活和玩過(guò)的游戲來(lái)想怎么把這不同行為的動(dòng)畫(huà)區(qū)間控制好,首先動(dòng)畫(huà)是抽象行為的具體表象,所以先讓總體行為指導(dǎo)動(dòng)畫(huà)的觸發(fā),比如我看到你腿在動(dòng)的動(dòng)畫(huà),那當(dāng)前你就是在走路。則通過(guò)行為判斷的條件,比如走路(先不區(qū)分前后左右跑步還是慢跑,假設(shè)上面的怪獸只有一種前進(jìn)動(dòng)作,其他靠轉(zhuǎn)彎),那么,(key_is_down, key_W)即按著w鍵便是一種判斷當(dāng)前是否要執(zhí)行走路動(dòng)畫(huà)的條件。然后就是停止待命動(dòng)畫(huà),一般在動(dòng)畫(huà)領(lǐng)域這個(gè)動(dòng)作叫idle動(dòng)作,是很多動(dòng)作首先要做的動(dòng)畫(huà),因?yàn)槟銦o(wú)論是走路還是攻擊釋放技能,最終執(zhí)行完這些行為后,都要恢復(fù)idle站著等待執(zhí)行其他行為或就像一些任務(wù)型人物就呆在一個(gè)地方不動(dòng),這也說(shuō)明了idle是優(yōu)先級(jí)最低的動(dòng)作,也是幾乎所有動(dòng)作的中轉(zhuǎn)動(dòng)作行為,所以我們進(jìn)行頂點(diǎn)動(dòng)畫(huà)多區(qū)間行為化的模型進(jìn)行多種動(dòng)畫(huà)行為控制時(shí),要先分析不同動(dòng)畫(huà)區(qū)間代表的不同行為優(yōu)先級(jí)的排序。類(lèi)似動(dòng)作A在執(zhí)行時(shí)動(dòng)作B不執(zhí)行,動(dòng)作A執(zhí)行完畢時(shí)如果不繼續(xù)觸發(fā)動(dòng)作A的條件則自動(dòng)切換到動(dòng)作C,等等。


所以代碼控制頂點(diǎn)動(dòng)畫(huà)的基本思路就是:
滿足動(dòng)畫(huà)A(幀時(shí)刻范圍在(b,c))的條件觸發(fā)時(shí),op操作號(hào)2616得到當(dāng)前幀數(shù)a
如果a在(b,c)值域內(nèi),也就是你目前就是在執(zhí)行A動(dòng)作動(dòng)畫(huà)過(guò)程中,出現(xiàn)行為條件的改變,則判斷你實(shí)際需要觸發(fā)的事件本應(yīng)該執(zhí)行什么動(dòng)作來(lái)決定如何執(zhí)行2611或2612 op操作號(hào),具體循環(huán)與否看你的事件觸發(fā)條件是否是持續(xù)的還是一次性事件,比如走路和待機(jī)就是持續(xù)性事件采用2612循環(huán)動(dòng)作,而非持續(xù)施法的技能和攻擊行為以及死亡便是非循環(huán)單次事件要用2611,其他特殊情況特殊分析。
然后如果突然又出現(xiàn)了動(dòng)畫(huà)B(幀時(shí)刻范圍在(d,e))的條件觸發(fā)時(shí),直接按照相同的套路強(qiáng)制執(zhí)行2611或2612 操作號(hào),打斷當(dāng)前執(zhí)行的其他動(dòng)作,或者等目前執(zhí)行的單次行為動(dòng)作事件執(zhí)行完畢即播放到目前行為動(dòng)畫(huà)的尾幀時(shí)刻再執(zhí)行新的動(dòng)畫(huà)播放。
綜述就是:同一個(gè)頂點(diǎn)動(dòng)畫(huà)模型的不同幀時(shí)刻區(qū)間定義的不同動(dòng)作的切換,就是靠op操作號(hào)2616得到當(dāng)前幀數(shù)作為判斷條件是否處于某個(gè)行為事件,再根據(jù)你實(shí)際需要觸發(fā)的其他行為條件需要強(qiáng)制執(zhí)行2611或2612 操作號(hào)去轉(zhuǎn)接播放其他幀時(shí)刻區(qū)間的頂點(diǎn)動(dòng)畫(huà),然后比較優(yōu)先級(jí),是直接打斷當(dāng)前動(dòng)畫(huà)執(zhí)行還是等原來(lái)的執(zhí)行完。




三、接下來(lái)我把我魔獸爭(zhēng)霸的頂點(diǎn)動(dòng)畫(huà)人物控制代碼寫(xiě)下,作為案例注釋助大家理解下。

首先做頂點(diǎn)動(dòng)畫(huà)模型,此處制作過(guò)程省略,然后新建一個(gè)excel表做筆記

表格設(shè)置的一些解釋?zhuān)?/strong>看我如下表格,我將我的魔獸人物目前簡(jiǎn)單定義了幾個(gè)行為動(dòng)作與動(dòng)畫(huà)的對(duì)應(yīng),停止待命idle,跑步run,前兩個(gè)的特殊special狀態(tài)(比如人族步兵舉盾還是不舉盾),atk1-double即三種攻擊動(dòng)作(因?yàn)橥孢^(guò)網(wǎng)易游戲的會(huì)了解,像這種moba人物不像格斗動(dòng)作游戲一樣,很多會(huì)采用有限普通攻擊動(dòng)作,具有代表性的是三段擊,也就是三個(gè)動(dòng)作循環(huán),攻擊力一個(gè)比一個(gè)高),skill1-4是四個(gè)技能動(dòng)作,因?yàn)槲掖蟛糠钟⑿凼莙wer的技能設(shè)置,laugh是嘲諷動(dòng)作娛樂(lè)性作用,die是死亡動(dòng)作,后面帶Summoning是含有技能召喚物的比如血法師的鳳凰,一般英雄沒(méi)有,就會(huì)像我開(kāi)頭備注的文字if none anim ,control frame??89999-99999,and force it to idle一樣,無(wú)效動(dòng)作幀數(shù)設(shè)置89999-99999方便集中判斷無(wú)效動(dòng)作以idle動(dòng)作代替。

然后為什么要做這樣的表格呢,因?yàn)槠鸪跷易鳊堉閙od的時(shí)候,我采用的是每個(gè)人物都寫(xiě)一遍結(jié)構(gòu)很相似的觸發(fā)器,只不過(guò)執(zhí)行動(dòng)畫(huà)幀區(qū)間時(shí)填的幀時(shí)刻參數(shù)不一樣而已。對(duì)于很多會(huì)動(dòng)的生物來(lái)說(shuō)其實(shí)大家行為都差不多,人蛇昆蟲(chóng)鳥(niǎo),都會(huì)有idle(待命)-walk/run(走/跑)-attack(攻擊)-underattack(被打)-die(死)這些共同的基礎(chǔ)動(dòng)作,然后其他特有動(dòng)作另寫(xiě),一般優(yōu)先級(jí)高于基礎(chǔ)動(dòng)作,除了死亡,死亡是優(yōu)先級(jí)最高的動(dòng)作,因?yàn)樗懒松妒露甲霾涣恕1热缒汜尫偶寄軙r(shí),根據(jù)你玩游戲的經(jīng)驗(yàn)看,很多技能動(dòng)作會(huì)強(qiáng)制打斷待命走路攻擊有時(shí)不執(zhí)行結(jié)束技能動(dòng)作還不能進(jìn)行其他動(dòng)作(這個(gè)一般指的即時(shí)釋放的技能,持續(xù)釋放的技能略有差別)

所以說(shuō)對(duì)于不同的頂點(diǎn)動(dòng)畫(huà)生物控制,他們各種行為對(duì)應(yīng)的動(dòng)畫(huà)幀區(qū)間的起點(diǎn)終點(diǎn)值抽象成一個(gè)參數(shù)、控制量、變量即可保證大部分生物都能通用一套觸發(fā)器控制,然后初始化比如spawn刷出時(shí)進(jìn)行賦值,把類(lèi)似動(dòng)畫(huà)序列表的數(shù)據(jù)一次性賦值給這個(gè)場(chǎng)景物的sceneprop slot來(lái)儲(chǔ)存。然后控制動(dòng)畫(huà)時(shí)讀取這些動(dòng)畫(huà)幀時(shí)刻參數(shù)即可。

表格 (scene_prop_set_slot, reg0, 101, 60), 這個(gè)數(shù)據(jù)的生成我采用了“=CONCATENATE(D66,F66)”這個(gè)excel函數(shù),目的是為了把D66格子的(scene_prop_set_slot, reg0, 101和F66格子的, 60),這兩個(gè)格子的數(shù)據(jù)合并,為什么要這么寫(xiě)呢,是因?yàn)槲乙?01這個(gè)數(shù)據(jù)可以被excel向下拉的時(shí)候自動(dòng)填充并+1,因?yàn)槲疫@么多動(dòng)作需要使用大量的slot存值,如果一個(gè)個(gè)手寫(xiě),手都要斷了,所以合理利用excel自動(dòng)填充的特性來(lái)處理這種需要大量初始賦值參數(shù)的場(chǎng)合便極為方便高效。
魔獸人物僅僅設(shè)定了十幾個(gè)通用動(dòng)作的參數(shù),龍珠是它的好幾倍動(dòng)作數(shù)量,比較復(fù)雜,所以下面僅僅以我魔獸爭(zhēng)霸mod的動(dòng)作設(shè)定來(lái)作為參考例:


表格如下:


---------------------------------------------------------------------------------------------------------------

i


---------------------------------------------------------------------------------------------------------------
上面這些表格的內(nèi)容在刷出頂點(diǎn)動(dòng)畫(huà)人物后把類(lèi)似(scene_prop_set_slot, reg0, 101, 60),結(jié)構(gòu)的所有豎行都復(fù)制過(guò)去,進(jìn)行初始化存數(shù)據(jù),然后以下涉及鏡頭控制、stoprun變量控制的dynamic強(qiáng)制停止位移,aaa變量控制的rts等等參數(shù)的變化和控制代碼寫(xiě)在其他觸發(fā)器, 因?yàn)橛泻芏嗯涮状a要閹割出來(lái)比較麻煩,所以有些東西就下面的主體動(dòng)畫(huà)控制觸發(fā)器里注釋簡(jiǎn)單提及一下,不寫(xiě)出來(lái)了,主要提供最主要的動(dòng)畫(huà)控制代碼的一個(gè)觸發(fā)器(腳本)給大家看個(gè)整體思路:
以下添加到module_mission_templates.PY需要的場(chǎng)景里,比如lead charge 野戰(zhàn),或者直接全部腳本化后每個(gè)場(chǎng)景觸發(fā)器都引用一遍:
條件推薦0.00000,0.00000,0.00000
(set_fixed_point_multiplier, 1000),
(store_add, ":var_0", "$heroswitch", 647),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
(troop_get_slot, ":var_1", "trp_player", ":var_0"),? ?? ?? ?? ??#以上表示:var_0這個(gè)是由$heroswitch決定的我不同的可選魔獸英雄的操作序號(hào),形成了slot序號(hào),由trp_player troop slot 此序號(hào)提前在其他觸發(fā)器存儲(chǔ)了英雄的頂點(diǎn)動(dòng)畫(huà)場(chǎng)景物的spr id,設(shè)為:var_1。
(scene_prop_get_num_instances, ":var_2", ":var_1"),? ?? ?? ?? ?
(eq, ":var_2", 1),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#英雄頂點(diǎn)動(dòng)畫(huà)模型數(shù)量為1時(shí)開(kāi)始執(zhí)行,在其他觸發(fā)器里面集中執(zhí)行了戰(zhàn)斗場(chǎng)景應(yīng)該刷出玩家選擇的什么英雄對(duì)應(yīng)的場(chǎng)景物模型
(get_player_agent_no, ":var_3"),
(agent_get_troop_id, ":var_4", ":var_3"),
(agent_get_position, pos15, ":var_3"),
(agent_get_team, ":var_5", ":var_3"),
(store_agent_hit_points, ":var_6", ":var_3", 0),
(scene_prop_get_instance, ":var_7", ":var_1", 0),? ?? ?? ?#代表了玩家換皮頂點(diǎn)動(dòng)畫(huà)場(chǎng)景物的魔獸英雄模型,單體實(shí)例id設(shè)為:var_7
(scene_prop_get_instance, ":var_8", "spr_plpoint", 0),? ? #含有跳動(dòng)動(dòng)畫(huà)的光標(biāo)模型,表示rts模式的人物選中狀態(tài),玩家和ai都有這個(gè)東西,在我其他觸發(fā)器初始化時(shí)刷出的,本貼觸發(fā)器省略不寫(xiě)
(prop_instance_get_position, pos2, ":var_7"),? ?? ?? ?? ?? ?? ?#代碼塊1-用于獲取玩家當(dāng)前位置到RTS控制需要去的目的地(scripted_destination)的位置水平投影的間距,用于下面判斷RTS模式($aaa為1或2時(shí))是采用走路還是待命頂點(diǎn)動(dòng)畫(huà)動(dòng)作的判定
(prop_instance_get_position, pos5, ":var_7"),
(agent_get_scripted_destination, pos6, ":var_3"),? ?? ?? ? #你們可能奇怪為什么玩家也可以用這個(gè)op,雖然玩家的移動(dòng)行為一般情況是靠wasd,但是你set_scripted_destination到一個(gè)pos然后用get_scripted_destination是可以獲取到這個(gè)pos的? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#,或者換個(gè)說(shuō)法,假如你按作弊ctrl+f5系統(tǒng)托管玩家控制,玩家就可以響應(yīng)set_scripted_destination到腳本目的地,所以玩家有scripted_destination的作用,但是一般情況會(huì)被wasd等基礎(chǔ)系統(tǒng)機(jī)制覆蓋效果。
(position_set_z, pos5, 0),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#為了只獲取水平投影的間距,z坐標(biāo)統(tǒng)一設(shè)0
(position_set_z, pos6, 0),
(get_distance_between_positions, ":var_9", pos5, pos6),? ?? ?#代碼塊1-結(jié)束
(agent_get_position, pos1, ":var_3"),
(2616, ":var_10", ":var_7"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#獲取英雄頂點(diǎn)動(dòng)畫(huà)模型當(dāng)前運(yùn)行到的幀時(shí)刻,因?yàn)槲襱xt做mod,習(xí)慣用數(shù)字表示這一系列的操作號(hào)。
(agent_get_attack_action, ":var_11", ":var_3"),
(agent_get_simple_behavior, ":var_12", ":var_3"),
(store_random_in_range, ":var_13", 0, 1000),? ?? ?? ?? ???#這個(gè)隨機(jī)數(shù)很下面的try for agents里的代碼會(huì)用到,是頂點(diǎn)動(dòng)畫(huà)三種不同攻擊動(dòng)作的概率
(try_begin),
? ? (agent_slot_eq, ":var_3", 333, 0),? ?? ???#玩家agent slot333號(hào)代表了這個(gè)英雄有沒(méi)有額外的運(yùn)動(dòng)控制,如果沒(méi)有,即slot為0時(shí),常規(guī)情況英雄頂點(diǎn)動(dòng)畫(huà)模型和頭頂表示人物選中的光標(biāo)模型將始終設(shè)置于玩家agent的位置上,因?yàn)槠渌|發(fā)器設(shè)定了玩家agent影身,所以用頂點(diǎn)動(dòng)畫(huà)場(chǎng)景物的形象和動(dòng)作代表了玩家控制的新形象和動(dòng)作行為
? ? (prop_instance_set_position, ":var_7", pos15),
? ? (prop_instance_set_position, ":var_8", pos15),
(try_end),
(agent_get_slot, ":var_14", ":var_3", 500),? ?? ?? ?#代碼塊2-slot503-506代表了技能的持續(xù)時(shí)間進(jìn)程控制,slot501代表了移動(dòng)動(dòng)畫(huà)播放速度的變速控制影響量(比如受技能改變加速)在其他觸發(fā)器默認(rèn)初始化設(shè)為4,slot502代表了攻擊動(dòng)畫(huà)播放速度的變速控制影響量(比如受技能改變加速)在其他觸發(fā)器默認(rèn)初始化設(shè)為4,slot500已經(jīng)廢棄,原本是控制攻擊力變化的,后來(lái)?yè)Q了算法
(agent_get_slot, ":var_15", ":var_3", 501),
(agent_get_slot, ":var_16", ":var_3", 502),
(agent_get_slot, ":var_17", ":var_3", 503),
(agent_get_slot, ":var_18", ":var_3", 504),
(agent_get_slot, ":var_19", ":var_3", 505),
(agent_get_slot, ":var_20", ":var_3", 506),? ?? ?? ?? ?? ?? ??#代碼塊2-結(jié)束
(scene_prop_get_slot, ":var_21", ":var_7", 101),? ?? ?? ?? ?#代碼塊3-看我上面附的大表格,是用來(lái)獲取英雄頂點(diǎn)動(dòng)畫(huà)模型包含的各個(gè)行為動(dòng)作的動(dòng)畫(huà)起點(diǎn)終點(diǎn)幀時(shí)刻數(shù)以及動(dòng)作持續(xù)時(shí)間技能持續(xù)時(shí)間已經(jīng)在其他觸發(fā)器初始化存好到各個(gè)prop slot的參數(shù)
(scene_prop_get_slot, ":var_22", ":var_7", 102),
(scene_prop_get_slot, ":var_23", ":var_7", 103),
(scene_prop_get_slot, ":var_24", ":var_7", 104),
(scene_prop_get_slot, ":var_25", ":var_7", 105),
(scene_prop_get_slot, ":var_26", ":var_7", 106),
(scene_prop_get_slot, ":var_27", ":var_7", 107),
(scene_prop_get_slot, ":var_28", ":var_7", 108),
(scene_prop_get_slot, ":var_29", ":var_7", 109),
(scene_prop_get_slot, ":var_30", ":var_7", 110),
(scene_prop_get_slot, ":var_31", ":var_7", 111),
(scene_prop_get_slot, ":var_32", ":var_7", 112),
(scene_prop_get_slot, ":var_33", ":var_7", 113),
(scene_prop_get_slot, ":var_34", ":var_7", 114),
(scene_prop_get_slot, ":var_35", ":var_7", 115),
(scene_prop_get_slot, ":var_36", ":var_7", 116),
(scene_prop_get_slot, ":var_37", ":var_7", 117),
(scene_prop_get_slot, ":var_38", ":var_7", 118),
(scene_prop_get_slot, ":var_39", ":var_7", 119),
(scene_prop_get_slot, ":var_40", ":var_7", 120),
(scene_prop_get_slot, ":var_41", ":var_7", 121),
(scene_prop_get_slot, ":var_42", ":var_7", 122),
(scene_prop_get_slot, ":var_43", ":var_7", 123),
(scene_prop_get_slot, ":var_44", ":var_7", 124),
(scene_prop_get_slot, ":var_45", ":var_7", 125),
(scene_prop_get_slot, ":var_46", ":var_7", 126),
(scene_prop_get_slot, ":var_47", ":var_7", 127),
(scene_prop_get_slot, ":var_48", ":var_7", 128),
(scene_prop_get_slot, ":var_49", ":var_7", 129),
(scene_prop_get_slot, ":var_50", ":var_7", 130),
(scene_prop_get_slot, ":var_51", ":var_7", 131),
(scene_prop_get_slot, ":var_52", ":var_7", 132),
(scene_prop_get_slot, ":var_53", ":var_7", 133),
(scene_prop_get_slot, ":var_54", ":var_7", 134),
(scene_prop_get_slot, ":var_55", ":var_7", 135),
(scene_prop_get_slot, ":var_56", ":var_7", 136),
(scene_prop_get_slot, ":var_57", ":var_7", 137),
(scene_prop_get_slot, ":var_58", ":var_7", 138),
(scene_prop_get_slot, ":var_59", ":var_7", 139),
(scene_prop_get_slot, ":var_60", ":var_7", 140),
(scene_prop_get_slot, ":var_61", ":var_7", 141),
(scene_prop_get_slot, ":var_62", ":var_7", 142),
(scene_prop_get_slot, ":var_63", ":var_7", 143),
(scene_prop_get_slot, ":var_64", ":var_7", 144),
(scene_prop_get_slot, ":var_65", ":var_7", 145),
(scene_prop_get_slot, ":var_66", ":var_7", 146),
(scene_prop_get_slot, ":var_67", ":var_7", 147),? ?? ?? ?? ?#代碼塊3-結(jié)束
(troop_get_slot, ":var_68", "trp_player", 729),
(troop_get_slot, ":var_69", "trp_player", 730),
(troop_get_slot, ":var_70", "trp_player", 731),
(troop_get_slot, ":var_71", "trp_player", 732),? ?? ?? ? #以上trp slot729-732分別代表了不同傷害的定義值,寫(xiě)在其他觸發(fā)器,了解含義即可,比如729代表普通攻擊傷害,后面三個(gè)是有關(guān)技能的傷害
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#代碼塊4-以下有4個(gè)相似的代碼塊,用來(lái)處理503-506agent slot代表的qwer四個(gè)英雄技能持續(xù)時(shí)間進(jìn)程控制,比如503agentslot值由0變1則開(kāi)始觸發(fā)效果,在0到prop144號(hào)slot取值之間的區(qū)間進(jìn)行持續(xù)+1變化,到峰值歸0終止效果。
? ? (eq, ":var_17", 0),
? ? (eq, "$ccd1", 2),
? ? (agent_slot_eq, ":var_3", 307, 0),
? ? (agent_set_slot, ":var_3", 503, 1),
(else_try),
? ? (is_between, ":var_17", 1, ":var_64"),
? ? (val_add, ":var_17", 1),
? ? (try_begin),
? ?? ???(eq, ":var_17", 3),
? ?? ???(str_store_troop_name, s15, ":var_4"),
? ?? ???(str_store_item_name, s16, "itm_wardenskilll"),
? ?? ???(display_message, "str_showskill"),
? ? (try_end),
? ? (agent_set_slot, ":var_3", 503, ":var_17"),
(else_try),
? ? (eq, ":var_17", ":var_64"),
? ? (agent_set_slot, ":var_3", 503, 0),
? ? (str_store_troop_name, s15, ":var_4"),
? ? (str_store_item_name, s16, "itm_wardenskilll"),
? ? (display_message, "str_diskill"),
(try_end),
(try_begin),
? ? (eq, ":var_18", 0),
? ? (eq, "$ccd2", 2),
? ? (agent_slot_eq, ":var_3", 307, 0),
? ? (agent_set_slot, ":var_3", 504, 1),
(else_try),
? ? (is_between, ":var_18", 1, ":var_65"),
? ? (val_add, ":var_18", 1),
? ? (try_begin),
? ?? ???(eq, ":var_18", 3),
? ?? ???(str_store_troop_name, s15, ":var_4"),
? ?? ???(str_store_item_name, s16, "itm_wardenskill2"),
? ?? ???(display_message, "str_showskill"),
? ? (try_end),
? ? (agent_set_slot, ":var_3", 504, ":var_18"),
(else_try),
? ? (eq, ":var_18", ":var_65"),
? ? (agent_set_slot, ":var_3", 504, 0),
? ? (str_store_troop_name, s15, ":var_4"),
? ? (str_store_item_name, s16, "itm_wardenskill2"),
? ? (display_message, "str_diskill"),
(try_end),
(try_begin),
? ? (eq, ":var_19", 0),
? ? (eq, "$ccd3", 2),
? ? (agent_slot_eq, ":var_3", 307, 0),
? ? (agent_set_slot, ":var_3", 505, 1),
(else_try),
? ? (is_between, ":var_19", 1, ":var_66"),
? ? (val_add, ":var_19", 1),
? ? (try_begin),
? ?? ???(eq, ":var_19", 3),
? ?? ???(str_store_troop_name, s15, ":var_4"),
? ?? ???(str_store_item_name, s16, "itm_wardenskill3"),
? ?? ???(display_message, "str_showskill"),
? ? (try_end),
? ? (agent_set_slot, ":var_3", 505, ":var_19"),
(else_try),
? ? (eq, ":var_19", ":var_66"),
? ? (agent_set_slot, ":var_3", 505, 0),
? ? (str_store_troop_name, s15, ":var_4"),
? ? (str_store_item_name, s16, "itm_wardenskill3"),
? ? (display_message, "str_diskill"),
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
(try_begin),
? ? (eq, ":var_20", 0),
? ? (eq, "$ccd4", 2),
? ? (agent_slot_eq, ":var_3", 307, 0),
? ? (agent_set_slot, ":var_3", 506, 1),
(else_try),
? ? (is_between, ":var_20", 1, ":var_67"),
? ? (val_add, ":var_20", 1),
? ? (try_begin),
? ?? ???(eq, ":var_20", 3),
? ?? ???(str_store_troop_name, s15, ":var_4"),
? ?? ???(str_store_item_name, s16, "itm_wardenskill4"),
? ?? ???(display_message, "str_showskill"),
? ? (try_end),
? ? (agent_set_slot, ":var_3", 506, ":var_20"),
(else_try),
? ? (eq, ":var_20", ":var_67"),
? ? (str_store_troop_name, s15, ":var_4"),
? ? (str_store_item_name, s16, "itm_wardenskill4"),
? ? (display_message, "str_diskill"),
? ? (agent_set_slot, ":var_3", 506, 0),
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#代碼塊5-結(jié)束
(store_div, ":var_72", 400, ":var_14"),? ?? ?? ?? ?? ?? ?? ?? ?? ?#原先代表攻擊力調(diào)整,現(xiàn)廢除無(wú)用
(store_div, ":var_73", ":var_56", ":var_15"),? ?? ?? ?? ?? ??#調(diào)整移動(dòng)動(dòng)畫(huà)速度的基礎(chǔ)變化,:var_56是propslot136號(hào)的基礎(chǔ)賦值,":var_15"是agentslot501號(hào)的賦值作為速度調(diào)節(jié)器類(lèi)似modified類(lèi)op的效果
(store_div, ":var_74", ":var_57", ":var_16"),? ?? ?? ?? ?? ????#調(diào)整攻擊動(dòng)畫(huà)速度的基礎(chǔ)變化,:var_57是propslot137號(hào)的基礎(chǔ)賦值,":var_16"是agentslot502號(hào)的賦值作為速度調(diào)節(jié)器類(lèi)似modified類(lèi)op的效果
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#代碼塊6-控制玩家不進(jìn)行除待機(jī)走路以外的動(dòng)作時(shí),控制待機(jī)走路這兩個(gè)動(dòng)作觸發(fā)的條件和優(yōu)先級(jí)關(guān)系
? ? (neg|gt, ":var_10", ":var_30"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? # 判斷當(dāng)前是否處于攻擊1號(hào)動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_29"),
(else_try),
? ? (neg|gt, ":var_10", ":var_32"),? ?? ?? ?? ?? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于攻擊2號(hào)動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_31"),
(else_try),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
? ? (neg|gt, ":var_10", ":var_34"),? ?? ?? ?? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于攻擊3號(hào)動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_33"),
(else_try),
? ? (neg|gt, ":var_10", ":var_36"),? ?? ?? ?? ?? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于1技能動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_35"),
(else_try),
? ? (neg|gt, ":var_10", ":var_38"),? ?? ?? ?? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于2技能動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_37"),
(else_try),
? ? (neg|gt, ":var_10", ":var_40"),? ?? ?? ?? ?? ?? ?? ??? ??#?判斷當(dāng)前是否處于3技能動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_39"),
(else_try),
? ? (neg|gt, ":var_10", ":var_42"),? ?? ?? ?? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于4技能動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_41"),
(else_try),
? ? (neg|gt, ":var_10", ":var_44"),? ?? ?? ?? ?? ??#?判斷當(dāng)前是否處于嘲諷動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_43"),
(else_try),
? ? (neg|gt, ":var_10", ":var_46"),? ?? ?? ?? ???? ??#判斷當(dāng)前是否處于死亡動(dòng)作動(dòng)畫(huà)區(qū)間內(nèi)作為條件反向篩選
? ? (ge, ":var_10", ":var_45"),
(else_try),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#對(duì)如上非待機(jī)走路行為動(dòng)作的條件判斷轉(zhuǎn)折后,剩下的條件便是為待機(jī)走路這兩個(gè)動(dòng)作行為的條件,以此接下來(lái)開(kāi)始對(duì)待機(jī)走路這兩個(gè)動(dòng)作進(jìn)行更細(xì)的區(qū)別控制
? ? (try_begin),
? ?? ???(neg|eq, "$aaa", 0),? ?? ?? ?? ?? ?? ?? ?? ?? ???#$aaa是我用來(lái)控制RTS鼠標(biāo)框選點(diǎn)擊地面移動(dòng)機(jī)制的判斷條件,不為0則是RTS模式,了解即可,本貼暫時(shí)不提供魔獸RTS操作代碼。
? ?? ???(try_begin),
? ?? ?? ?? ?(ge, ":var_9", 100),? ?? ?? ?? ?? ?? ?? ?? ?? ?#:var_9是我開(kāi)頭寫(xiě)的玩家當(dāng)前位置與腳本強(qiáng)制命令走動(dòng)到目的地目標(biāo)的位置的水平投影間距,因?yàn)閞ts控制移動(dòng)就不是靠wasd按鍵條件,所以要判斷此刻和下一刻玩家的位移變化值來(lái)判斷玩家是否想要移動(dòng)還是靜止待命。
? ?? ?? ?? ?(try_begin),
? ?? ?? ?? ?? ? (neg|gt, ":var_10", ":var_26"),? ?? ?? ?? ?
? ?? ?? ?? ?? ? (ge, ":var_10", ":var_25"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (2612, ":var_7", ":var_25", ":var_26", ":var_73"),???#以上表示:var_10就是op2616操作號(hào)獲取的英雄頂點(diǎn)動(dòng)畫(huà)場(chǎng)景物的當(dāng)前動(dòng)畫(huà)幀數(shù),如果當(dāng)前幀數(shù)不在(:var_25,:var_26)這個(gè)走動(dòng)動(dòng)畫(huà)的幀時(shí)刻區(qū)間,則直接op2612操作號(hào)強(qiáng)制場(chǎng)景物運(yùn)行(:var_25,:var_26)區(qū)間的循環(huán)頂點(diǎn)動(dòng)畫(huà)。
? ?? ?? ?? ?(try_end),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|ge, ":var_9", 100),? ?? ?? ?? ?? ?? ?? ?? ?
? ?? ?? ?? ?(try_begin),
? ?? ?? ?? ?? ? (neg|gt, ":var_10", ":var_22"),
? ?? ?? ?? ?? ? (ge, ":var_10", ":var_21"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (2612, ":var_7", ":var_21", ":var_22", ":var_55"),? ???#以上表示:var_10就是op2616操作號(hào)獲取的英雄頂點(diǎn)動(dòng)畫(huà)場(chǎng)景物的當(dāng)前動(dòng)畫(huà)幀數(shù),如果當(dāng)前幀數(shù)不在(:var_21,:var_22)這個(gè)待機(jī)動(dòng)畫(huà)的幀時(shí)刻區(qū)間,則直接op2612操作號(hào)強(qiáng)制場(chǎng)景物運(yùn)行(:var_21,:var_22)區(qū)間的循環(huán)頂點(diǎn)動(dòng)畫(huà)。
? ?? ?? ?? ?(try_end),
? ?? ???(try_end),
? ? (else_try),
? ?? ???(eq, "$aaa", 0),? ?? ?? ?? ?? ?? ?? ???#$aaa是我用來(lái)控制RTS鼠標(biāo)框選點(diǎn)擊地面移動(dòng)機(jī)制的判斷條件,為0則是正常的第三/一人稱(chēng)視角模式
? ?? ???(try_begin),
? ?? ?? ?? ?(this_or_next|key_is_down, key_w),? ?? ?? ?? ?#第三/一人稱(chēng)視角模式,如果圖方便借用原本的位移機(jī)制換皮,則wasd按鍵控制便是觸發(fā)走路動(dòng)畫(huà)的條件,但是我根據(jù)我的需求,moba英雄沒(méi)有后退行為,所以屏蔽了s按鍵,并在下方的$stoprun變量判斷此情況玩家不會(huì)因?yàn)榘戳藄二移動(dòng)
? ?? ?? ?? ?(this_or_next|key_is_down, key_a),
? ?? ?? ?? ?(key_is_down, key_d),
? ?? ?? ?? ?(neg|key_is_down, key_s),
? ?? ?? ?? ?(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
? ?? ?? ?? ?? ? (neg|gt, ":var_10", ":var_26"),
? ?? ?? ?? ?? ? (ge, ":var_10", ":var_25"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (2612, ":var_7", ":var_25", ":var_26", ":var_73"),
? ?? ?? ?? ?(try_end),
? ?? ???(else_try),
? ?? ?? ?? ?(try_begin),
? ?? ?? ?? ?? ? (neg|gt, ":var_10", ":var_22"),
? ?? ?? ?? ?? ? (ge, ":var_10", ":var_21"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ?? ?? ?? ?(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#以上和$aaa不等于0時(shí)類(lèi)似,$aaa為0時(shí),按wasd按鍵條件區(qū)分什么時(shí)候用走路動(dòng)畫(huà),什么時(shí)候用待機(jī)動(dòng)畫(huà)
? ?? ???(try_end),
? ? (try_end),
(try_end),
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#以下到并列的try end 是對(duì)技能和嘲諷動(dòng)作行為控制
? ? (neg|gt, ":var_10", ":var_46"),
? ? (ge, ":var_10", ":var_45"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#以上兩行是為了判斷死亡動(dòng)作的情況,進(jìn)而寫(xiě)下面非死亡動(dòng)作條件的技能動(dòng)作事件,為什么不判斷上面走路和待機(jī)的動(dòng)作條件,是因?yàn)槲艺J(rèn)定技能動(dòng)作優(yōu)先級(jí)要比走路待機(jī)以及下面的攻擊事件要高。
(else_try),? ?? ?? ?? ?? ?? ?? ?? ???
? ? (try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
? ?? ???(key_clicked, key_left_alt),? ?? ?? ?? ?? ??#對(duì)嘲諷動(dòng)作事件的控制,按key_left_alt即左邊的alt鍵將按下面執(zhí)行動(dòng)畫(huà)
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_44"),
? ?? ?? ?? ?(ge, ":var_10", ":var_43"),
? ?? ???(else_try),
? ?? ?? ?? ?(2611, ":var_7", ":var_43", ":var_44", ":var_62"),
? ?? ???(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? #以上表示當(dāng)前是否當(dāng)前幀時(shí)刻:var_10處于(:var_43,:var_44)這個(gè)嘲諷動(dòng)畫(huà)的幀時(shí)刻區(qū)間,不在就執(zhí)行一遍(:var_43,:var_44)區(qū)間的頂點(diǎn)動(dòng)畫(huà)(不循環(huán)用2611,因?yàn)閷?duì)于這個(gè)動(dòng)作以及下面的技能動(dòng)作,按鍵一次只觸發(fā)一次)
? ? (else_try),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
? ?? ???(eq, ":var_10", ":var_44"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#所以為什么我上面要用2611,嘲諷動(dòng)作判斷動(dòng)作執(zhí)行完成一次終止回歸到待機(jī)動(dòng)作,因?yàn)槿绻遣捎?612循環(huán),在到動(dòng)畫(huà)時(shí)刻:var_44時(shí)會(huì)很快循環(huán)重置到起始幀時(shí)刻:var_43,導(dǎo)致(eq, ":var_10", ":var_44"), 常常來(lái)不及檢測(cè)到這個(gè)終值。
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),? ?? ?? ??#和上一行條件組合判斷執(zhí)行表示當(dāng)前是否當(dāng)前幀時(shí)刻:var_10處于:var_44這個(gè)嘲諷動(dòng)畫(huà)的幀時(shí)刻的終點(diǎn)時(shí)刻,就執(zhí)行(:var_21,:var_22)這個(gè)待機(jī)動(dòng)畫(huà)的幀時(shí)刻區(qū)間進(jìn)行循環(huán)動(dòng)畫(huà),
? ? (try_end),? ?? ?
? ? (try_begin),? ?? ?? ?#代碼塊7-ccd1是一技能觸發(fā)的條件,類(lèi)比上面嘲諷動(dòng)作觸發(fā)的定義,因?yàn)橐恍┢渌|發(fā)條件導(dǎo)致ccd1為1開(kāi)始執(zhí)行一次一技能動(dòng)作動(dòng)畫(huà),執(zhí)行完后回歸待機(jī)動(dòng)作動(dòng)畫(huà),ccd1是一個(gè)變化的量,本代碼不涉及到,在我其他觸發(fā)器后會(huì)根據(jù)技能的cd長(zhǎng)短從1循環(huán)到一定值后歸0
? ?? ???(eq, "$ccd1", 1),
? ?? ???(stop_all_sounds, 1),
? ?? ???(play_sound_at_position, "snd_juggw", pos15),
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_36"),
? ?? ?? ?? ?(ge, ":var_10", ":var_35"),
? ?? ???(else_try),
? ?? ?? ?? ?(2611, ":var_7", ":var_35", ":var_36", ":var_58"),
? ?? ???(try_end),
? ? (else_try),
? ?? ???(eq, ":var_10", ":var_36"),
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#代碼塊7-結(jié)束
? ? (try_begin),
? ?? ???(eq, "$ccd2", 1),
? ?? ???(stop_all_sounds, 1),
? ?? ???(play_sound_at_position, "snd_juggw", pos15),
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_38"),
? ?? ?? ?? ?(ge, ":var_10", ":var_37"),
? ?? ???(else_try),
? ?? ?? ?? ?(2611, ":var_7", ":var_37", ":var_38", ":var_59"),
? ?? ???(try_end),
? ? (else_try),
? ?? ???(eq, ":var_10", ":var_38"),
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#以上表示二技能的動(dòng)作動(dòng)畫(huà)控制,參考我上面的嘲諷動(dòng)作和一技能動(dòng)作代碼注釋的解釋理解,其中$ccd2用于控制二技能的觸發(fā)和cd,其值的變化寫(xiě)在其他觸發(fā)器上
? ? (try_begin),
? ?? ???(eq, "$ccd3", 1),
? ?? ???(stop_all_sounds, 1),
? ?? ???(play_sound_at_position, "snd_juggw", pos15),
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_40"),
? ?? ?? ?? ?(ge, ":var_10", ":var_39"),
? ?? ???(else_try),
? ?? ?? ?? ?(2611, ":var_7", ":var_39", ":var_40", ":var_60"),
? ?? ???(try_end),
? ? (else_try),
? ?? ???(eq, ":var_10", ":var_40"),
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#以上表示三技能的動(dòng)作動(dòng)畫(huà)控制,參考我上面的嘲諷動(dòng)作和一技能動(dòng)作代碼注釋的解釋理解,其中$ccd3用于控制三技能的觸發(fā)和cd,其值的變化寫(xiě)在其他觸發(fā)器上
? ? (try_begin),
? ?? ???(eq, "$ccd4", 1),
? ?? ???(stop_all_sounds, 1),
? ?? ???(play_sound_at_position, "snd_juggw", pos15),
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_42"),
? ?? ?? ?? ?(ge, ":var_10", ":var_41"),
? ?? ???(else_try),
? ?? ?? ?? ?(2611, ":var_7", ":var_41", ":var_42", ":var_61"),
? ?? ???(try_end),
? ? (else_try),
? ?? ???(eq, ":var_10", ":var_42"),
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??? ?? ?? ?? ?? ?? ?#以上表示四技能的動(dòng)作動(dòng)畫(huà)控制,參考我上面的嘲諷動(dòng)作和一技能動(dòng)作代碼注釋的解釋理解,其中$ccd4用于控制四技能的觸發(fā)和cd,其值的變化寫(xiě)在其他觸發(fā)器上
(try_end),
(try_for_agents, ":var_75"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#以下到同級(jí)的try end 為對(duì)攻擊動(dòng)畫(huà)和新攻擊判斷事件的控制
? ? (agent_is_alive, ":var_75"),
? ? (agent_is_human, ":var_75"),
? ? (agent_get_team, ":var_76", ":var_75"),
? ? (neg|eq, ":var_75", ":var_3"),
? ? (neg|eq, ":var_76", ":var_5"),
? ? (neg|eq, ":var_76", 5),
? ? (neg|eq, ":var_76", 6),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? #以上表示攻擊的對(duì)象不是玩家自己和自己陣營(yíng)的人,且不是team編號(hào)5、6的人(因?yàn)閠eam5,6我有其他中立的作用)
? ? (agent_get_position, pos10, ":var_75"),
? ? (copy_position, pos11, pos2),
? ? (position_move_y, pos11, -10),
? ? (copy_position, pos12, pos2),
? ? (position_move_y, pos12, 10),
? ? (get_distance_between_positions, ":var_77", pos11, pos10),
? ? (get_distance_between_positions, ":var_78", pos12, pos10),? ?? ?? ?#以上表示獲取英雄場(chǎng)景物的坐標(biāo)pos2(開(kāi)頭定義的比較遠(yuǎn)往上翻翻可以看到)前面10cm的位置和后面10cm的位置分別與循環(huán)的潛在攻擊對(duì)象:var_75agent位置的距離
? ? (try_begin),
? ?? ???(neg|eq, "$aaa", 0),
? ?? ???(neg|ge, ":var_77", ":var_78"),? ?? ????#如果是RTS模式,":var_78"大于":var_77",說(shuō)明玩家自身前面的坐標(biāo)位置到攻擊對(duì)象的位置的距離要大于自身后面的坐標(biāo)位置到攻擊對(duì)象的位置的距離,這說(shuō)明這個(gè)條件篩選的是敵人是否處于玩家身后的位置,因?yàn)檫@個(gè)是反向篩選條件,我們需要判斷攻擊的對(duì)象應(yīng)該是玩家面前的人,所以先判斷身后的目標(biāo)else排除一下,其實(shí)也可以用in sight 和behind之類(lèi)的操作op,但是這樣判斷在執(zhí)行頻率比較高但對(duì)判斷事物是面向范圍但不需要判斷是否正對(duì)的時(shí)候會(huì)更省系統(tǒng)負(fù)擔(dān)
? ? (else_try),
? ?? ???(neg|eq, "$aaa", 0),? ?? ?? ?? ?? ?? ?? ?? ???
? ?? ???(ge, ":var_77", ":var_78"),
? ?? ???(neg|is_between, ":var_78", 50, 180),? ?? ?#結(jié)合上一個(gè)else條件判斷,這個(gè)是為了篩掉RTS模式下雖然在自身面前但是距離過(guò)近和過(guò)遠(yuǎn)的敵人,即在面前距離(50cm,180cm)范圍的敵人,進(jìn)而避免隔空打人或穿模模型重合打人的情況
? ? (else_try),
? ?? ???(eq, "$aaa", 0),
? ?? ???(neg|key_is_down, key_left_mouse_button),? ?#判斷非RTS模式玩家沒(méi)有按鼠標(biāo)左鍵,else反向篩掉這個(gè)條件就是我希望非RTS模式按鼠標(biāo)左鍵時(shí)可以觸發(fā)頂點(diǎn)動(dòng)畫(huà)的攻擊動(dòng)畫(huà)
? ? (else_try),
? ?? ???(neg|eq, "$aaa", 0),
? ?? ???(neg|key_is_down, key_left_control),? ?? ?? ?#判斷RTS模式玩家沒(méi)有按左ctrl鍵,else反向篩掉這個(gè)條件就是我希望RTS模式按左ctrl鍵時(shí)可以觸發(fā)頂點(diǎn)動(dòng)畫(huà)的攻擊動(dòng)畫(huà)
? ? (else_try),
? ?? ???(try_begin),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_30"),
? ?? ?? ?? ?(ge, ":var_10", ":var_29"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_32"),
? ?? ?? ?? ?(ge, ":var_10", ":var_31"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_34"),
? ?? ?? ?? ?(ge, ":var_10", ":var_33"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_36"),
? ?? ?? ?? ?(ge, ":var_10", ":var_35"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_38"),
? ?? ?? ?? ?(ge, ":var_10", ":var_37"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_40"),
? ?? ?? ?? ?(ge, ":var_10", ":var_39"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_42"),
? ?? ?? ?? ?(ge, ":var_10", ":var_41"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_44"),
? ?? ?? ?? ?(ge, ":var_10", ":var_43"),
? ?? ???(else_try),
? ?? ?? ?? ?(neg|gt, ":var_10", ":var_46"),
? ?? ?? ?? ?(ge, ":var_10", ":var_45"),
? ?? ???(else_try),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#上面一堆else看我判斷待機(jī)走路的代碼注釋?zhuān)瑸榱伺袛喈?dāng)前沒(méi)有處于死亡攻擊技能嘲諷這些動(dòng)作行為,也就是動(dòng)作優(yōu)先級(jí)死亡>技能&嘲諷>攻擊>待機(jī)&走路
? ?? ?? ?? ?(troop_slot_eq, "trp_player", 705, 1),? ?? ?? ???#這個(gè)705號(hào)trp slot是為了判斷我當(dāng)前有沒(méi)有使用附身小兵并重新采用戰(zhàn)團(tuán)骨骼動(dòng)畫(huà)的判定,主體代碼不在本觸發(fā)器,了解意思即可
? ?? ???(else_try),
? ?? ?? ?? ?(try_begin),
? ?? ?? ?? ?? ? (is_between, ":var_13", 0, 400),
? ?? ?? ?? ?? ? (2611, ":var_7", ":var_29", ":var_30", ":var_74"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (is_between, ":var_13", 400, 800),
? ?? ?? ?? ?? ? (2611, ":var_7", ":var_31", ":var_32", ":var_74"),
? ?? ?? ?? ?(else_try),
? ?? ?? ?? ?? ? (is_between, ":var_13", 800, 1000),
? ?? ?? ?? ?? ? (2611, ":var_7", ":var_33", ":var_34", ":var_74"),
? ?? ?? ?? ?(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#以上表示一定概率條件下,即把":var_13"隨機(jī)數(shù)在0-1000的取值按4:4:2劃分概率區(qū)間,分別用來(lái)觸發(fā)三種不同的攻擊動(dòng)作,因?yàn)槲疑厦娴膃lse屏蔽了攻擊動(dòng)畫(huà)的條件,所以這個(gè)觸發(fā)攻擊動(dòng)作后一定會(huì)等待攻擊動(dòng)作執(zhí)行完畢一次后才能觸發(fā)下一次攻擊動(dòng)作,不會(huì)因?yàn)榭顸c(diǎn)鼠標(biāo)而鬼畜從動(dòng)畫(huà)中間打斷攻擊重置。
? ?? ???(try_end),
? ? (try_end),
? ? (this_or_next|eq, ":var_10", ":var_29"),
? ? (this_or_next|eq, ":var_10", ":var_31"),
? ? (eq, ":var_10", ":var_33"),
? ? (ge, ":var_77", ":var_78"),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?
? ? (is_between, ":var_78", 50, 180),? ?? ?? ?? ?? ?? ?? ?? ?? ?#以上是判斷攻擊動(dòng)畫(huà)執(zhí)行后是否有有效攻擊單位執(zhí)行攻擊有效傷害的條件,也就是在攻擊動(dòng)畫(huà)幀時(shí)刻分別處于3種攻擊動(dòng)畫(huà)任意一種的起始幀時(shí)刻時(shí)且面前范圍距離自身范圍(50cm,180cm)時(shí)觸發(fā)
? ? (try_begin),
? ?? ???(item_slot_eq, "itm_monkeykingbar", 308, 0),? ?? ?? ?? ? #沒(méi)有裝備金箍棒被動(dòng)時(shí),itemslot308用來(lái)判斷是否裝備此物品并可執(zhí)行被動(dòng)技能
? ?? ???(prop_instance_get_position, pos40, ":var_7"),? ?? ?? ?? ?
? ?? ???(position_move_z, pos40, 150),
? ?? ???(position_move_y, pos40, 20),
? ?? ???(position_move_x, pos40, -40),
? ?? ???(add_missile, ":var_3", 40, 64000, 0, 0, "itm_melee", 0),
? ?? ???(position_move_x, pos40, 40),
? ?? ???(add_missile, ":var_3", 40, 64000, 0, 0, "itm_melee", 0),
? ?? ???(position_move_x, pos40, 40),
? ?? ???(add_missile, ":var_3", 40, 64000, 0, 0, "itm_melee", 0),? ?? ?? ???#向面前發(fā)射三處無(wú)形模型的箭矢,重力比較大,會(huì)近處掉落,加上上面判斷必須面向有人且(50cm,180cm)距離范圍才會(huì)觸發(fā),所以會(huì)近似打擊面前的單位,類(lèi)似近戰(zhàn)攻擊效果。注意這個(gè)一看就知道是平射,如果高低坡的敵人容易打不到,因?yàn)槲业哪ЙF爭(zhēng)霸mod就是moba題材的機(jī)制,所以本來(lái)就是這個(gè)設(shè)定,高坡攻擊miss,并且由于箭矢?jìng)€(gè)頭小就近射也容易miss,所以加了一些裝備來(lái)彌補(bǔ)這個(gè)自身原始攻擊方式的不足,比如金箍棒可以無(wú)視一定高坡集中攻擊,鷹腳弓可以讓近戰(zhàn)英雄在第一人稱(chēng)時(shí)發(fā)射與自己視角協(xié)調(diào)的箭矢劍氣
? ? (else_try),
? ?? ???(agent_deliver_damage_to_agent, ":var_3", ":var_75", ":var_68"),? ?? ?#如果裝備了金箍棒物品的被動(dòng),則可以對(duì)面前一定范圍的人造成群體分裂傷害
? ? (try_end),
(try_end),
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#代碼塊8-判斷是否裝備了鷹腳弓被動(dòng),作用是近戰(zhàn)英雄攻擊時(shí)可以發(fā)出遠(yuǎn)程劍氣,可選內(nèi)容,了解即可
? ? (troop_slot_eq, "trp_player", 705, 0),? ?? ?? ?? ?? ???
? ? (item_slot_eq, "itm_eaglehorn", 308, 1),? ?? ?? ?? ?? ?? ?? ? #slot308表示是否有這個(gè)裝備的被動(dòng)功能,鷹腳弓eaglehorn,由于暫時(shí)缺少蝴蝶模型,所以這個(gè)來(lái)自dota的裝備先扮演蝴蝶的作用然后又自行加了這個(gè)特殊被動(dòng)
? ? (this_or_next|eq, ":var_10", ":var_29"),
? ? (this_or_next|eq, ":var_10", ":var_31"),
? ? (eq, ":var_10", ":var_33"),? ?? ?? ???
? ? (prop_instance_get_position, pos40, ":var_7"),
? ? (position_move_z, pos40, 150),
? ? (position_move_y, pos40, 20),
? ? (copy_position, pos41, pos40),
? ? (try_begin),
? ?? ???(eq, "$aaa", 0),
? ?? ???(eq, "$cam1", 1),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#cam1變量是判斷是否除以新鏡頭控制代碼的第一三人稱(chēng)鏡頭控制,為1是第一人稱(chēng),因?yàn)槲襯鍵作為四技能使用了,并且頂點(diǎn)動(dòng)畫(huà)人物怪物體型和戰(zhàn)團(tuán)人物差別比較大,所以另外重寫(xiě)了第一三人稱(chēng)鏡頭切換控制
? ?? ???(agent_get_look_position, pos42, ":var_3"),
? ?? ???(position_copy_rotation, pos41, pos42),? ?? ?? ?? ?? ?? ?? ?? ?? ???#以上表示第1人稱(chēng)鏡頭下下面用于發(fā)射箭矢的pos41角度要與玩家視角復(fù)制一致,也就是裝備eaglehorn可以使得玩家選擇近戰(zhàn)英雄控制的時(shí)候,第一人稱(chēng)發(fā)射任意視角方向的遠(yuǎn)程劍氣
? ? (try_end),
? ? (add_missile, ":var_3", 41, 64000, 0, 0, "itm_swift", 0),
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#代碼塊8-結(jié)束
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#代碼塊9-判斷玩家控制的頂點(diǎn)動(dòng)畫(huà)英雄是否是遠(yuǎn)程還是近戰(zhàn)英雄,如果是遠(yuǎn)程英雄,則按左ctrl鍵可以不受面前近距離是否有敵人的條件釋放箭矢missle,代碼結(jié)構(gòu)比較像我上面的循環(huán)近戰(zhàn)攻擊代碼,可選內(nèi)容,了解即可。
? ? (agent_slot_eq, ":var_3", 331, 1),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#slot331號(hào)的agentslot為1代表這個(gè)英雄是遠(yuǎn)程英雄,這個(gè)會(huì)在其他觸發(fā)器設(shè)定取值
? ? (key_is_down, key_left_control),
? ? (try_begin),
? ?? ???(neg|gt, ":var_10", ":var_30"),
? ?? ???(ge, ":var_10", ":var_29"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_32"),
? ?? ???(ge, ":var_10", ":var_31"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_34"),
? ?? ???(ge, ":var_10", ":var_33"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_36"),
? ?? ???(ge, ":var_10", ":var_35"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_38"),
? ?? ???(ge, ":var_10", ":var_37"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_40"),
? ?? ???(ge, ":var_10", ":var_39"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_42"),
? ?? ???(ge, ":var_10", ":var_41"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_44"),
? ?? ???(ge, ":var_10", ":var_43"),
? ? (else_try),
? ?? ???(neg|gt, ":var_10", ":var_46"),
? ?? ???(ge, ":var_10", ":var_45"),
? ? (else_try),
? ?? ???(troop_slot_eq, "trp_player", 705, 1),
? ? (else_try),
? ?? ???(try_begin),
? ?? ?? ?? ?(is_between, ":var_13", 0, 400),
? ?? ?? ?? ?(2611, ":var_7", ":var_29", ":var_30", ":var_74"),
? ?? ???(else_try),
? ?? ?? ?? ?(is_between, ":var_13", 400, 800),
? ?? ?? ?? ?(2611, ":var_7", ":var_31", ":var_32", ":var_74"),
? ?? ???(else_try),
? ?? ?? ?? ?(is_between, ":var_13", 800, 1000),
? ?? ?? ?? ?(2611, ":var_7", ":var_33", ":var_34", ":var_74"),
? ?? ???(try_end),
? ? (try_end),
? ? (this_or_next|eq, ":var_10", ":var_29"),
? ? (this_or_next|eq, ":var_10", ":var_31"),
? ? (eq, ":var_10", ":var_33"),
? ? (prop_instance_get_position, pos40, ":var_7"),
? ? (position_move_z, pos40, 150),
? ? (position_move_y, pos40, 20),
? ? (copy_position, pos41, pos40),
? ? (try_begin),
? ?? ???(eq, "$aaa", 0),
? ?? ???(eq, "$cam1", 1),
? ?? ???(agent_get_look_position, pos42, ":var_3"),
? ?? ???(position_copy_rotation, pos41, pos42),
? ? (try_end),
? ? (agent_get_slot, ":var_79", ":var_3", 332),
? ? (add_missile, ":var_3", 41, 64000, 0, 0, ":var_79", 0),
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#代碼塊9-結(jié)束
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ????#代碼塊10-集中判斷一些一次性執(zhí)行的動(dòng)畫(huà)動(dòng)作終止的條件,一般就是像上面嘲諷動(dòng)作一樣,動(dòng)畫(huà)播放到尾幀時(shí)刻回歸執(zhí)行idle的待機(jī)動(dòng)作
? ? (eq, ":var_10", ":var_33"),
? ? (stop_all_sounds, 1),
? ? (play_sound_at_position, "snd_juggatkdouble", pos15),? ?? ?? ?? ? # 以上表示如果開(kāi)始播放第三個(gè)動(dòng)作的起始幀,就會(huì)發(fā)出暴擊的音效
(else_try),
? ? (this_or_next|eq, ":var_10", ":var_46"),
? ? (this_or_next|eq, ":var_10", ":var_30"),
? ? (this_or_next|eq, ":var_10", ":var_32"),
? ? (eq, ":var_10", ":var_34"),
? ? (2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (eq, ":var_10", ":var_46"),
? ? (stop_all_sounds, 1),
? ? (play_sound_at_position, "snd_reborn", pos15),? ?? ?? ?? ?? ?? ??# 以上表示如果播放到3種攻擊動(dòng)作或死亡動(dòng)畫(huà)的尾幀時(shí)刻,則回歸執(zhí)行idle的待機(jī)動(dòng)作,特別的,如果執(zhí)行到死亡的尾幀時(shí)刻,播放重生音效。死亡動(dòng)作的設(shè)定在ti kill這個(gè) trigger的觸發(fā)器里另外寫(xiě),不在本觸發(fā)器里。
(else_try),
? ? (eq, ":var_10", ":var_45"),
? ? (stop_all_sounds, 1),
? ? (play_sound_at_position, "snd_dotadeath", pos15),? ????# 以上表示如果播放到死亡動(dòng)畫(huà)的起始幀時(shí)刻,播放死亡音效
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?#代碼塊10-結(jié)束
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???
? ? (neg|gt, ":var_10", ":var_26"),
? ? (ge, ":var_10", ":var_25"),
? ? (assign, "$stoprun", 0),
(else_try),
? ? (assign, "$stoprun", 1),
(try_end),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ??#以上是判斷頂點(diǎn)動(dòng)畫(huà)處于跑步行為的幀時(shí)刻區(qū)間時(shí)$stoprun設(shè)0,其他情況設(shè)1,對(duì)$stoprun的判斷寫(xiě)在了其他觸發(fā)器里,作用是和其他變量一起組合判斷玩家是否要用agent set no dynamic這個(gè)op來(lái)強(qiáng)制玩家不可以隨便移動(dòng),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???一般$stoprun為1的情況是不可以移動(dòng)的,比如我釋放技能和攻擊時(shí)會(huì)強(qiáng)制玩家no dynamic進(jìn)而取消了系統(tǒng)控制的位移行為。
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ? #RTS-2鏡頭狀態(tài)和第1/3人稱(chēng)時(shí)的鏡頭控制在其他觸發(fā)器里,
RTS-1鏡頭狀態(tài)即$aaa為1時(shí)因?yàn)橐恍┎煌⑿鄣溺R頭需求寫(xiě)在了這里
? ? (eq, "$aaa", 1),
? ? (agent_get_look_position, pos4, ":var_3"),
? ? (position_copy_rotation, pos2, pos4),
? ? (position_move_y, pos2, "$rog"),
? ? (position_move_z, pos2, 90),
? ? (mission_cam_set_mode, 1),
? ? (mission_cam_set_position, pos2),
(try_end),
(try_begin),? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ?? ???#? ? 到上面為止示例基本結(jié)束了,以下的代碼是對(duì)一些特殊補(bǔ)丁添加的新英雄的判斷,不多解釋?zhuān)康臑榱碎_(kāi)局執(zhí)行一下idle待機(jī)動(dòng)作,因?yàn)椴糠植捎靡帽灸_本動(dòng)作控制的英雄,需要重新覆蓋一個(gè)新的propslot動(dòng)作序列參數(shù),導(dǎo)致重新賦值時(shí)動(dòng)畫(huà)開(kāi)在一個(gè)循環(huán)類(lèi)的高優(yōu)先級(jí)動(dòng)作上比如技能動(dòng)作,所以要開(kāi)局卡一定cd后給予一個(gè)判斷重置動(dòng)作到idle的量
? ? (troop_slot_ge, "trp_player", 736, 1),
? ? (agent_get_slot, ":var_80", ":var_3", 335),
? ? (try_begin),
? ?? ???(is_between, ":var_80", 1, 30),
? ?? ???(val_add, ":var_80", 1),
? ?? ???(agent_set_slot, ":var_3", 335, ":var_80"),
? ?? ???(eq, ":var_80", 20),
? ?? ???(2612, ":var_7", ":var_21", ":var_22", ":var_55"),
? ? (try_end),
? ? (try_begin),
? ?? ???(agent_slot_eq, ":var_3", 335, 0),
? ?? ???(agent_set_slot, ":var_3", 335, 1),
? ? (else_try),
? ?? ???(agent_slot_eq, ":var_3", 335, 30),
? ?? ???(troop_slot_ge, "trp_player", 679, 2),
? ?? ???(agent_set_slot, ":var_3", 335, 0),
? ? (try_end),
(try_end),




騎砍mod程序理論獨(dú)家--物體頂點(diǎn)動(dòng)畫(huà)控制原理及應(yīng)用的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
深水埗区| 黎平县| 兴隆县| 元氏县| 招远市| 新疆| 子长县| 高青县| 浙江省| 临西县| 玛曲县| 曲阜市| 沛县| 文昌市| 安顺市| 澳门| 鄱阳县| 卓资县| 明光市| 板桥市| 东阿县| 精河县| 广东省| 淳安县| 韶山市| 湘乡市| 松原市| 霍州市| 宁德市| 宁南县| 封开县| 雷州市| 常德市| 九龙坡区| 吉林省| 凤翔县| 河北区| 广东省| 津南区| 买车| 太仓市|