언리얼 엔진 - 게임 프로젝트/GAS 프레임워크 RPG 프로젝트

AbilityTasks - 2) AnimNotify를 사용한 이벤트 발동 + Task를 사용하여 어빌리티의 타겟 데이터 가져오기

monstro 2025. 8. 16. 01:49
728x90
반응형

- 개요

AnimNotify를 사용하면 애니메이션의 특정한 키 프레임에서 원하는 이벤트를 실행할 수 있다

이벤트의 실행은 특정한 GameplayTag를 활성화함으로써 이뤄진다

 

AbilityTask는 GameplayAbility가 발동되었을 경우 수행하는 동작 단위를 의미한다

GameplayAbiltity하나의 프레임에서만 수행하므로 유연성이 부족하다

따라서 AbilityTask를 사용하여 비동기적인 동작이나 델리게이트의 호출에 대응하는 동작을 진행한다

 

프로젝트에서는 Task를 사용하여 마우스를 클릭하며 발동한 GA의 Target 정보를 가져오고

가져온 대상의 정보를 분석하여 개별적인 작업을 진행한다

 

1) TargetDataUnderMouse 클래스

 

GameplayAbility의 TargetData를 전달하기 위한 델리게이트를 생성한다

  • 델리게이트를 통해 1개의 TargetData를 전달하므로 : OneParaem
  • 런타임 시점에서 델리게이트에 바인드하므로 : DYNAMIC
  • 여러개의 함수를 바인드하므로 : MULTICAST

따라서 위와 같이 구성하여 델리게이트 MouseTargetDataSignature를 정의한다

 

 

클래스는 위와 같이 구성하였다

멤버변수는 위에서 정의한 MouseTargetDataSignature 델리게이트의 인스턴스를 갖도록 설정한다

 

 

CreateTargetDataUnderMouse 함수의 로직은 위와 같다

NewAbilityTask 함수를 호출하여 고유한 TargetDataUnderMouse 인스턴스를 생성한다

Task의 경우 static으로 생성하여 인스턴스 없이 호출하도록 설정하고, 인스턴스를 생성하지 않아 메모리 효율을 높인다

 

 

Activate 함수의 오버라이드한 로직은 위와 같다

해당 함수는 Task를 실행하는 경우 반드시 호출하는 함수로 오버라이드하여 원하는 로직을 수행할 수 있다

로직은 다음과 같이 구분할 수 있다

  • Ability로부터 CurretnActorInfo를 가져와 로컬인지, 아닌지 확인한다
    • 로컬이라면 SendMouseCursorData 함수를 호출하여 클라이언트가 Predict한 데이터서버로 전송한다
    • 아니라면, 다음의 로직을 진행한다
      • GASpecHandle을 가져오고 + Prediction Key를 생성
      • 위의 로직에서 설정한 값을 통해 AbilityTargetDataSetDelegate를 생성
        • AbilityTargetDataSetDelegate : GATarget을 지정하는 경우이벤트를 처리하는 델리게이트
        • 해당 델리게이트에 OnTargetDataReplicatedCallback 멤버함수를 바인드
      • ASC로부터 CallReplicatedTargetDataDelegatesIfSet 함수를 호출
        • CallReplicatedTargetDataDelegatesIfSet 함수 : TargetData 관련 이벤트전송되면 호출
      • 이벤트가 전송되지 않았다면,  SetWaitingOnRemotePlayerData 함수를 호출
        • SetWaitingOnRemotePlayerData 함수 : 로컬에서 조종하는 PlayerDataTask가 대기하는 경우 호출

 

 

SendMouseCursorData 함수의 로직은 위와 같다

가장 먼저, ScopedPredictionWindow를 생성하여 클라이언트가 예측할 범위를 지정한다

이후, GA -> PlayerController 순서를 거쳐 마우스를 클릭하며 발동한 GA의 타겟 정보를 가져온다

 

가져온 타겟 정보GameplayAbilityTargetData_SingleTargetHitHitResult에 저장하고

저장한 값을 다시 GameplayAbilityTargetDataHandle에 추가한다

 

AbilitySystemComponent으로부터 ServerSetReplicatedTargetData 함수를 호출하여

클라이언트에서 진행한 예측값을 서버로 전송한다

 

ShouldBroadcastAbilityTaskDelegates 함수를 호출하여

어빌리티가 실행중인지 + 델리게이트를 브로드캐스트할 수 있는지 확인한다

만약, true라면 멤버변수로 갖고 있는 델리게이트타겟의 정보를 브로드캐스트한다

 

 

OnTargetDataReplicatedCallback 함수의 로직은 위와 같다

ASC로부터 ConsumeClientReplicatedTargetData 함수를 호출하여 클라이언트로부터 받은 TargetData를 캐싱한다

이후 ShouldBroadcastAbilityTaskDelegates 함수를 호출하여 true라면

멤버 변수로 갖고 있는 델리게이트타겟의 정보를 브로드캐스트한다

 

2) AuraProjectileSpell 클래스

 

SpawnProjectile 함수를 추가한다

 

 

ActivateAbility 함수의 로직새로 생성한 SpawnProjectile 함수에서 수행한다

 

3) 언리얼 에디터

 

AnimMontage에서 설정할 AnimNotify를 사용하여 활성화할 GameplayTag를 추가한다

 

3 - 1) AnimNotify 블루 프린트

 

위와 같이 로직을 구성하였다

Tag 멤버 변수SendGameplayEventToActor 함수에 넘겨주어 Tag의 이벤트를 활성화한다

 

3 - 2) AnimMontage 블루 프린트

AnimNotify 추가

 

추가한 AnimNotify 설정

 

위와 같이 설정을 진행한다

 

3 - 3) GA_FireBolt

AnimNotify를 사용하여 투사체를 생성

 

AnimNotify를 통해 이벤트를 발동시켜 투사체를 생성하는 로직은 위와 같다

 

Task를 사용하여 타겟 데이터를 가져오기

 

Task를 사용하여 클릭과 함께 발동한 GA로부터 타겟의 데이터를 가져오는 로직은 위와 같다

 

- 최종 실행 결과

 

AnimNotify를 통해 이벤트를 발동시켜 투사체를 생성하는 결과는 위와 같다

 

 

 

Task를 사용하여 타겟의 데이터를 가져오는 결과는 위와 같다

728x90
반응형