欢迎光临散文网 会员登陆 & 注册

斯坦福UE4C++课程P70-P73创建BUFF世界互动

2022-11-12 17:17 作者:_Hide-on-bush_  | 我要投稿

首先讲作业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里的函数)

点击上方类默认值,我们设置:

持续3秒燃烧效果,每秒因ExecutePeriodicEffect掉一次血

新加的燃烧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能力。


斯坦福UE4C++课程P70-P73创建BUFF世界互动的评论 (共 条)

分享到微博请遵守国家法律