[UE5/Gameplay Ability System(GAS)] - Effect Actor 개선
인사말
안녕하세요. 이번 포스트에서는 이전에 만들었던 Aura Effect Actor
개선에 대해 작성하겠습니다.
문제점
현재 Aura Effect Actor
는 Mesh Component
와 Sphere Component
를 C++ 에서 생성했습니다.
여기서 발생한 문제점은 코드로 생성하였기 때문에 디자이너가 작업할 수 있는 유연성을 제한되었습니다.
즉, 블루프린트에서 수정하고 작업하기가 어렵게 되었습니다.
이를 개선하기 위해서 기존 코드로 작성되어 있던 Mesh Component와 Sphere Component 를 제거하고 Sphere Component 의 오버랩 이벤트도 삭제합니다.
변경 사항
- 1. Mesh Component 와 Sphere Component 를 C++ 에서 제거, 이를 블루프린트에서 추가할 수 있도록 변경
- 2. `OnOverlap` 및 `OnEndOverlap` 이벤트 제거, 블루프린트에서 설정할 수 있도록 변경
- 3. 루트 컴포넌트를 기본 `Scene Component`로 설정하여 추가 구성 요소를 블루프린트에서 자유롭게 추가할 수 있도록 변경
AAuraEffectActor::AAuraEffectActor()
{
PrimaryActorTick.bCanEverTick = false;
SetRootComponent(CreateDefaultSubobject<USceneComponent>("SceneRoot"));
}
블루프린트
- 블루프린트에서 스태틱 메시 추가
- Shpere Collision 추가
새로운 기능 추가
GamePlayEffect 로 효과를 줄 수 있도록 추가UAbilitySystemComponent
를 이용하여 다른 액터에게 효과를 적용하는 기능 구현
게임플레이 효과를 블루프린트에서 설정할 수 있는 기능 추가
.h.
UFUNCTION(BlueprintCallable)
void ApplyEffectToTarget(AActor* Target, TSubclassOf<UGameplayEffect> GameplayEffectClass);
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Applied Effects")
TSubclassOf<UGameplayEffect> InstantGameplayEffectClass;
.cpp
void AAuraEffectActor::ApplyEffectToTarget(AActor* Target, TSubclassOf<UGameplayEffect> GameplayEffectClass)
{
UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Target);
if(TargetASC == nullptr) return;
check(GameplayEffectClass);
// 이펙트 컨텍스트 핸들을 만든다. (Wrapper)
FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext();
// 소스 오브젝트를 추가한다.
EffectContextHandle.AddSourceObject(this);
// 이펙트 스펙 핸들을 만든다. (Wrapper)
const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f,EffectContextHandle);
// 타겟에게 이펙트를 적용한다.
TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());
}
AAuraEffectActor::ApplyEffectToTarget 함수 설명
대상의
UAbilitySystemComponent
추출UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent
함수를 사용하여 대상 액터의 어빌리티 시스템 컴포넌트를 추출합니다.컴포넌트가 없으면 (
nullptr
), 함수는 즉시 반환합니다.UAbilitySystemComponent* TargetASC = UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Target); if(TargetASC == nullptr) return;
게임플레이 효과 클래스 확인
GameplayEffectClass
가 유효한지 확인합니다.check(GameplayEffectClass);
게임플레이 효과 컨텍스트 핸들 생성
MakeEffectContext
함수로 게임플레이 효과의 컨텍스트 생성.생성된 컨텍스트에 소스 오브젝트 추가.
FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext(); EffectContextHandle.AddSourceObject(this);
게임플레이 효과 스펙 핸들 생성
지정된 게임플레이 효과 클래스와 컨텍스트를 사용하여 게임플레이 효과 스펙 생성.
효과의 레벨은
1.f
로 설정.const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f,EffectContextHandle);
대상에게 게임플레이 효과 적용
ApplyGameplayEffectSpecToSelf
함수로 생성된 게임플레이 효과 스펙을 대상의UAbilitySystemComponent
에 적용.TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());
결론
- `Aura Effect Actor`는 다양한 효과를 유연하게 적용할 수 있는 액터로 변경
- C++에서의 구현과 블루프린트에서의 설정 가능성은 개발자와 디자이너 모두에게 큰 유연성을 제공