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

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

TomLooman_ActionRoguelike_第十二章環(huán)境查詢再生機(jī)器人

2023-08-18 15:18 作者:別叫我小紅  | 我要投稿


該專欄用于保存對TomLooman的ActionRoguelike項目的學(xué)習(xí)筆記,學(xué)習(xí)過程中的思考與記錄不一定準(zhǔn)確。


教程參考:https://github.com/tomlooman/ActionRoguelike

基于UE5.0的項目實現(xiàn):https://github.com/CarolBaggins2023/TomLooman_ActionRoguelike_Tutorial

2023_08_11

EnvironmentContexQuery和生成機(jī)器人:EQS尋找機(jī)器人生成點,自定義的GameMode

?

我們想要在世界中生成一些機(jī)器人,這些機(jī)器人不是在編輯器中拖到世界中的,而是在世界中Spawn的,就像刷新的怪物那樣。這類涉及到游戲機(jī)制的內(nèi)容通常由GameMode決定,所以我們要自定義一個GameMode。

?

我們自定義的GameMode繼承自GameModeBase類,而不是GameMode類,兩者的區(qū)別是GameMode范圍更小,趨向于類似虛幻爭霸的游戲。

?

我們希望在游戲開始后,在玩家周圍生成bot,一般來說與“游戲開始”有關(guān)的功能會寫在BeginPlay中,但是因為GameMode本身就要調(diào)用其他對象的BeginPlay,所以GameMode本身沒有BeginPlay,但有StartPlay,所以我們要在自定義GameMode的StartPlay中實現(xiàn)功能。

首先要保證通過Super::StartPlay()正常執(zhí)行StartPlay該執(zhí)行的工作,然后我們通過Timer句柄,以一定的時間間隔,循環(huán)調(diào)用生成bot的函數(shù)。SetTimer的最后一個參數(shù)就表示是否循環(huán)。

這里我們要創(chuàng)建時間句柄成員變量和控制循環(huán)間隔的成員變量。

Timer句柄中循環(huán)調(diào)用的SpawnBotTimerElapsed進(jìn)行環(huán)境查詢,并生成查詢實例。其中UEnvQueryManager::RunEQSQuery的第一個參數(shù)表示在哪個世界中,第二個參數(shù)是查詢模板(用之后會講的我們在編輯器中自定義的環(huán)境查詢賦值),第三個參數(shù)是查詢者指針,第四個參數(shù)是在編輯器中見過的,在環(huán)境查詢生成的點中,是選擇最優(yōu)點,前5%的點,還是怎么選,第五個參數(shù)與藍(lán)圖使用有關(guān)(沒弄明白)。

在查詢返回的UEnvQueryInstanceBlueprintWrapper類的查詢實例中有一個委托GetOnQueryFinishedEvent,當(dāng)查詢結(jié)束后進(jìn)行廣播。因為我們是要在玩家周圍生成機(jī)器人,應(yīng)當(dāng)在環(huán)境查詢結(jié)束后,執(zhí)行在查詢點上生成bot的操作,所以我們讓生成bot的函數(shù)監(jiān)聽環(huán)境查詢結(jié)束委托。

這里我們要創(chuàng)建環(huán)境查詢的成員變量,之后在編輯器中要創(chuàng)建一個EQS并賦值。

委托的兩個參數(shù)是得到的查詢實例和查詢狀態(tài)。當(dāng)查詢狀態(tài)為成功時,我們通過GetResultsAsLocations得到表示為Location的查詢結(jié)果,并用類似于子彈生成的方法,用GetWorld()->SpawnActor生成bot。

注意,這里要處理生成時發(fā)生碰撞的情況,否則bot會因為與floor發(fā)生碰撞而無法正常生成(教程中是可以的)。默認(rèn)狀態(tài)下發(fā)生碰撞時bot不生成,所以我們改為始終生成。

這里我們要創(chuàng)建生成bot的類別的成員變量,和之前生成子彈類似,表示某個類別時,我們創(chuàng)建TSubclassOf<>類的成員變量,并在編輯器中將我們機(jī)器人的藍(lán)圖賦給它。

綜上所述,游戲開始后在玩家周圍生成bot的邏輯是,游戲開始后通過GameMode在世界中間隔地進(jìn)行環(huán)境查詢,在玩家周圍生成環(huán)境查詢點。當(dāng)環(huán)境查詢結(jié)束后,廣播環(huán)境查詢結(jié)束的委托,從而執(zhí)行生成bot的函數(shù)。在生成bot的函數(shù)中,在環(huán)境查詢結(jié)果對應(yīng)的位置上生成bot。

現(xiàn)在我們還缺少查詢玩家周圍點的EQS。我們新建如下的EQS,仍然是DonutPoints,但查詢點生成的中心是我們自定義的包括所有玩家的查詢情景,而不是只有目標(biāo)玩家的查詢情景。

自定義的包括所有玩家的查詢情景如下,返回的不是一個Actor,而是Actor向量。

那么相應(yīng)的,DistanceTest中也做對應(yīng)改變,

這里我們還加了一個PathFindingTest,因為對于在有些點生成的bot,不存在通向玩家的路徑,比如下面的區(qū)域,這是在一個中空方塊中,一旦bot在這里生成,就被卡住出不去了。解決這一問題的方法有兩種,一種就是用PathFindingTest節(jié)點,但是這樣消耗比較大。另一種是用NavModifierVolume,用切除的方式將不合理的導(dǎo)航網(wǎng)格去掉。

從這個EQS的使用我們也知道了,EQS不一定用在行為樹上,也不一定用在藍(lán)圖中。

?

上面的bot生成方法會一直生成bot,我們希望能隨著游戲時間增加世界中bot的數(shù)量,但又不是無限增加。所以我們在生成bot時需要,設(shè)定某一時刻世界中bot的最大數(shù)量,如果當(dāng)前bot的數(shù)量等于設(shè)定的最大數(shù)量,則不再生成bot(統(tǒng)計世界中bot數(shù)量的方法之后講)。因此我們在GameMode的OnQueryCompleted中,在SpawnActor之前增加了如下語句,

其中的MaxBotCount是表示最大bot數(shù)量的成員變量,當(dāng)前世界中bot數(shù)量超過它時就退出函數(shù),不執(zhí)行下面SpawnActor的語句。而MaxBotCount又受CurveFloat類的DifficultyCurve控制,就是我們常見的x-y函數(shù),我們用時間作為x軸,用bot數(shù)量作為y軸。

我們要在編輯器中對難度曲線進(jìn)行賦值,創(chuàng)建藍(lán)圖實例的過程如下

添加點的過程與藍(lán)圖中的TimeLine類似。

?

我們在控制世界中bot數(shù)量時,需要統(tǒng)計當(dāng)前存在的bot數(shù)量。因為bot肯定有出生,被玩家攻擊,死亡的過程,所以我們需要統(tǒng)計的是當(dāng)前存活的bot數(shù)量,因此我們的bot也要像玩家控制的角色一樣擁有血量等屬性,也就是說AICharacter類需要有AttributeComponent。因此,類似對Character的操作,我們在AICharacter中加入AttributeComponent類的成員變量,并創(chuàng)建一個成員函數(shù)與屬性組件變量中的OnHealthChanged委托綁定(綁定在PostInitializeComponents進(jìn)行)。

當(dāng)子彈與bot發(fā)生overlap時,子彈類檢測到bot帶有屬性組件,所以觸發(fā)bot的屬性組件的ApplyHealthChange函數(shù),在ApplyHealthChange函數(shù)中對OnHealthChanged委托進(jìn)行廣播,從而執(zhí)行監(jiān)聽的OnHealthChanged成員變量,判斷bot當(dāng)前的血量,執(zhí)行死亡相關(guān)操作(死亡相關(guān)操作后面講)。

bot帶有屬性組件類的成員變量后,我們還可以修改bot的Mesh,實現(xiàn)類似玩家Character的受擊發(fā)光效果,只要將之前創(chuàng)建的MaterialFunction與bot材料的EmissiveColor連接即可。

還可以實現(xiàn)在bot身上顯示傷害數(shù)字的效果,在bot的藍(lán)圖中創(chuàng)建OnHealthChanged委托的執(zhí)行流,其中創(chuàng)建我們之前做的顯示傷害的UI即可。這里我們還實現(xiàn)了加血時顯示不同的動畫(其實只改了顏色)。


TomLooman_ActionRoguelike_第十二章環(huán)境查詢再生機(jī)器人的評論 (共 條)

分享到微博請遵守國家法律
永泰县| 扶余县| 云梦县| 普兰店市| 孟连| 马鞍山市| 临朐县| 桓台县| 和平县| 无极县| 泽库县| 岳池县| 沧源| 宁陵县| 陈巴尔虎旗| 成武县| 佛冈县| 利辛县| 东海县| 晴隆县| 武宁县| 尼勒克县| 丘北县| 从化市| 哈尔滨市| 安仁县| 山阴县| 叙永县| 公主岭市| 黄龙县| 锡林郭勒盟| 昌宁县| 汪清县| 巍山| 吐鲁番市| 长宁县| 万山特区| 七台河市| 灯塔市| 名山县| 吉首市|