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

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

在Unity中制作完整的技能系統(tǒng)(代碼篇)

2022-06-01 14:28 作者:皮皮關(guān)做游戲  | 我要投稿

哈嘍~又是我暴躁老哥酒九。

上期文章向大家介紹了一下技能系統(tǒng)的思路和使用方法。那么話不多說,接下來就是有關(guān)這些功能都是如何實(shí)現(xiàn)的。整整整。

場景搭建和角色素材這些操作大家就自己去選擇準(zhǔn)備吧。素材準(zhǔn)備工作做好之后,我們就可以開始編寫具體的腳本了。

新建項(xiàng)目,新建一個文件夾命名為SkillSystem,之后我們技能系統(tǒng)所有的腳本就放在這里面了(養(yǎng)成收拾腳本的好習(xí)慣)。

PS:接下來的所有腳本我們都統(tǒng)一放進(jìn)一個命名空間中,我這里命名為MOBASkill,后面代碼中就不單獨(dú)寫出來了。

1、系統(tǒng)總體規(guī)劃

我們再來捋一捋技能系統(tǒng)的各個模塊之間是怎么互相作用的。

每一個擁有技能的角色身上,都會有一個技能管理器負(fù)責(zé)該角色的技能數(shù)據(jù)存放和生成對應(yīng)技能的預(yù)制體。在我們生成技能預(yù)制體(釋放技能)的同時,對應(yīng)的技能預(yù)制體身上掛載好的技能釋放器就會在釋放器配置工廠中找到對應(yīng)的效果算法和目標(biāo)選擇算法,并且執(zhí)行算法中的代碼,完成查找敵人并對敵人產(chǎn)生對應(yīng)的效果,最后銷毀預(yù)制體本身。

這就是一次完整的技能釋放流程。

2、技能數(shù)據(jù)類(SkillData)

我們新建腳本命名為SkillData,將技能中需要的數(shù)據(jù)都寫在這個數(shù)據(jù)類中。大家可以根據(jù)自己的設(shè)計(jì)想法來添加,我就不過多啰嗦,看著代碼講。




這里有幾個變量需要單獨(dú)說一說作用:

1.attackTargetTags和attackTargets,咋一看這兩個變量的作用似乎是一樣的,但前者表示的是在釋放技能之前該技能可以作用于哪些物體上(敵人,隊(duì)友,建筑等),后者則會在執(zhí)行技能范圍選擇算法之后返回在技能范圍中的敵人(實(shí)際攻擊到的目標(biāo))。

2.owner這其實(shí)就是掛載管理器的物體自己,在后續(xù)算法中可以更方便的調(diào)用本身的數(shù)據(jù),方法或者組件等。

3.skillIndicator是成功釋放技能之前顯示出來的輔助技能釋放的工具。

PS:通常我們定義了公有變量之后就會在Inspector窗口中生成對應(yīng)的輸入框,而當(dāng)在變量前加上[HideInInspector]之后就會該公有變量就不會在Inspector中顯示。

3、技能管理器(SkillManager)

技能管理器的作用就是存好人物的所有技能數(shù)據(jù),初始化技能數(shù)據(jù)中未填寫的部分(owner,skillPrefab,hitFxPrefab),準(zhǔn)備技能,生成技能等。因此,首先我們需要準(zhǔn)備一個數(shù)組來存放人物的全部技能,根據(jù)數(shù)據(jù)中的預(yù)制體名字(prefabName,hitFxName)給對應(yīng)的GameObject賦值的方法,生成技能時各種內(nèi)容等。來看看代碼。




這里對于能否釋放技能的條件有:

該技能ID是否存在;

技能的是否完成冷卻(利用剩余冷卻時間是否為0來判斷);

技能所需的消耗值玩家的對應(yīng)數(shù)值是否足夠。

大伙兒可以根據(jù)自己的需求來添加刪除條件。舉個例子:一個技能擁有三段釋放,那么就可以將“上一段技能是否釋放”來作為條件實(shí)現(xiàn)。生成技能這里我使用了對象池,大家也可以改成普通的實(shí)例化。后面的技能冷卻則是通過協(xié)程實(shí)現(xiàn)的。

4、釋放器配置工廠(DeployerConfigFactory)

根據(jù)之前的技能流程圖,我們可以發(fā)現(xiàn):在技能管理器中釋放技能的操作其實(shí)只有“實(shí)例化預(yù)制體”和“將技能數(shù)據(jù)傳入釋放器中”,而實(shí)際的選取敵人、執(zhí)行技能效果都是在釋放器中來完成的。那技能釋放器是怎么知道要用哪些算法的呢?我們可以看到技能數(shù)據(jù)中有兩個變量impactType和selectorType。這兩個變量中都存放的是字符串內(nèi)容,那么我們就通過這些字符串內(nèi)容來獲取到對應(yīng)的算法。這些操作由釋放器配置工廠來完成。

先準(zhǔn)備好技能范圍選擇算法和效果算法的接口:




接下來所有的相關(guān)算法都是先繼承這兩個接口,再編寫具體的邏輯。

現(xiàn)在來看釋放器配置工廠。




在類中我們用CreateObject方法來根據(jù)字符串變量找到對應(yīng)的算法,主要操作就是使用泛型(T)并且將我們的泛型約束為引用類型(where T : class),根據(jù)前文提到的算法的字符串變量的Type來創(chuàng)建對應(yīng)類型的方法。而CreateAttackSelector和CreateImpactEffects兩個方法就是把算法名補(bǔ)全之后返回指定接口類型的方法。

PS:這里的Activator.CreatInstance作用是用與指定參數(shù)匹配程度最高的構(gòu)造函數(shù)來創(chuàng)建指定類型的實(shí)例。通俗的講就是按照參數(shù)給出方法,不過它返回的是object類型,所以要轉(zhuǎn)化成我們需要的類型(as T)。

5、技能釋放器(SkillDeployer)

解決了根據(jù)數(shù)據(jù)生成算法的問題之后,在技能釋放器中就只需要初始化釋放器算法并且調(diào)用相應(yīng)的算法就好了,代碼如下:




這里釋放器就可以作為所有釋放器的父類,如果有釋放情況的不同,就繼承他在子類中進(jìn)行重寫方法。比如前文提到的:近戰(zhàn)技能釋放是如何釋放,遠(yuǎn)程技能釋放又是怎樣的等等,這里就交給大家自己完成啦。




6、技能范圍選擇算法(Selector)

顧名思義,這里要完成的內(nèi)容就是將在規(guī)定范圍中的敵人全部選擇出來。給大家演示一下扇形范圍的敵人檢測。上代碼。




說明一下整體的流程。首先我們根據(jù)技能數(shù)據(jù)中的attackTargetTags中的Tag找到所有帶有該Tag的物體,再通過一個列表的FindAll方法來找符合條件的敵人,再返回一個數(shù)組到技能數(shù)據(jù)的attackTargets中去。這樣就完成了敵人的查找。

PS:1.腳本名是一定要與釋放器配置工廠中的命名規(guī)則一致,否則無法找到。在這里范圍選擇算法名為xxxSkillSelector,而效果算法名應(yīng)該為xxxImpactEffect。2.在FindAll中使用了Lamda表達(dá)式來完成條件的限制,Vector3.Distance負(fù)責(zé)在攻擊距離內(nèi),Vector3.Angle負(fù)責(zé)在攻擊角度內(nèi)。3.這里還需要大家自己添加上敵人是否存活的選擇條件判斷、技能目標(biāo)為單個或多個的返回情況等。

7、技能效果算法(Impact)

技能的效果就有很多了。可以是回復(fù)血量,消耗法力值,減少血量等等,大家可以根據(jù)自己的需求來自行編寫。這里的例子是給敵人添加一個擊飛Buff。




為什么要用協(xié)程來持續(xù)檢測敵人呢?

因?yàn)檫@個技能是一個沖撞技能,在玩家向前位移的整個時間范圍內(nèi)檢測到的敵人都會被添加擊飛的Buff。BuffManager是一個簡單Buff系統(tǒng)中的管理器,這里不必深究。當(dāng)釋放技能時就會調(diào)用Execute中的內(nèi)容。

好了,今天的教程就暫時講到這里~

皮皮關(guān)與網(wǎng)易聯(lián)合開發(fā)了完備的游戲開發(fā)線上課程。想要進(jìn)軍游戲開發(fā)領(lǐng)域的童鞋,可戳下面鏈接了解課程詳情:

https://ke.study.163.com/course/detail/100103487

如果有任何問題,還可以通過以下入口與網(wǎng)易小伙伴取得聯(lián)系,有什么問題直接正面懟他(戰(zhàn)術(shù)后退

同時,歡迎加入游戲開發(fā)群歡樂攪基:1082025059


在Unity中制作完整的技能系統(tǒng)(代碼篇)的評論 (共 條)

分享到微博請遵守國家法律
正蓝旗| 九龙城区| 镇巴县| 双峰县| 新沂市| 抚松县| 芜湖市| 乡城县| 皮山县| 长武县| 万山特区| 阿坝县| 惠东县| 聊城市| 丰城市| 英德市| 诸城市| 邻水| 崇义县| 宁远县| 安远县| 西华县| 建昌县| 花莲县| 昭通市| 铜鼓县| 凤凰县| 突泉县| 将乐县| 岑溪市| 昌图县| 延长县| 莆田市| 海门市| 阿巴嘎旗| 桐乡市| 大理市| 洞头县| 牙克石市| 乌拉特中旗| 玉山县|