摘要:本文介绍了在Unreal Engine中使用GAS系统实现通用效果Actor的优化过程。通过重构CC_EffectActor类,将硬编码内容改为蓝图可配置方式,并实现GameplayEffect的完整应用流程:1)获取目标ASC组件;2)创建效果上下文并设置来源;3)生成效果规格;4)应用效果到目标。具体实现了药瓶效果实例,通过TSubclassOf变量使蓝图可配置不同GameplayEffect。该方案提高了系统模块化程度,支持多种效果类型,为技能/物品系统开发提供了可复用的基础框架。
1.之前我们在EffectActor类里,硬编码了一些东西,为了使它更加通用/模块化,决定优化:
Source/CC_Aura/Public/Actor/CC_EffectActor.h:
// 版权归陈超所有
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "CC_EffectActor.generated.h"
class USphereComponent;
class UStaticMeshComponent;
UCLASS()
class CC_AURA_API ACC_EffectActor : public AActor
{
GENERATED_BODY()
public:
ACC_EffectActor();
protected:
virtual void BeginPlay() override;
};
Source/CC_Aura/Private/Actor/CC_EffectActor.cpp:
// 版权归陈超所有
#include "Actor/CC_EffectActor.h"
ACC_EffectActor::ACC_EffectActor()
{
// 将此参与者设置为每帧调用Tick()。如果你不需要它,你可以关闭它来提高性能。
PrimaryActorTick.bCanEverTick = false;
SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
}
// 在游戏开始或生成时调用
void ACC_EffectActor::BeginPlay()
{
Super::BeginPlay();
}
2.把其他的东西都放在蓝图子类里:
(1)添加静态网格体
![]()
去除静态网格体碰撞:

(2)添加碰撞球体
![]()
(3)写碰撞事件:

3.在C++类里添加方法:给对象添加效果
(1)获取对象的GAS:
UAbilitySystemComponent* TargetAbilitySystemComponent = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(TargetActor);

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



