관리 메뉴

Mini

[UE5] 타격시 에니메이션 구현 본문

UE5/Damage

[UE5] 타격시 에니메이션 구현

Mini_96 2024. 6. 23. 14:55

 

* 태그를 부여해주는 GE 만들기

GE 추가해주시고
원할때 제거토록 무한대로 설정

- 태그추가 해주시고

struct FAuraGameplayTags
{
public:
    ..
    FGameplayTag Effects_HitReact;
GameplayTags.Effects_HitReact = UGameplayTagsManager::Get().AddNativeGameplayTag(
    FName("Effects.HitReact"),
    FString("Effects.HitReact")
    );

 

만든태그 부여

Hit가 된대상의 태그가 HitReact로 바뀔거임

 

* 적클래스에서 태그의 변화를 구독하기

원본 델리게이트의 구성을 베낄거임

- 콜백 함수추가

void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
}

- 태그가 변경되면 실행될 콜백 함수 등록

void AAuraEnemy::BeginPlay()
{
//해당 태그가 new or remove 되면 콜백함수실행
AbilitySystemComponent->RegisterGameplayTagEvent(FAuraGameplayTags::Get().Effects_HitReact, EGameplayTagEventType::NewOrRemoved).AddUObject(
    this,
    &AAuraEnemy::HitReactTagChanged
);

- 콜백함수 구현

void AAuraEnemy::HitReactTagChanged(const FGameplayTag CallbackTag, int32 NewCount)
{
    bHitReacting = NewCount>0; //맞는불이 있는지
    GetCharacterMovement()->MaxWalkSpeed = bHitReacting?0.f:BaseWalkSpeed; //맞는중에는 못움지기게
    
}

 

* 타격시 애니메이션 구현

GA(행동,스킬) 만들기

 

태그를 부여하는 GE설정, 끝난후 태그제거위해 저장

- 몽타주 getter interface 만들고

base에서 구현

class AURA_API ICombatInterface
{
	GENERATED_BODY()
UFUNCTION(BlueprintNativeEvent) //버츄어쓰면 BP에서 못봄 -> native쓰고 base에서 _imp붙여서 cpp에서 구현
UAnimMontage* GetHitReactMontage();

- base에서 getter만 만들어주면됨

구현(의존성주입)은 bp에서 할거임

	UPROPERTY(EditAnywhere, Category = "Combat")
	TObjectPtr<UAnimMontage> HitReactMontage;
    
UAnimMontage* AAuraCharacterBase::GetHitReactMontage_Implementation()
{
    return HitReactMontage;
}

 

애니 선택후 AM 만들어주고 (창, 새총 각각)
BP 가서 의존성 주입

- GA 에서 하는일 

 : 오너(고블린)에게 GE 적용(태그추가)하고

아바타액터(고블린)을 CI로 캐스팅하고, 몽타주를 얻고 재생함

 

* next : 끝난후 효과GE 제거

 

* 피해가 치명적이아닌경우 -> hitReaction 재생

-  적이 위의 능력을 가지고있어야함

- 적이 hitReaction 능력을 갖고있는지 확인후 실행하면됨

- 캐릭터인포에서 능력들을 갖도록 함. 이후 적에서 사용하면 될듯?

class AURA_API UCharacterClassInfo : public UDataAsset
{
    ...

    UPROPERTY(EditDefaultsOnly, Category="Common Class Defaults")
    TArray<TSubclassOf<UGameplayAbility>> CommonAbilities;

 

- 능력부여 어케함?

이렇게 하고있음

- 함수구현 : 능력들배열을 얻어와서 giveability하는 함수임

//시작 능력을 주는함수
void UAuraAbilitySystemLibrary::GiveStartupAbilities(const UObject* WorldContextObject, UAbilitySystemComponent* ASC)
{
    //게임모드를 얻어오고
    AAuraGameModeBase* AuraGameMode = Cast<AAuraGameModeBase>(UGameplayStatics::GetGameMode(WorldContextObject));
    if(AuraGameMode==nullptr) return;

    //게임모드에있는 클래스정보들에 대해
    UCharacterClassInfo* CharacterClassInfo = AuraGameMode->CharacterClassInfo;
    //그안에있는 능력들에대해 giveAbility 하면됨
    for(auto AbilityClass : CharacterClassInfo->CommonAbilities)
    {
       FGameplayAbilitySpec AbilitySpec = FGameplayAbilitySpec(AbilityClass, 1);
       ASC->GiveAbility(AbilitySpec);
    }
}

- 적클래스에서 위의 함수 호출 // 적이가지고있는 능력들 부여

void AAuraEnemy::BeginPlay()
{
    ...
    UAuraAbilitySystemLibrary::GiveStartupAbilities(this,AbilitySystemComponent);

- AS에서 적이사망이 아닌경우, 태그확인후 히트리액션 재생

void UAuraAttributeSet::PostGameplayEffectExecute(const FGameplayEffectModCallbackData& Data)
{
    ...
    if(Data.EvaluatedData.Attribute==GetIncomingDamageAttribute())
    {
       const float LocalIncomingDamage = GetIncomingDamage();
       SetIncomingDamage(0.f);
       if(LocalIncomingDamage > 0.f)
       {
          const float NewHealth = GetHealth() - LocalIncomingDamage;
          SetHealth(FMath::Clamp(NewHealth,0.f,GetMaxHealth())); //음수인경우 조정하고 체력깍기

          const bool bFatal = NewHealth<=0.f; //사망에이를만한 피해인지

          //사망이아닌경우 히트리액션을 재생
          if(!bFatal)
          {
             //HitReactTag일때만 능력활성화
             FGameplayTagContainer TagContainer;
             TagContainer.AddTag(FAuraGameplayTags::Get().Effects_HitReact);
             Props.TargetASC->TryActivateAbilitiesByTag(TagContainer);
          }

변수에 의존성 주입해주고
GA에 태그달아주고
노드연결해줌
맞으면 밀려나는 모습

- 끝난후 GE 효과제거, 능력끝내기

캐시된 핸들을 이용하면된다. / 몽타주끝난경우, 인터럽트된경우, 캔슬된경우 GE 효과제거

 

https://github.com/DongHoonYu96/GameplayAbilitySystem_Aura/commit/04b7b53d31c19b49106fff43f24ec9006319c101

 

feat : 타격시 에니메이션 구현 · DongHoonYu96/GameplayAbilitySystem_Aura@04b7b53

Bisu96 committed Jun 23, 2024

github.com