斯坦福UE4C++課程P70-P73創(chuàng)建BUFF世界互動
首先講作業(yè)5的解決方案
我主要是EQS生成硬幣藥水部分沒解決重疊生成問題,其實把生成過硬幣和藥水的位置記錄下來,在再次生成時判斷即可。建議看作者視頻

下面我們創(chuàng)建BUFF和DEBUFF(隨時間變化的傷害效果)
BUFFS(USActionEffect.h)
例子:傷害隨時間變化的魔法球
要求
一定持續(xù)時間
周期性效果
作用時間完,自動StopAction
在AddAction()函數(shù)自動Start
下面我們創(chuàng)建繼承自SAction的C++類SActionEffect。
SActionEffect.h
SActionEffect.cpp
注意在SActionComponent添加RemoveAction函數(shù),表示從組件中移除Action:
在SAction添加變量
編譯后,回到UE編輯器,創(chuàng)建繼承自SActionEffect的藍圖類Effect_Burning:

表示我們周期性給該Effect擁有者(debuff)施加傷害。(Apply Damage是之前我們寫的SGameplayFunctionLibrary里的函數(shù))
點擊上方類默認值,我們設(shè)置:

新加的燃燒Tag我們目前不用,后續(xù)可以根據(jù)此tag而添加Effect所有者的某些行為(Actor因燃燒而碳化,角色因燃燒而瘋狂)
我們希望在魔法球C++類中來給魔法球添加燃燒效果傷害。
頭文件添加:
cpp文件在傷害語句處改為:
意思是魔法球傷害到的Actor(有ActionComp)會被添加燃燒Effect。
我這里有個bug,就是AI死亡后,燃燒傷害會繼續(xù)施加給AI,每次受傷仍會觸發(fā)OnActorKilled函數(shù),給我們添加殺死AI的credits。我們到Attribute組件,找到ApplyHealthChange函數(shù)判定死亡的語句,把
小于等于改成小于就行了。

下面我們改進interaction組件。因為我們在此類做的只是通過碰撞query來執(zhí)行接口類的Execute_Interact函數(shù)。
SInteractionComponent.h
SInteractionComponent.cpp
接下來我們創(chuàng)建繼承自SWorldUserWidget的交互控件DefaultInteraction_Widget。按類的設(shè)定添加Canvas Panel、sizebox重命名ParentSizeBox。
添加文本,讓交互信息顯示在目標(biāo)上:


最后是布置作業(yè)6

首先我們添加Rage屬性。
在SCharacter添加Rage、RageMax,暴露在藍圖。
在OnHealthChanged函數(shù)添加
限制Rage在0到RageMax之間。
添加Rage_Widget怒氣控件,添加一個進度條即可,然后給進度條的進度值綁定函數(shù)。

由于黑洞Action使用藍圖實現(xiàn),我們只能在黑洞藍圖添加消耗Rage的邏輯。
在Action_Blackhole中重寫CanStart,當(dāng)Rage小于需要的怒氣值時不能開始Action:

在原有CanStart判定基礎(chǔ)上,添加Rage判定邏輯即可。
然后在發(fā)射黑洞后消耗RageCost=50點Rage:

現(xiàn)在的效果:

下面我們添加'Thorns' Buff荊棘(反甲)效果。
當(dāng)Duration為0時,此Effect激活后永久開啟。不為0時,按持續(xù)時間開啟。
我們直接從SAction繼承創(chuàng)建SActionEffectThorn類,因為SActionEffect類有些功能不必要(周期性),我們不從前者繼承。
SActionEffectThorn.h:
SActionEffectThorn.cpp:
此時直接給角色Action組件添加反甲效果,AI攻擊角色會受到50%的反甲傷害。我們發(fā)現(xiàn)角色燃燒效果也能夠給AI造成4*50%=2點傷害。
現(xiàn)在我們?nèi)∠催xAutoStart,添加Action映射,按T開啟Thorn效果。然后在角色類藍圖添加角色和Thorn效果的綁定:

并把Thorn效果的Duration從0改為3秒(如果仍設(shè)為0,開啟后將一直開著,不會自動關(guān))
現(xiàn)在按T開啟反甲效果,維持3秒。

下面我們添加AI發(fā)現(xiàn)玩家時的感嘆號控件。
在AI角色類添加感嘆號資產(chǎn),我們可以在藍圖為AI角色分配感嘆號藍圖:
在角色類OnSeePawn函數(shù)下添加:
創(chuàng)建繼承自SWorldUserWidget的控件藍圖PlayerSpotted_Widget,創(chuàng)建popin動畫,構(gòu)造節(jié)點后添加PlayAnimation節(jié)點即可。我們設(shè)置延時2秒后removefromparent移除控件。

最后我們創(chuàng)建授予玩家Dash能力的Powerup道具。
新建繼承自SPowerupBase的C++類SGrantDash:
編譯后,創(chuàng)建繼承自SGrantDash藍圖類GrantDashBP,分配DashActionClass資產(chǎn)為Action_Dash,mesh我選的一個藍色的十字。
最后把Dash功能從Default能力移除。
現(xiàn)在角色和藍色十字交互會擁有Dash能力。
