廣義的的說佛吓,和戰(zhàn)斗結(jié)算相關(guān)的內(nèi)容都算技能系統(tǒng)宵晚,包括技能信息管理、技能調(diào)用接口维雇、技能目標(biāo)查找淤刃、技能表現(xiàn)、技能結(jié)算吱型、技能創(chuàng)生體(buff/法術(shù)場/彈道)管理逸贾,此外還涉及的模塊包括:AI模塊(技能調(diào)用者)、動(dòng)作模塊津滞、尋路/移動(dòng)模塊以及人物屬性和傷害數(shù)值結(jié)算等铝侵。
先說下技能模塊每個(gè)部分的職責(zé)和原理:
- 技能信息管理:管理unit所擁有的技能以及技能的等級(jí)、cd等触徐。在我們游戲中咪鲜,這里還需要負(fù)責(zé)管理符文,符文會(huì)對技能信息進(jìn)行修改撞鹉。
- 技能調(diào)用接口:AI或者UI操作觸發(fā)技能疟丙,觸發(fā)技能時(shí)可能選擇了一個(gè)目標(biāo)(AI),也可能并沒有目標(biāo)鸟雏。
- 技能流程管理:一個(gè)技能可能由多個(gè)子技能以移動(dòng)的執(zhí)行模式組合而成享郊,而每一個(gè)最終執(zhí)行的技能執(zhí)行過程也存在一個(gè)流程,一般包括:前搖過程-結(jié)算點(diǎn)-后搖過程崔慧。技能在前搖結(jié)束時(shí)進(jìn)入技能真正的結(jié)算流程拂蝎,結(jié)算流程可能創(chuàng)建子彈,也可能觸發(fā)buf或者創(chuàng)建法術(shù)場惶室。
- 技能目標(biāo)查找:若技能觸發(fā)時(shí)已經(jīng)設(shè)置了技能目標(biāo)unit(如怪物AI釋放技能),則直接將其作為目標(biāo)unit玄货,否則需要根據(jù)一定的策略選擇一個(gè)目標(biāo)皇钞。此外,技能釋放的時(shí)候還需要釋放方向和釋放位置等信息松捉,也通過這個(gè)模塊獲取夹界。
- 技能表現(xiàn):技能釋放過程中,需要?jiǎng)?chuàng)建相應(yīng)的特效以及執(zhí)行相應(yīng)的動(dòng)作隘世。
- 技能創(chuàng)生體(buf/彈道/法術(shù)場)管理:buf掛在unit身上可柿,可能影響unit的一些行為和狀態(tài)鸠踪;法術(shù)場一般由場景管理,影響場景中某范圍內(nèi)的unit复斥;彈道就是技能創(chuàng)建的一個(gè)子彈营密,這個(gè)子彈可能以不同的路線移動(dòng)(直線/拋物線/直接命中等)
1、技能表
首先說下實(shí)現(xiàn)技能的基本思路目锭。實(shí)現(xiàn)技能的基本思路就是通過策劃填寫表格评汰,來配制成某些技能,在執(zhí)行某個(gè)技能的時(shí)候痢虹,分別去根據(jù)這些表格中的內(nèi)容被去,確定技能如何表現(xiàn)〗蔽ǎ基本的邏輯是:
- if skillTable.get("技能動(dòng)作"):
- paly 動(dòng)作
- if skillTable.get("特效"):
- 播放特效
- if skillTable.get("法術(shù)場"):
- 創(chuàng)建法術(shù)場
- ....
復(fù)制代碼
2惨缆、技能信息管理
unit創(chuàng)建時(shí),此模塊管理unit可使用哪些技能丰捷,比如游戲中玩家可以選擇使用哪些技能坯墨。
游戲中技能的升級(jí)、技能加點(diǎn)瓢阴、技能池管理都在這個(gè)模塊畅蹂。
此模塊還需要管理技能等級(jí)/符文/裝備等外部模塊對技能參數(shù)的修改。
3荣恐、技能調(diào)用接口
提供技能調(diào)用的接口供AI或玩家操作調(diào)用液斜,調(diào)用時(shí)可以提供一個(gè)目標(biāo)unit,也可以不提供讓技能自己查找叠穆。
提供三個(gè)接口:
- 技能開始skill_enter:開始執(zhí)行技能少漆,若技能不循環(huán)進(jìn)行,則技能可以自動(dòng)結(jié)束硼被。
- 技能結(jié)束skill_exit:有的技能不能自己結(jié)束示损,比如某些循環(huán)技能,對于循環(huán)技能玩家可以按住按鈕一直釋放嚷硫。當(dāng)玩家松開按鈕检访,調(diào)用技能結(jié)束接口,告訴當(dāng)前技能使其結(jié)束仔掸,此時(shí)技能到達(dá)后搖點(diǎn)時(shí)脆贵,技能不再繼續(xù)執(zhí)行。
- 技能停止skill_stop:當(dāng)技能被強(qiáng)制打斷時(shí)起暮,如被攻擊卖氨、暈眩、藍(lán)不足等,技能會(huì)被強(qiáng)制停止筒捺。
此外柏腻,當(dāng)前一個(gè)技能正在執(zhí)行時(shí)新的技能調(diào)用啟動(dòng),此時(shí)新的技能調(diào)用信息會(huì)被保存系吭。一般來說五嫂,并不會(huì)把所有新的技能調(diào)用信息保存下來,那樣就成了一個(gè)技能執(zhí)行的序列村斟。我們游戲僅保存一個(gè)新的技能調(diào)用信息贫导。
總的來說,技能模塊提供盡量少的接口供AI/UI等上層邏輯使用蟆盹,這樣可以有效的與AI和UI進(jìn)行解耦孩灯。
4、技能流程管理
技能流程這里分兩點(diǎn)討論:
(1)一個(gè)技能可能由多個(gè)子技能以一定的模式組合起來逾滥。
一個(gè)技能常常由多個(gè)子技能以一定的模式組合而成峰档,比如三段擊、比如沖鋒斬(先沖鋒寨昙、后斬)等讥巡,甚至還存在根據(jù)不同的環(huán)境選擇執(zhí)行不同的子技能。分析策劃需求發(fā)現(xiàn)舔哪,技能可以分成一個(gè)樹形結(jié)構(gòu)欢顷,這個(gè)樹形結(jié)構(gòu)非常類似行為樹,同樣可以將節(jié)點(diǎn)分為控制節(jié)點(diǎn)和執(zhí)行節(jié)點(diǎn)捉蚤,甚至可以包括condition節(jié)點(diǎn)抬驴。為此,我們項(xiàng)目引入一個(gè)技能樹概念來描述這種數(shù)據(jù)結(jié)構(gòu)缆巧。
(2)一個(gè)具體的技能(技能樹執(zhí)行節(jié)點(diǎn))也有一個(gè)固定的執(zhí)行流程布持。這個(gè)流程一般為:前搖過程、前搖過程結(jié)束=技能結(jié)算時(shí)間點(diǎn)陕悬、后搖時(shí)間點(diǎn)题暖。
4.1 技能樹
技能樹參考傳統(tǒng)行為樹的設(shè)計(jì),使用樹形結(jié)構(gòu)控制技能的執(zhí)行流程捉超。
技能樹和行為樹在結(jié)構(gòu)上比較類似胧卤,但是在運(yùn)行邏輯上有很大的不同。
首先拼岳,技能樹的重點(diǎn)并不是根據(jù)上下文選擇一個(gè)合適的節(jié)點(diǎn)執(zhí)行灌侣,而是以一定的策略將技能樹從頭到尾遍歷執(zhí)行一遍。
其次裂问,技能樹沒有tick的概念,而是基于回調(diào)的,比如一個(gè)順序節(jié)點(diǎn)堪簿,順序節(jié)點(diǎn)中一個(gè)子節(jié)點(diǎn)執(zhí)行完畢后痊乾,馬上通知順序節(jié)點(diǎn),順序節(jié)點(diǎn)執(zhí)行下一個(gè)子節(jié)點(diǎn)椭更,直至順序節(jié)點(diǎn)的最后一個(gè)子節(jié)點(diǎn)執(zhí)行完畢哪审,順序節(jié)點(diǎn)就會(huì)通知父節(jié)點(diǎn)(如果有)它已經(jīng)執(zhí)行完畢。
此外虑瀑,為了完成技能的一些需求湿滓,控制節(jié)點(diǎn)往往存儲(chǔ)更多的控制信息來控制子節(jié)點(diǎn)的執(zhí)行流程。具體的信息根據(jù)策劃需求設(shè)置舌狗,比如順序結(jié)點(diǎn)包括原子屬性和循環(huán)屬性叽奥。如果一個(gè)順序節(jié)點(diǎn)具有原子屬性,則這個(gè)順樹節(jié)點(diǎn)在執(zhí)行的過程中并不會(huì)被end痛侍,只有全部子節(jié)點(diǎn)執(zhí)行結(jié)束才可以end朝氓。
以我們游戲中戰(zhàn)士普攻三段擊為例:
三段擊本身是一個(gè)順序節(jié)點(diǎn),當(dāng)技能開始時(shí)主届,此節(jié)點(diǎn)順序執(zhí)行三個(gè)子節(jié)點(diǎn)赵哲。對于第一個(gè)子節(jié)點(diǎn),它依然是一個(gè)順序節(jié)點(diǎn)君丁,首先沖鋒至目標(biāo)單位身前枫夺,然后對目標(biāo)單位進(jìn)行揮砍。但是沖鋒節(jié)點(diǎn)還包括了一個(gè)condition绘闷,若和目標(biāo)的距離很近橡庞,則跳過沖鋒節(jié)點(diǎn),直接揮砍簸喂。
普攻是一個(gè)循環(huán)技能毙死,這個(gè)技能只要玩家點(diǎn)著按鈕不放開,技能就會(huì)一直執(zhí)行喻鳄,因此根節(jié)點(diǎn)(普攻)是一個(gè)具有循環(huán)屬性的順序節(jié)點(diǎn)扼倘。而對于子技能1(控制節(jié)點(diǎn)),他是一個(gè)具有原子屬性的順序技能除呵,即當(dāng)單位正在沖鋒時(shí)再菊,玩家松開按鈕,單位也會(huì)執(zhí)行完揮砍后才會(huì)推出技能颜曾。
纠拔!關(guān)于技能樹的使用和思考
技能樹開始的設(shè)計(jì)思路是,有些技能的執(zhí)行流程和行為樹類似泛豪,比如以一定的順序執(zhí)行一系列子技能稠诲,比如根據(jù)不同的上下文確定技能的執(zhí)行流程侦鹏。簡單的說,技能樹的引入有以下好處:1.使技能模塊可以獲得部分AI的能力臀叙,從而將和技能強(qiáng)相關(guān)的AI邏輯放在技能模塊使技能模塊和AI模塊降低耦合略水,2.可以清晰的描述技能流程,3.使用樹增加拓展性劝萤,策劃可以設(shè)計(jì)出各種各樣復(fù)雜的技能渊涝。
關(guān)于好處1,舉個(gè)例子:屠夫boss的勾子技能可以將玩家拉過來床嫌,若成功的拉過來跨释,boss會(huì)執(zhí)行一個(gè)攻擊子技能,否則不執(zhí)行厌处。通過這樣可以將勾人和攻擊作為兩個(gè)子技能構(gòu)成技能樹鳖谈,攻擊子技能有一個(gè)condition過程,即判斷上一個(gè)子技能是否成功嘱蛋。
技能樹在使用后慢慢發(fā)現(xiàn)一些問題蚯姆,首先,技能樹的同步要求每個(gè)樹節(jié)點(diǎn)都進(jìn)行同步洒敏,增加同步負(fù)擔(dān)龄恋,其次,技能本身并不會(huì)有太復(fù)雜的控制結(jié)構(gòu)凶伙。
為此郭毕,后來我們對技能樹進(jìn)行了優(yōu)化:
簡化同步信息,不再同步所有節(jié)點(diǎn)的enter/exit信息(具體參考文章《技能模塊的同步》)函荣。
取消并行節(jié)點(diǎn)显押,通過拓展表頭實(shí)現(xiàn)一個(gè)技能同時(shí)執(zhí)行多件事情。
最終的技能樹基本上是只有順序/隨機(jī)兩種控制類型節(jié)點(diǎn)傻挂,節(jié)點(diǎn)擁有較輕度的condition功能乘碑。
4.2 執(zhí)行節(jié)點(diǎn)的技能流程
一般來說,技能的執(zhí)行流程包括:
前搖時(shí)間:技能開始金拒,但是技能真正的結(jié)算流程還沒開始兽肤。技能開始以后,機(jī)能相關(guān)的特效和動(dòng)作就開始播放绪抛。
前搖時(shí)間結(jié)束:技能前搖結(jié)束時(shí)技能開始真正的釋放以及結(jié)算资铡,等技能前搖結(jié)束以后,技能真正的釋放并結(jié)算幢码。釋放包括創(chuàng)建相應(yīng)的彈道/法術(shù)場和buff笤休。
技能后搖點(diǎn):技能播放到后搖點(diǎn)時(shí)間時(shí),技能真正的結(jié)束症副。這時(shí)店雅,技能對應(yīng)的特效以及人物動(dòng)作可能還會(huì)繼續(xù)播放政基,但是技能流程已經(jīng)正式結(jié)束了。也就是說底洗,下一個(gè)技能可以執(zhí)行腋么。
5、技能目標(biāo)查找
技能釋放時(shí)亥揖,目標(biāo)可能已經(jīng)由AI傳給了技能模塊,也有可能沒有一個(gè)目標(biāo)圣勒,如玩家控制單位费变。
技能在釋放法術(shù)場、彈道的時(shí)候圣贸,重要的是技能的方向而不是技能目標(biāo)一般來說挚歧,技能獲得一個(gè)目標(biāo)對象以后,技能的方向就是釋法者到目標(biāo)的方向吁峻。
此外滑负,技能方向可能需要一些配置,如前搖鎖定(前搖過程中目標(biāo)移動(dòng)用含,技能方向不變)矮慕,UI可控制(技能釋放過程中,玩家可以通過控制UI控制技能的釋放方向)啄骇。
6痴鳄、技能表現(xiàn)
技能的表現(xiàn)包括動(dòng)作、特效缸夹、shader痪寻、音效等。其中虽惭,特效比較復(fù)雜橡类,需要配置的內(nèi)容也比較多。比如芽唇,有些特效掛在模型上顾画,有的特效掛在場景里。對于法術(shù)場的特效披摄,分別可以分為法術(shù)場開始亲雪、結(jié)算、結(jié)束特效疚膊,分別在法術(shù)場開始時(shí)义辕、結(jié)算時(shí)、結(jié)束時(shí)顯示寓盗。對于buff也類似灌砖。
7璧函、彈道、法術(shù)場和buff等技能創(chuàng)生體
狹義的來說基显,技能只是負(fù)責(zé)技能的執(zhí)行流程(技能樹管理以及技能流程管理)蘸吓,而技能真正的結(jié)算主要是由其創(chuàng)生體結(jié)算的。當(dāng)技能前搖結(jié)束開始生效時(shí)撩幽,技能創(chuàng)建相應(yīng)的彈道和法術(shù)場库继,法術(shù)場彈道擊中敵人時(shí)又有可能產(chǎn)生相應(yīng)的buff。
一般來說窜醉,法術(shù)場是一個(gè)場景的某塊檢測區(qū)域宪萄,每隔一段時(shí)間法術(shù)場檢測此區(qū)域的敵人,并對其攻擊結(jié)算榨惰。
彈道是一類子彈移動(dòng)路徑的抽象拜英,創(chuàng)建一個(gè)彈道就表示一個(gè)子彈特效沿這個(gè)彈道移動(dòng)并檢測路徑上的敵人。
buff就是掛在單位身上的一個(gè)具有持續(xù)時(shí)間的狀態(tài)琅催,狀態(tài)對單位產(chǎn)生一些正面或者負(fù)面的影響居凶,并且在此段時(shí)間內(nèi),每隔一段時(shí)間進(jìn)行一次傷害結(jié)算 藤抡。
對于技能侠碧、法術(shù)場、buff之間的功能界定并不是很固定,比如技能能否直接對單位造成傷害,法術(shù)場能否對單位造成傷害皿淋,甚至技能只能創(chuàng)建法術(shù)場辐宾,法術(shù)場只能檢測目標(biāo)不能造成傷害,只能掛buff,而所有的傷害都是通過buff來結(jié)算。當(dāng)然,這樣并不一定好盛垦,一般來說,技能和法術(shù)場都可以對單位造成傷害瓤漏。
總之腾夯,創(chuàng)生體功能的界定需要根據(jù)策劃需求、效率考慮等因素調(diào)整蔬充。
7.1 Buff狀態(tài)
Buff就是掛在單位身上持續(xù)一定時(shí)間的有益或者有害的狀態(tài)蝶俱,這里狀態(tài)=buff。
Buff模塊有個(gè)需要注意的是Buff之間的相互關(guān)系饥漫,如排斥(A狀態(tài)在榨呆,B狀態(tài)掛不上去),清除(A狀態(tài)掛上去同時(shí)導(dǎo)致B狀態(tài)消失)等庸队。
為了實(shí)現(xiàn)以上功能积蜻,最簡單的方式是在狀態(tài)A中直接填寫狀態(tài)關(guān)系狀態(tài)字段闯割,如狀態(tài)A排斥狀態(tài)B/C/D/E...,A狀態(tài)清除狀態(tài)X/Y/Z...竿拆。
以上的實(shí)現(xiàn)方式有個(gè)問題宙拉,等游戲做到后期,我們有成千上萬個(gè)buff狀態(tài)丙笋,那么一個(gè)魔法免疫狀態(tài)谢澈,策劃需要填表的排斥狀態(tài)可能成千上萬。
為了解決這個(gè)問題不见,可以使用分類的思想解決澳化。定義某類狀態(tài)和另一類狀態(tài)之間的規(guī)則。
基于以上思想稳吮,引入一個(gè)叫buff原子狀態(tài)的概念,原子狀態(tài)表示一類狀態(tài)井濒,如減速灶似、禁魔、魔免瑞你、懸空酪惭、暈眩、變羊等等等者甲。
在給單位掛一個(gè)新的buff的之前春感,查詢此buff持有的原子狀態(tài)和單位身上已經(jīng)有的原子狀態(tài)之間的關(guān)系,根據(jù)單位身上已有的原子狀態(tài)判定新的原子狀態(tài)應(yīng)該使用何種行為處理虏缸。
此處的何種行為鲫懒,代表的就是原子狀態(tài)之間的規(guī)則,如排斥等刽辙。這些規(guī)則可以讓策劃填一個(gè)名字叫“原子狀態(tài)關(guān)系”的表窥岩,此表是一個(gè)n*n的二維數(shù)組,n為游戲中所有的原子狀態(tài)的數(shù)量宰缤。
原子狀態(tài)的數(shù)量遠(yuǎn)遠(yuǎn)小于buff的數(shù)量颂翼,所以可以很容易的定義這些規(guī)則。
7.2 法術(shù)場
法術(shù)場描述對一塊區(qū)域的影響慨灭,這塊區(qū)域可以每隔一段時(shí)間進(jìn)行一次檢測朦乏,檢測這塊區(qū)域內(nèi)的單位并且對單位進(jìn)行結(jié)算。
法術(shù)場需要注意一個(gè)問題氧骤,就是一個(gè)法術(shù)場每次結(jié)算可能使用不同的參數(shù)進(jìn)行結(jié)算呻疹,比如一個(gè)技能,第一次結(jié)算對每個(gè)單位進(jìn)行暈眩语淘,第二次結(jié)算對單位進(jìn)行傷害诲宇。
解決這種問題比較直接的方式是技能直接創(chuàng)建兩個(gè)法術(shù)場际歼,每個(gè)法術(shù)場結(jié)算一次,第二個(gè)法術(shù)場創(chuàng)建具有延遲時(shí)間姑蓝。但是這種方式有個(gè)問題鹅心,有可能策劃需求做一個(gè)結(jié)算十次而且每次結(jié)算的參數(shù)都不同的法術(shù)場。那么纺荧,一個(gè)技能以一定的時(shí)間間隔創(chuàng)建是個(gè)法術(shù)場旭愧,同時(shí)法術(shù)場的管理具有一定的成本,從而導(dǎo)致效率的降低宙暇。
為解決這個(gè)問題输枯,我們優(yōu)化了法術(shù)場結(jié)算的實(shí)現(xiàn)機(jī)制,增加了一種新的法術(shù)場:序列法術(shù)場占贫。這類法術(shù)場策劃可以配置法術(shù)場每次結(jié)算之間的時(shí)間間隔以及每次結(jié)算所使用的法術(shù)場參數(shù)桃熄。