天天看點

ue4實作劍盾戰鬥

一、武器的添加

方法1:

建立插槽

打開人物骨骼界面(在任意動畫裡也能看到骨骼界面)

找到左右手,分别建立一個插槽,命名為劍和盾

ue4實作劍盾戰鬥

然後放預覽,調好位置,人物藍圖添加元件,藍圖那attach就行

方法2:

将劍盾建立為actor,也放到插槽

二、舉盾

使用瞄準偏移(不用混合空間),放入不舉盾和舉盾的動畫,參數設定為rise(不适用瞄準偏移的動畫序列是放不進去的)

可以将瞄準偏移直接放在狀态機後面

在人物藍圖中增加變量rise,按下右鍵時根據時間軸節點設定rise的值,松開右鍵時反向執行時間軸

在動畫藍圖中将人物藍圖的rise值傳入

最後添加布爾值 是否舉盾了,當rise為1時設定為是,便于後面邏輯

注意原本的站立等姿勢也要改變為持劍盾時的姿勢

三、閃避動作實作及限制

注意優先級,如播放動畫時,在空中時,舉盾時哪些是互斥的

空中不能閃避,通過檢測實作,用到節點is falling

要流暢,在蒙太奇動畫快結束時使用通知

要更流暢的話,在收到通知後又有任何其他輸入(如按w前進、s後退)且輸入的值>0時(意思就是閃避動畫播放還沒結束,但你按了w使前進輸入大于了0,它才提前結束這個閃避動畫),停止播放目前蒙太奇動畫(可以用get anim instance獲得目前mesh的動畫)。通過在輸入移動的後面添加判斷和結束目前蒙太奇動畫來實作。

四、移動

設定完角色移動旋轉後,要使其閃避之類的更流暢,可以:

ue4實作劍盾戰鬥

可以設定舉盾時的最大移動速度,就可以當舉盾時降低速度

狀态機實作跳躍

eg:站立到起跳的條件為isinair?,起跳到跳躍中的條件為:起跳的動畫的剩餘時間<0.1

優化:解決落地時接着移動腳不動滑步的問題

ue4實作劍盾戰鬥

速度大于10其實差不多就是有速度時,就進入站立/走路/跑步,而原地跳躍它就會正常落地

在閃避動畫中添加多一個通知:combo,後面的攻擊會講

五、攻擊

使用結構體存儲攻擊的各項參數,建立-藍圖-結構

結構體中添加3個變量:攻擊動畫(蒙太奇引用)、傷害(浮點)、攻擊方式(命名)

然後在人物藍圖中建立新的變量,類型為上面的結構體,并設為數組,往裡添加幾個元素

攻擊的蒙太奇動畫需要兩個通知,一個attack,一個attackover,前者用于開啟傷害判定,位置放在快砍到敵人的時候;後者用于通知結束可銜接下一個. 若一個動畫有多個攻擊點位,如揮兩下,則設兩個攻擊通知

連擊:在attackover的通知後,動畫結束前,增加一個通知combo,即在攻擊結束後,動畫結束前再按下攻擊鍵則發動下一擊,否則ID歸0

注意在閃避處也添加個combo(可放在開頭).

注意:變量“正在動畫中”的開啟是在動畫播放前,而關閉是在收到動畫結束的通知時

六、ai

此處不使用行為樹

break rotation和make rotation可以把ai轉向的向量隻應用在z軸,用Rinterp to時轉向更柔滑。

ue4實作劍盾戰鬥

讓ai轉向人物的事件每0.01s執行一次,相當于每幀都執行了

ue4實作劍盾戰鬥

類似于ai繞着玩家移動等操作可以自行實作

建立一個枚舉變量,命名為ai_state,用于ai目前狀态,分别建立站立、攻擊、舉盾、移動狀态

在ai藍圖中使用枚舉,用switch,case某個狀态,執行某個操作

攻擊:

ue4實作劍盾戰鬥

用simple move to或者move to都行

注意:simple move to actor需要設定導航網格體

然後用switch選擇執行成功或者失敗後的操作

ue4實作劍盾戰鬥

移動:

就移動,用輸入移動相關的節點

移動到目的地才攻擊

ue4實作劍盾戰鬥

略略略

ai攻擊動畫可以随便一點,直接用random

ue4實作劍盾戰鬥

而ai狀态的改變也可以設定一段時間執行一次事件,用于改變狀态

限制ai攻擊頻率可以:每次播放動畫後id+1,id大于一定數量後将一個bool變量限制設為真,為真時ai不能攻擊,延遲幾秒将它設定為假

後期也要把攻擊做到結構裡,當有傷害、類型之類的需要考慮時

七、資料表實作ai受擊動畫

建立結構體:反應

建立倆變量:受到攻擊的反應、格擋受到攻擊的反應(蒙太奇動畫類型)

建立資料表格,選擇反應的結構體為行結構。

添加一些新行,行的名稱為再前面那個結構體的攻擊類型

把受擊動畫添加到此處,動畫要建立為蒙太奇,且最後加個animationover(動畫播放完畢

增加一個函數庫,放通過攻擊類型得到兩個受擊動畫(普通和格擋)的函數,放在函數庫可能是因為人物和ai都能用?用到節點 get data table rowXXXX獲得資料表行

ue4實作劍盾戰鬥

然後在ai藍圖中使用該函數,傳回的結果可以拖出來,選擇具體是哪個動畫(根據目前是否格擋來判斷)

傷害判定(重要!~

添加一個射線檢測,命名為attack,設定其預設為忽略,然後進入ai藍圖,自定義碰撞設定,将attack從忽略改為碰撞,這樣就隻有這個ai能檢測到這個射線

總體思路:

在小白人動畫藍圖中(因為是和動畫通知有關),收到通知attack時,生成多球體射線檢測(射線類型改為剛剛的attack),向量從目前位置到目前位置+向前方向乘以一定數字,當檢測到的actor為ai時,向藍圖接口發送資訊,資訊需要類型轉換為小白人,通過目前ID和attack結構體數組,得到此次攻擊的攻擊方式和傷害,然後再通過藍圖接口傳到ai上。

而ai收到藍圖接口傳來的資訊後,由攻擊方式得到行名,得到受擊動畫并執行

為ai設計舉盾

現在ai動畫藍圖中,将ai藍圖的舉盾值rise傳給ai動畫藍圖

當ai受到攻擊後(發現敵人後or等等等等),變更狀态,相當于變成戰鬥狀态,可以舉盾狀态

增加一個函數,漸變rise舉盾值。在攻擊前,将rise從目前的漸變到0;在舉盾時,将rise從目前漸變到1,然後compare 1,若大于或等于(即舉盾成功),将布爾變量block設為真,若小于,設為假

各種block的限制,設定,請自行調試,請自己讓ai看起來更智能

八、鎖定敵人功能

總體思路:按下R獲得最近的ai對象,每幀執行事件:當ai對象有效時,鎖定它

建立變量,資料類型為ai

建立變量,改為map類型(鍵值對),鍵:ai,值:float(存放距離

先獲得所有的ai類的對象,将對象和距離全部存入map

ue4實作劍盾戰鬥

 用一次重新整理一次map裡的值

ue4實作劍盾戰鬥

 獲得最小距離的值的key,設為所選ai,可以用自帶的min of float array找到最小的值的下标和值的大小

ue4實作劍盾戰鬥

 接着鎖定這個ai,在每幀執行事件後(已經有一個人物朝向跟随控制器方向的功能)添加

ue4實作劍盾戰鬥

 這樣就可以鎖定時視角隻可以上下調動,而不能橫着動(z軸被鎖定了)。瞬間扭頭鎖定很違和,讓他有個過渡。加一個FInterp to,直接用錄影機的z軸rotation作為過渡終點的話,由于事件每幀都在進行,可能會受到其他幀時的rotation影響,是以使用getactorrotation作為過渡終點

ue4實作劍盾戰鬥

 仍然會有一個沖突,會和前面人物朝向跟随控制器方向的功能沖突,是以設定一下,當鎖定時取消那個功能,不鎖定時再開啟

取消鎖敵可以直接清空target和targetinfo那個map

當敵人在牆後時是鎖定不了的,障礙物檢測:

在将所有ai資訊和距離傳入map,設定完target後,檢測自己面前有沒有障礙物:添加多球體射線檢測,從目前位置到target的位置,若有,則設定target為空 

ue4實作劍盾戰鬥

(這樣不會bug嗎,萬一球體沒檢測完,就鎖定到target了?

九、彈出傷害數字,ai血條

建立ui,添加text且隻留一個text文本,内容居中

當ai受傷時,直接creat widget,選擇剛剛的ui,然後add to viewport(添加到視口)。這時并不會在ai身上生成,是以要:添加set position to viewport(設定視口中的位置),關閉remove DPIscale,使用節點 将ai位置轉換為視口中的位置,并連上去

ue4實作劍盾戰鬥

 為傷害數字添加動畫:往上飄一會然後消失

建立動畫damage,添加text

ue4實作劍盾戰鬥

 在一定秒數後,改變position y,然後添加關鍵幀

在開始,設定透明度A為1,確定一開始是不透明的,在中間,改變RGBA的A為1,在最後改變為0,他就會在中間開始逐漸消失

接下來将傷害值傳入控件

文本内容建立綁定,函數中,建立變量,打開變量的可編輯執行個體和生成時公開,眼睛打開,這樣在使用控件時,能輸入此值 

ue4實作劍盾戰鬥
ue4實作劍盾戰鬥

使用時将damage傳入即可

 注意,當格擋模式時,傷害要改變

顯示血條

此處為顯示在ai頭上,若要顯示在螢幕上方,則和ui界面類似

在ai藍圖的元件中添加一個widget(中文叫控件),在内容建立控件,添加進度條

ue4實作劍盾戰鬥

 拉好框框完美蓋好這個進度條,可以将敵人名字添加為文本放進去

然後應用在ai藍圖的widget裡,調好大小位置

綁定好進度條的變量,數值為目前血量/最大血量

在ai藍圖中添加變量HP和maxHP,傳入自身控件widget,這裡類型轉換為控件類型,然後獲得自身的控件對象傳入

ue4實作劍盾戰鬥

注意:記得把自身控件widget碰撞改為忽略,不然被檢測到障礙物會無法鎖定

修複bug:在傳遞HP給控件前,判斷HP是否有效,有效才傳

ue4實作劍盾戰鬥

當ai HP小于等于0時,死亡,并将控件HP和自身銷毀destroy,再類型轉換為小白人,将鎖定用的target和targetinfo給清空

ue4實作劍盾戰鬥

10、等級系統

大緻和血條那些差不多

文本夾雜變量可以用format text(和query資料庫那個差不多?)

ue4實作劍盾戰鬥
ue4實作劍盾戰鬥

可以将角色人物的對象存到ui控件裡,然後直接拖出來人物裡的量

ai死亡增加經驗 

ue4實作劍盾戰鬥

傷害随等級提升略

當等級過高時,傷害數值超過浮點型範圍,算一個小bug,不過一般等級不會到那麼高

11、ai攻擊

幾乎等于人物攻擊ai反過來,ai動畫藍圖中要得到自身對象,可以用節點“try get pawn owner”

ai藍圖中一樣通過藍圖接口,發送message且附帶傷害等參數,由小白人藍圖接收

自己的想法ps:格擋反擊應該就是格擋成功播放攻擊動畫吧?

12、玩家死亡和受擊顫動

死亡:略,可以錄影機變暗變亮,重新開始關卡,或者添加新的ui之類的

受擊顫動

建立類camerashake,調好振動時間,pitch、yaw、roll的值,程度也可以在使用時調

在藍圖中使用play camera shake

ue4實作劍盾戰鬥

結束

參考視訊:aboutcg免費教程

繼續閱讀