-
[UE5 RPG] 7. ์ ํฌ ์ ๋ ฅ์ ํตํด GA ํ์ฑํํ๊ธฐ : GameAbility, GamePlayTag, ์ด๋น๋ฆฌํฐ ๋๋ฒ๊ทธ ์ฐฝ ์ผ๊ธฐUnrealEngine/SomedayProject 2025. 11. 11. 14:36
๐ Someday Proejct ๊ฐ๋ฐ์ผ์ง ์๋ฆฌ์ฆ
์ด๋ฒ์๋ ์ ํฌ ์ ๋๋ฉ์ด์ ์ ๋ง๋ค๊ณ
์ธํ์ด๋ ์ฐ๊ฒฐํด๋ณด๋ ค๊ณ ํ๋ค
https://hyun2and.tistory.com/38
[UE5 RPG] 4. ๊ฑท๊ธฐ, ์ ํ ์ด๋ ์กฐ์ : GameplayAbilities, ์ ํ Animation Blueprint
๐ Someday Proejct ๊ฐ๋ฐ์ผ์ง ์๋ฆฌ์ฆ ๋๋ณด๊ธฐ"> ์ ๋๋ฉ์ด์ ์ Ablitiy ๋ฅผ ์ฐ๊ฒฐํด์ ์ด๋ค๋๋ฏํ๋ค๋์ค์ ์ํด ๋ฏธ๋ฆฌ ์ธํ ํ๊ณ ๋์ด๊ฐ๊ธฐโ๏ธ GameplayAbilities ๋ฅผ ์ฐ๋ ค๋ฉดSomedayProject.Build.cs ์ PublicDependencyModuleN
hyun2and.tistory.com
์ง๋๋ฒ์ ์ด๋น๋ฆฌํฐ๋ฅผ ๋ชจ๋์ ์ถ๊ฐํ๋๊ฑด ๋ฏธ๋ฆฌ ํด๋์๋ค
๐์ ํฌ ์ด๋ฒคํธ ๋ ธํฐ
Lyra ์ GA ํ์ฑํ ๊ณผ์
- IMC ๋ฅผ ํตํด ์ ๋ ฅ๊ณผ IA๋ฅผ ์ฐ๊ฒฐํ๋ค. HeroComponent ๋ Chahracter ์ ๋ฃ์ด์ Mapping ํด์ค
- LyraInputConfig๋ฅผ ํตํด IA์ InputTag.Weapon.NormalAttack ๋ฅผ ๋ฐ์ธ๋ํ๋ค
- LyraInputConfig๋ LyraPawnData ์์. FLyraInputAction ๋ก Tag์ Action์ ๋ฌถ์ด๋์
- ULyraHeroComponent::InitializePlayerInput ์์ ULyraInputComponent::AddInputMappings ํธ์ถ
- InputComponent ๊ฐ ์ค๋น๋ ๋ค์ ํ์ด๋ฐ. PawnExtensionComp ์
OnPawnReadyToInitialize_RegisterAndCall(FSimpleMulticastDelegate::FDelegate::CreateUObject(this, &ThisClass::OnPawnReadyToInitialize));์ ๋ธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ๊ฑธ์๋ค - ๋๋๊ณ ๋๋ฉด ๋ชจ๋ Actions ๋ค์ ๋ฐ์ธ๋
- InputConfig ์์ ๋ฑ๋ก๋ Tag-Action ๋ค์ ๋ชจ๋ ์ฐ๊ฒฐํ๋ ์ฝ๋
- ์ฌ๊ธฐ์๋ ๋ฑํ Handles ๋ฅผ ์ฌ์ฉํ๊ณ ์์ง๋ ์๋ค
LyraIC->BindAbilityActions(InputConfig, this, &ThisClass::Input_AbilityInputTagPressed, &ThisClass::Input_AbilityInputTagReleased, /*out*/ BindHandles);- ๋ด๋ถ์ ์ผ๋ก ๊ฒฐ๊ตญ์
BindAction(Action.InputAction, ETriggerEvent::Triggered, Object, PressedFunc, Action.InputTag)๋ฅผ ํธ์ถํ๊ณ ์๋ค
- InputComponent ๊ฐ ์ค๋น๋ ๋ค์ ํ์ด๋ฐ. PawnExtensionComp ์
- ์ธํ์ด ๋ค์ด์ค๋ฉด ALyraPlayerController::PostProcessInput ์์ ์ธํ์ฒ๋ฆฌ
- InputTag.Weapon.NormalAttack ๊ฐ ์ผ์ง๋ค
void ALyraPlayerController::PostProcessInput(const float DeltaTime, const bool bGamePaused) { if (ULyraAbilitySystemComponent* LyraASC = GetLyraAbilitySystemComponent()) { LyraASC->ProcessAbilityInput(DeltaTime, bGamePaused); } Super::PostProcessInput(DeltaTime, bGamePaused); }
ASC::ProcessAbilityInput๋ด๋ถ์์TryActivateAbility๋ฅผ ์คํ- ASC์์ ์ด์ ์ ๋ฑ๋ก๋ InputTag๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋งค์นญ๋ GA๋ฅผ ํ์ฑํํ๋ค
- GA ์์ Activation OwnedTags ๋ฅผ ์ค์ ํ๋ฉด ์ด GA๊ฐ ํ์ฑํ๋ ๋ Movement.NormalAttack ๊ฐ ์ผ์ง๋ค
- ์ดํ ๊ณต๊ฒฉ ์ฒ๋ฆฌ์ ์ ๋๋ฉ์ด์ ํ์ฑํ ํด์ผํจ
https://lemonyun.tistory.com/148
์ ์ ๋ฆฌํด์ฃผ์ ๋ถ์ด ์์ด์ ์ฐธ๊ณ
ํ์ํ ๊ณผ์
- IMC์ IA ์์ฑ
- HeroComponent::InitializePlayerInput ์์ IA์ InputTag ์ฐ๊ฒฐ
- InputConfig๋ ์ผ๋จ ๋ง๋ค์ง ์๊ณ . HeroComponent ์์ ์ง์ ๋ฃ๋๋ก ํ์
- @TODO ๋์ค์ ํ์ํ ๊ฒฝ์ฐ PawnData, InputConfig ์์ฑ → DefaultData ๋ง ์ ์ํ์
- ์ผ๋จ HeroComponent BeginPlay ์์ ๋ฐ๋ก ๋ฃ๋๋ก ํ์
- InputTag ์ GA๋ฅผ ์ฐ๊ฒฐ
๐ ์ธํ ์์ฑํ๊ธฐ
1. Triggers ์ถ๊ฐ
InputTag ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ถ๊ฐํ๋ค. ๊ทธ๋ผ ์ InputTag๊ฐ ์ผ์ง๋ ์๊ฐ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ ์ด GA ๊ฐ ํ์ฑํ๋๋ค

2. Tags ์ธํ

UGamePlayAbility ๋ด๋ถ์ ์ฌ๋ฌ ํ๊ทธ๊ฐ์ ์ ์ํ ์ ์๊ฒ ๋์ด์๋๋ฐ

์ง๊ธ ๋์ ์ํฉ์์ Input ์ด ๋ค์ด์์ ๋ Movement.NormalAttack ์ ์ผ์ฃผ๋ฉด ๋๋ ์ํฉ์ด๋๊น
ํ์ฑํ ์์ ํ๊ทธ๋ฅผ ์ผ์, ์บ๋ฆญํฐ์ ์ด ๋ฌด๋ธ๋จผํธ ํ๊ทธ๋ฅผ ๋ถ์ฐฉ์ํค๋ฉด ๋๋ค
3. IA ์์ฑ, IMC ์ฐ๊ฒฐ


IA์ ์ผ์ชฝ๋ง์ฐ์คํด๋ฆญ ์ถ๊ฐํ๊ณ , IMC์๋ ๋ฃ์ด์ค
+ ๋ผ์ด๋ธ์ฝ๋ฉ ์๋ฌ
๋๋ณด๊ธฐ
๋ผ์ด๋ธ์ฝ๋ฉ ์๋ฌ๊ฐ์๊ธฐ ์ด๋ฐ ์๋ฌ๊ฐ ๋จ๋ฉด์ ๋น๋๊ฐ ์๋๋๋ฐ๋ผ์ด๋ธ์ฝ๋ฉ ์ธ์ฝ๋ฉ ๊นจ์ ธ์ ์์ฐ๊ธฐ ์ด๋ ต๋ค
์ผ๋จ ๋น๋๋ฅผ ๋ค์ ํด๋ณด์ → ๋น๋ ๋ค์ํ๋๋ ํด๊ฒฐ๋จ.. Live ์ฝ๋ฉ์ด๋ ์ผ๋ฐ ๋๋ฒ๊น ์ด๋ ์์ด๋ฉด ์ด๋ ๊ฒ ๋ฌธ์ ๊ฐ ๋๋
4. BindAction ์ผ๋ก ์ธํ ๋ค์ด์์ ๋ ์ผ์ง Tag ๋งคํํ๊ธฐ
- ์บ๋ฆญํฐ์ HeroComponent ๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ , HeroComponent BeginPlay ์์ BindAction ์ ์คํํ๋ค
- ๊ณต๊ฒฉ์ด ๊ฐ๋ฅํ ์ ๋ค๋ง ๊ณต๊ฒฉ์ด๋ ์ด๋ฐ ํค ์ ๋ ฅ์ ๋ฐ์์ผ ํด์ HeroComponent ์์ ์ด๊ธฐํํ๋๊ฒ ๋ง์๊ฒ๊ฐ์๋ฐ
- HeroComp ๋ ์บ๋ฆญํฐ ์ฝ๋์์ ์์ฑํด์ฃผ๊ณ ์์ด์ ๋ฐ์ธ๋๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ๊ณณ์ ์ ์ฅํด๋ฌ์ผํจ
- SPDefaultData PrimaryAsset ์ ์์ฑํด์ ๊ทธ ์์ ๋ฃ์ด์ฃผ์

+
EditDefaultsOnly์ค์ DataAsset์ ๋ฃ์์ผ๋ ์์ ์ด ์๋ผ์ ํ์ธํด๋ณด๋ UPROPERTY๋ฅผ ์ค์ ํ์ง ์์
DefaultsOnly, InstanceOnly, Anywhere ํค์๋์ ์ฐจ์ด๊ฐ ๊ถ๊ธํ๋๋ฐ ์ด ๋ธ๋ก๊ทธ์์ ์ ์ค๋ช ํด์ฃผ์ฌ
https://darkcatgame.tistory.com/62
๋์ ๊ฒฝ์ฐ์ ์ด์ฐจํผ ์ค์ ๋ฐํ์์ค์ ์์ ํ ๊ฑด ์๋๋๊น
EditDefaultsOnly๋ก ์์ ํ์USTRUCT(BlueprintType) struct FSPInputActionBindData { GENERATED_BODY() public: UPROPERTY(EditDefaultsOnly) TObjectPtr<UInputAction> InputAction; UPROPERTY(EditDefaultsOnly) FGameplayTag InputTag; };
์ ๋ณด์ด๋๊ฒ์ ํ์ธ

๊ฒ์ ์คํํ๊ณ IMC ์ ๋ฑ๋ก๋ ์ขํด๋ฆญ ๋ชจ์ ์ ํ๋ฉด IA๊ฐ ํธ์ถ
๊ฑฐ๊ธฐ์ HeroComponent ์ ๋ฑ๋ก๋ ๋ฐ์ธ๋ ํจ์๊น์ง ์ ํธ์ถ๋๊ณ ์๋ค
5. PressedFunc ์ธํ ๋ค์ด์์ ๋ GA ์ผ์ฃผ๊ธฐ
๊ฐ์ฅ ํท๊ฐ๋ ธ๋ ๊ฐ๋ ์ Granted ์ Activate ๊ฐ ๋ค๋ฅด๋ค๋ ๊ฒ
- ๋ฌด๊ธฐ๋ฅผ ์ฅ์ฐฉํ์ ๋ GA_Weapon๋ฅผ
GiveAbilityํธ์ถํด์ ๋ฃ์๋ค = ์ด ๋์ ์ํ๋ ๊ทธ๋ฅ Granted - ์ค์ Active ๋ ์ํ๋ ์ดํ์
TryActivateAbility๋ฅผ ํธ์ถํด์ผ ํ๋ค๋ ๊ฒ
ํญ๋ชฉ ์ค๋ช Give/Remove Give๋ ํ ๋ฒ(์บ๋ฆญํฐ ์ด๊ธฐํ ์)๋ง ํ๊ณ , Remove๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค (์ฃฝ๊ฑฐ๋ ํน์ ์ํฉ). Activate/End ํค๋ฅผ ๋๋ฅผ ๋๋ง๋ค Activate๋๊ณ , ๊ณต๊ฒฉ์ด ๋๋๋ฉด End Ability๋ก ๋นํ์ฑํ๋ฉ๋๋ค. ๊ณต๊ฒฉ ์ฒ๋ฆฌ ์์น ๊ณต๊ฒฉ์ ๋ชจ๋ ๋ก์ง (์ ๋๋ฉ์ด์ , ํ์ , ํผํด)์ Gameplay Ability ๋ธ๋ฃจํ๋ฆฐํธ ๋๋ C++ ํด๋์ค ๋ด๋ถ์ ๊ตฌํ๋ฉ๋๋ค. ํผํด ๊ตฌํ ํผํด๋ Gameplay Effect๋ฅผ ํตํด Attribute Set์ ์ฒด๋ ฅ(Health) ๊ฐ์ ์์ ํ์ฌ ์ ์ฉํฉ๋๋ค. void USPHeroComponent::OnInputActionTriggered(const FInputActionValue& Value, FGameplayTag InputTag) { LOG_INFO(LogSPDefault, TEXT("USPHeroComponent::OnInputActionTriggered")); ASomedayProjectCharacter* SPCharacter = GetPawn<ASomedayProjectCharacter>(); if (SPCharacter == nullptr) { return; } if (const APawn* Pawn = GetPawn<APawn>()) { if (USPAbilitySystemComponent* ASC = SPCharacter->GetSPAbilitySystemComponent()) { FGameplayTagContainer InputTagContainer; InputTagContainer.AddTag(InputTag); **ASC->TryActivateAbilitiesByTag(InputTagContainer);** } } }Lyra์์๋ PlayerController ๋ ๋ค๋ ์ค๊ณ ํ๋๋ฐ ์ผ๋จ ์ ์ผ ๋จ์ํ ๋ชจ์์ผ๋ก ๋ง๋ค์ด๋ณด์
6. GA ํ์ฑํ๋จ

์ด๋ฐ ๊ณผ์ ์ผ๋ก Tag๊ฐ ์ถ๊ฐ๋๊ณ Ability๊ฐ ํ์ฑํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค
โ ์ถ๊ฐ๋ ํ๊ทธ ํ์ธํ๊ธฐ

‘ ๋ฅผ ๋๋ฅด๊ณ ๋๋ฒ๊ทธ๋ฅผ ์ผ ๋ค์ 3๋ฒ์ ๋๋ฅด๋ฉด Abilities ๋ค์ ํ์ธํ ์ ์๋ค
Movement.NormalAttack ํ๊ทธ๊ฐ ์ถ๊ฐ๋๋ค
Tag ์ ๊ฑฐ ๊ณผ์ ์ ์๊ฐ์ ธ์ ๊ณ์ ์ค์ฒฉ๋๋์ค
void USPGameAbility_WeaponDefault::ActivateAbility(const FGameplayAbilitySpecHandle Handle, const FGameplayAbilityActorInfo* ActorInfo, const FGameplayAbilityActivationInfo ActivationInfo, const FGameplayEventData* TriggerEventData) { Super::ActivateAbility(Handle, ActorInfo, ActivationInfo, TriggerEventData); UE_LOG(LogSPDefault, Log, TEXT("USPGameAbility_WeaponDefault::ActivateAbility")); //์ ๋๋ฉ์ด์ ์คํ //ํผ๊ฒฉ ํ์ ์คํ EndAbility(Handle, ActorInfo, ActivationInfo, false, false); }Gameplay Ability System (GAS)์ ์ฒ ํ์ ์ด๋น๋ฆฌํฐ๊ฐ ์์ ์ ์๋ช ์ฃผ๊ธฐ(Lifecycle)๋ฅผ ์ค์ค๋ก ๊ด๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ ๋๋ค.
์ด๋น๋ฆฌํฐ ๋ด๋ถ์์ End ์ฒ๋ฆฌ๋ฅผ ์ง์ ํด์ฃผ๊ณ , ์ด๊ฑธ ASC ์์ ๋ ธํฐ๋ฐ์์ ๊ด๋ฆฌํ๋ ๋ฐฉ์์ด๋ค
๋ก๊ทธ๋ฅผ ๋ณด๋ฉด GA ๊ฐ ํ์ฑํ๋๊ฒ์ ์์์๋ค
GA๋ ๊ฒจ์ฐ ํ์ฑํํ๊ณ .. ์ด๋ค์์ ์ ๋๋ฉ์ด์ ์คํ์ ํด๋ณด์
728x90'UnrealEngine > SomedayProject' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ