FGameplayAbilityTargetDataHandle
누가 맞았는지 피격 정보..
OnRangeWeaponTargetDataReady..
GameplayCueNotify: 피격됐으면 피를 튀긴다던가 하는 동작들을 수행
GameplayCue도 GameplayTag를 통해서 실행시킴
GameplayCueParameters에 정보를 실어 보냄..

HitResult를 GameplayCueParameters로 변경
GameplayCueTag에 해당하는 Cue를 GCN Pamameter에 캐싱한 정보에 기반해서 실행

GameplayCueManager를 통해 Cue를 관리한다
Cue는 매우 많이 사용하는데 사용할 때마다 생성하는 건 비효율적이니까

아무튼 타고타고 들어가다보면 GameplayCueDataMap에서 Tag를 통해 Cue를 찾아서 실행한다
그렇다면 어떻게 GameplayCueDataMap에 CueNotify를 추가할까
GameFeatureAction으로 GameplayCueDataMap에 CueNotify를 추가한다

이렇게 만든 액션을 일반적으로는 experience에서 액티브하지만..
experience 로드시에 액션을 불러오는 거는 너무 느리며 이런 이펙트는 experience, 즉 모드가 변경된다고 달라지지 않는 경우가 많다
따라서 AddGameplayCuePaths 액션은 GameFeaturePolicy로 게임피쳐를 로드할 때 실행한다

부모인 GameFeaturesProjectPolicies는 GameFeatureSystem보다 쉽게 게임피쳐의 규칙을 만들 수 있도록 한다.
여기에 InitGameFeatureManager, ShutdownGameFeatureManager 같은 함수들이 있어서 얘네 오버라이드
여기 있는 Observers에 대해 알아보기

IGameFeatureStateChangeObserver를 상속받음

Init에서 GameFeature_AddGameplayCuePaths를 생성해서 GameFeatureSubsystem에 옵저버로 등록된다 (이 시점이 매우 빠름.. 엔진이 실행되기 전이라고 한다)
이렇게 하면 GameFeature들이 등록/해제 되는 타이밍에 GameFeature_AddGameplayCuePaths로 이벤트가 올 것이다

이제 OnGameFeatureRegistering, OnGameFeatureUnregistering에서 본래 목적이었던 GameplayCueManager의 GameplayCueDataMap에 Cue를 등록/제거한다
GameFeatureData에서 AddGameplayCuePath 액션을 찾아서 해당 path 내의 cue들을 등록한다

GCM->RefreshGameplayCuePrimaryAsset에서 AssetManager 등록까지 해준다
즉, 여기서 GameplayCueManager, AssetManager 둘 다에 한 번에 등록한다
---정리

GameplayCueNotify 클래스들 (Looping이면 반복, Burst면 단발성, ..)

GameplayCueNotify를 만들어서 여기서 현재 pawn에 붙어있는 무기(B_Weapon을 상속받은 어떤 무기)의 Fire이벤트를 호출한다

B_Weapon의 Fire이벤트

무기를 썼을 때의 각 이펙트 담당한다
B_Weapon에서 이 액터 3개를 스폰하고 내부 이벤트를 호출해서 이펙트를 플레이한다