인프런 커뮤니티 질문&답변
8강의 수업 내용들 중 이해가 잘 안가는 부분들이 있습니다.
작성
·
173
·
수정됨
0
1 . RegisterGameplayTagEvent 델리게이트 질문
ASC->RegisterGameplayTagEvent(ABTAG_CHARACTER_INVINSIBLE, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &UABGASHpBarUserWidget::OnInvisibleTagChanged); 다음 코드를 다음과 같이 이해했는데 맞을까요?
INVINSIBLE 태그가 GE에 부착(count+1)되거나 탈착(count-1)될때 알림을 주는 델리게이트. 기본 count=0
2.Pre/PostGameplayEffectExecute 함수 질문
저는 이 함수가 ApplyGameplayEffectSpecTo~함수로 GE를 실행시키기 직전이랑 직후에 호출되는 걸로 알고 있습니다.
PreGameplayEffectExecute 함수는 게임 플레이 이팩트 적용 전에 호출된다고 들었는데요. 하지만 확인해본 결과 ,공격할 때 게임 플레이 이팩트가 실행되어 DamageAttritbute값이 Modifier연산을 통해 30으로 변경된 이후에PreGameplayEffectExecute 함수가 호출되었습니다. "게임 플레이 이팩트 적용 전" 이란 말이 GE를 실행하기 직전, 즉 Modifier연산이 아직 되기 전으로 이해하고 있었는데 이게 아닌가요? PreGameplayEffectExecute와 PostGameplayEffectExecute의 정확한 차이가 뭔지 햇갈립니다.
그리고 GE_AttackHitBuff 가 발동하면 Pre/PostGameplayEffectExecute 함수가 호출되는지 테스트를 해봤는데 제 생각과는 다르게 호출이 안됩니다. (Data.EvaluatedData.Attribute == GetAttackRadiusAttribute()) 이런식으로 조건문을 넣어서 디버깅을 했는데 전혀 들어오지를 않네요.GE_AttackHitBuff도 다른 GE와 마찬가지로 Pre/PostGameplayEffectExecute 함수에 들어와야 정상아닌가요?
3 . 중첩 버프 질문
instant는 Base값을 변경하지만, 기간형은 Current값을 변경한다고 들었는데요. AttackRaius의 Base값이 50이고 Current값은 0 으로 시작해서, 공격할수록 Current에 +15씩 증가해 Base값을 직접 수정하지 않고 Current 값만 증가시켜서 어떻게 범위를 키우는 거죠? Base값은 아예 안쓰고 하나요? 내부적으로 어떻게 돌아가는지 좀 햇갈립니다.
그리고 Duration과 Stack 에 대해 다음과 같이 이해했는데 이게 맞을까요?
Duration을 2초로 했을 때, 2초가 지나기 전에 공격해서 다시 한번 GE를 동작시키면 2초로 다시 리셋되고 스택이 쌓이는데, 2초를 놓칠경우 Current값이 처음으로 돌아와서 범위가 기본으로 리셋된다.
답변 2
0
네 맞습니다.
EGameplayTagEvent::NewOrRemoved로 등록하는 경우 태그가 완전히 없어졌거나 새로 생겼을때만 이벤트가 호출됩니다. 이 이벤트는 태그가 기존에도 존재했는데 갯수만 변하는 경우에는 호출되지 않습니다. 태그 갯수가 변하는 모든 경우에 호출되길 바란다면 EGameplayTagEvent::NewOrRemoved대신 EGameplayTagEvent::AnyCountChange를 사용해야 합니다FActiveGameplayEffectsContainer::InternalExecuteMod의 코드는 다음과 같습니다.
if (AttributeSet->PreGameplayEffectExecute(ExecuteData)) { float OldValueOfProperty = Owner->GetNumericAttribute(ModEvalData.Attribute); ApplyModToAttribute(ModEvalData.Attribute, ModEvalData.ModifierOp, ModEvalData.Magnitude, &ExecuteData); FGameplayEffectModifiedAttribute* ModifiedAttribute = Spec.GetModifiedAttribute(ModEvalData.Attribute); if (!ModifiedAttribute) { // If we haven't already created a modified attribute holder, create it ModifiedAttribute = Spec.AddModifiedAttribute(ModEvalData.Attribute); } ModifiedAttribute->TotalMagnitude += ModEvalData.Magnitude; { SCOPE_CYCLE_COUNTER(STAT_PostGameplayEffectExecute); /** This should apply 'gamewide' rules. Such as clamping Health to MaxHealth or granting +3 health for every point of strength, etc */ AttributeSet->PostGameplayEffectExecute(ExecuteData); }정리하면 Pre와 Post 두 함수의 용도는 서로 다른데, 예를 들어 대
미지가 30이 들어왔는데 방어력을 계산해서 20으로 감경시키는 경우처럼 값이 변경되기 전에 처리해야 할 때는 PreGameplayEffectExecute를 사용하고
체력이 70 이하로 떨어질 때 공격력을 10 증가시켜야 하는 경우처럼 값이 변경된 후에는 PostGameplayEffectExecute를 사용합니다.
그리고 두 함수는 BaseValue가 변경될 때만 호출됩니다. 따라서 CurrentValue만 변경하는 기간제 버프 효과에 대해서는 Pre/PostGameplayEffectExecute가 호출되지 않는 것이 정상입니다.CurrentValue는 BaseValue에 의존된 값입니다. BaseValue는 원본값, CurrentValue는 BaseValue에 버프를 계산한 값입니다. 따라서 BaseValue가 변경되면 그에 따라 CurrentValue도 변경됩니다. 따라서 AttackRadius의 BaseValue가 50이면 CurrentValue의 값도 50이 됩니다.
Instant 정책은 Base를 증가시키고 HasDuration은 Current를 증가시킵니다. 그리고 AttackRadius는 최종적으로 BaseValue에 버프를 더한 CurrentValue를 사용합니다.
마지막으로 Duration과 Stack은 기본적으로 2초가 지나면 리셋되 초기 값으로 돌아오나, 이 설정은 변경할 수 있으니 옵션을 확인해보세요.
0
안녕하세요, 인프런 AI 인턴입니다. 성우님.
먼저 질문 주신 내용에 대해 각각 설명드리겠습니다.
1. RegisterGameplayTagEvent 델리게이트에 대한 설명
ASC->RegisterGameplayTagEvent(ABTAG_CHARACTER_INVINSIBLE, EGameplayTagEventType::NewOrRemoved).AddUObject(this, &UABGASHpBarUserWidget::OnInvisibleTagChanged);
이 코드는 언리얼 엔진의 Gameplay Ability System(GAS)에서 특정 태그(ABTAG_CHARACTER_INVINSIBLE)가 부착되거나 제거되는 이벤트를 감지하여 특정 함수를 호출하도록 설정합니다. 구체적으로, EGameplayTagEventType::NewOrRemoved를 사용하여 태그의 부착(count가 증가) 또는 탈착(count가 감소) 등 변화가 있을 때마다 이벤트가 발생하도록 합니다.
따라서, 사용자의 설명대로 이 이벤트는 캐릭터에게 INVINSIBLE 태그가 추가되거나 제거될 때마다 호출되는 것으로 이해할 수 있습니다. 기본적으로는 count가 0에서 시작하며, 추가될 때마다 증가하고 제거되면 감소하게 됩니다.
2. 중첩 버프와 Stat 변화
언리얼의 Ability System Component에서 Base 값은 속성의 기본값을 의미하며, Current 값은 현재의 변동이 있는 값을 의미합니다. 기본적으로, Instant 효과는 즉시 Base 값을 변경하여 지속 효과가 영구적으로 적용되게 합니다.
예시 설명:
AttackRadius의 변경:
Base값은 50이고Current값이 0일 때, 게임 내에서 공격할 때마다Current에 +15씩 증가한다고 가정할 경우,Base값은 변하지 않고 범위를 조절할 수 있습니다. 이렇게 하면Base값을 직접 수정하지 않고도Current를 조정하여 속성의 효과를 임시로 조정할 수 있습니다.Duration과 Stack의 이해: 성우님의 설명이 거의 맞습니다.
Duration이 2초로 설정되어 있는 GE(게임플레이 효과)가 있을 때, 2초 안에 다시 효과가 적용되면 시간이 리셋되면서 스택도 증가합니다. 만약 2초가 지나도록 추가 효과가 적용되지 않는다면,Current값은 초기화되어 기본 상태로 돌아오는 구조입니다.
아래 링크들도 참고해보시면 추가적인 정보 습득에 도움이 될 수 있습니다:
- 언리얼 엔진 - 스택과 지속 시간(GE) 관리- 지속 시간 및 스택 관리에 대한 이해를 깊게 도와줄 수 있습니다.
질문 주신 두 가지 사항 모두 언리얼의 Gameplay Ability System에서 효과(Effect) 및 속성(Attribute)을 보다 유연하게 관리하기 위한 중요한 개념입니다. 이 개념들은 태그, 스택, 지속 시간 등 시스템의 다양한 기능을 조합하여 게임의 스킬이나 능력치를 효율적으로 구현하는 데 유용합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






확실히 이해가 되네요. 감사합니다.
근데 확인차 한번더 질문드려요.
1번 질문인데요.
태그는 GE와 GA에 부착가능한데,
ASC->RegisterGameplayTagEvent 함수에서 리턴한 델리게이트는
GE에 부착된 태그들만 한해서 알림이 오는 것이 맞을까요?