斯坦福UE4C++课程P70-P73创建BUFF世界互动
首先讲作业5的解决方案
我主要是EQS生成硬币药水部分没解决重叠生成问题,其实把生成过硬币和药水的位置记录下来,在再次生成时判断即可。建议看作者视频

下面我们创建BUFF和DEBUFF(随时间变化的伤害效果)
BUFFS(USActionEffect.h)
例子:伤害随时间变化的魔法球
要求
一定持续时间
周期性效果
作用时间完,自动StopAction
在AddAction()函数自动Start
下面我们创建继承自SAction的C++类SActionEffect。
SActionEffect.h
SActionEffect.cpp
注意在SActionComponent添加RemoveAction函数,表示从组件中移除Action:
在SAction添加变量
编译后,回到UE编辑器,创建继承自SActionEffect的蓝图类Effect_Burning:

表示我们周期性给该Effect拥有者(debuff)施加伤害。(Apply Damage是之前我们写的SGameplayFunctionLibrary里的函数)
点击上方类默认值,我们设置:

新加的燃烧Tag我们目前不用,后续可以根据此tag而添加Effect所有者的某些行为(Actor因燃烧而碳化,角色因燃烧而疯狂)
我们希望在魔法球C++类中来给魔法球添加燃烧效果伤害。
头文件添加:
cpp文件在伤害语句处改为:
意思是魔法球伤害到的Actor(有ActionComp)会被添加燃烧Effect。
我这里有个bug,就是AI死亡后,燃烧伤害会继续施加给AI,每次受伤仍会触发OnActorKilled函数,给我们添加杀死AI的credits。我们到Attribute组件,找到ApplyHealthChange函数判定死亡的语句,把
小于等于改成小于就行了。

下面我们改进interaction组件。因为我们在此类做的只是通过碰撞query来执行接口类的Execute_Interact函数。
SInteractionComponent.h
SInteractionComponent.cpp
接下来我们创建继承自SWorldUserWidget的交互控件DefaultInteraction_Widget。按类的设定添加Canvas Panel、sizebox重命名ParentSizeBox。
添加文本,让交互信息显示在目标上:


最后是布置作业6

首先我们添加Rage属性。
在SCharacter添加Rage、RageMax,暴露在蓝图。
在OnHealthChanged函数添加
限制Rage在0到RageMax之间。
添加Rage_Widget怒气控件,添加一个进度条即可,然后给进度条的进度值绑定函数。

由于黑洞Action使用蓝图实现,我们只能在黑洞蓝图添加消耗Rage的逻辑。
在Action_Blackhole中重写CanStart,当Rage小于需要的怒气值时不能开始Action:

在原有CanStart判定基础上,添加Rage判定逻辑即可。
然后在发射黑洞后消耗RageCost=50点Rage:

现在的效果:

下面我们添加'Thorns' Buff荆棘(反甲)效果。
当Duration为0时,此Effect激活后永久开启。不为0时,按持续时间开启。
我们直接从SAction继承创建SActionEffectThorn类,因为SActionEffect类有些功能不必要(周期性),我们不从前者继承。
SActionEffectThorn.h:
SActionEffectThorn.cpp:
此时直接给角色Action组件添加反甲效果,AI攻击角色会受到50%的反甲伤害。我们发现角色燃烧效果也能够给AI造成4*50%=2点伤害。
现在我们取消勾选AutoStart,添加Action映射,按T开启Thorn效果。然后在角色类蓝图添加角色和Thorn效果的绑定:

并把Thorn效果的Duration从0改为3秒(如果仍设为0,开启后将一直开着,不会自动关)
现在按T开启反甲效果,维持3秒。

下面我们添加AI发现玩家时的感叹号控件。
在AI角色类添加感叹号资产,我们可以在蓝图为AI角色分配感叹号蓝图:
在角色类OnSeePawn函数下添加:
创建继承自SWorldUserWidget的控件蓝图PlayerSpotted_Widget,创建popin动画,构造节点后添加PlayAnimation节点即可。我们设置延时2秒后removefromparent移除控件。

最后我们创建授予玩家Dash能力的Powerup道具。
新建继承自SPowerupBase的C++类SGrantDash:
编译后,创建继承自SGrantDash蓝图类GrantDashBP,分配DashActionClass资产为Action_Dash,mesh我选的一个蓝色的十字。
最后把Dash功能从Default能力移除。
现在角色和蓝色十字交互会拥有Dash能力。
