언리얼 엔진/Gameplay Ability System - Udemy

[UE5/Gameplay Ability System(GAS)] - Effect Actor 개선

mane 2024. 2. 16. 01:30
728x90
반응형

인사말

안녕하세요. 이번 포스트에서는 이전에 만들었던 Aura Effect Actor 개선에 대해 작성하겠습니다.


문제점

현재 Aura Effect ActorMesh ComponentSphere 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 함수 설명

  1. 대상의 UAbilitySystemComponent 추출

    • UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent 함수를 사용하여 대상 액터의 어빌리티 시스템 컴포넌트를 추출합니다.

    • 컴포넌트가 없으면 (nullptr), 함수는 즉시 반환합니다.

      UAbilitySystemComponent* TargetASC =  UAbilitySystemBlueprintLibrary::GetAbilitySystemComponent(Target);
      if(TargetASC == nullptr) return;
  2. 게임플레이 효과 클래스 확인

    • GameplayEffectClass가 유효한지 확인합니다.

      check(GameplayEffectClass);
  3. 게임플레이 효과 컨텍스트 핸들 생성

    • MakeEffectContext 함수로 게임플레이 효과의 컨텍스트 생성.

    • 생성된 컨텍스트에 소스 오브젝트 추가.

      FGameplayEffectContextHandle EffectContextHandle = TargetASC->MakeEffectContext();
      EffectContextHandle.AddSourceObject(this);
  4. 게임플레이 효과 스펙 핸들 생성

    • 지정된 게임플레이 효과 클래스와 컨텍스트를 사용하여 게임플레이 효과 스펙 생성.

    • 효과의 레벨은 1.f로 설정.

      const FGameplayEffectSpecHandle EffectSpecHandle = TargetASC->MakeOutgoingSpec(GameplayEffectClass, 1.f,EffectContextHandle);
  5. 대상에게 게임플레이 효과 적용

    • ApplyGameplayEffectSpecToSelf 함수로 생성된 게임플레이 효과 스펙을 대상의 UAbilitySystemComponent에 적용.

      TargetASC->ApplyGameplayEffectSpecToSelf(*EffectSpecHandle.Data.Get());

결론

- `Aura Effect Actor`는 다양한 효과를 유연하게 적용할 수 있는 액터로 변경 
- C++에서의 구현과 블루프린트에서의 설정 가능성은 개발자와 디자이너 모두에게 큰 유연성을 제공
728x90
반응형