Gameplay Effect Delegates이제 Ability System Component에 상속된 Delegate가 있다는 것을 알았으니, 이 중 하나에 바인딩하고 GameplayEffect를 적용하면 어떤 일이 일어나는지 살펴볼 것이다.이를 위해 우선 바인딩할 수 있는 콜백 함수 시그니처가 무엇인지 알아야 한다.AbilitySystemComponent 헤더에서 직접 찾아보면 다음과 같다. 이제 바인딩 시점을 생각해야 한다.생성자에서는 너무 이른 시점에 실행되므로 델리게이트를 바인딩하지 않는다.대신 Ability Actor Info를 초기화하는 InitAbilityActorInfo() 함수를 만들고, 이 함수가 실행되는 시점을 활용할 것이다.이 로직은 Character와 Enemy 모두에게 필요하므..
Apply Gameplay Tags with Effects이제 생성한 GameplayTag를 GameplayEffect에서 사용하기 위해 Ability System Component에 태그가 적용되도록 해야 한다.강의에서는 기존 GameplayEffect 내부의 GameplayTag 항목에서 직접 태그를 추가하는 방식을 사용했지만, 현재 사용 중인 언리얼 엔진 버전에서는 UI 구성이 달라 다음과 같은 방식을 사용하였따.1. GameplayEffect의 Components 항목 이동2. Add Component3. Target Tags Gameplay Effect Component 추가4. 이후 강의와 동일 (생성된 Added 항목에 원하는 Gameplay Tag 등록) Tags 항목을 보면 다음과 같이..
Creating Gameplay Tags from Data TablesGameplayTag는 Data Table 방식을 통해서도 생성이 가능하다.이를 위해 우선 Data Table을 생성해보자. 해당 Table을 만들 때는 어떤 Row Structure를 사용할지 지정해야 한다.우리는 GameplayTag용이기 때문에 GameplayTagTableRow로 생성할 것이다.해당 구조를 사용하면 각 행이 GamepalyTag 형식으로 동작한다. 해당 테이블에서는 Add 버튼을 통해 행을 추가할 수 있다.행을 선택하고, 하단에서 Tag와 이에 대한 코멘트를 작성하면 된다. 예시 행과 Tag 이제 다시 ProjectSettings으로 돌아가서 방금 만들어준 Table을 할당해주자.할당 이후 Tag Manager을..
Gameplay TagsGameplay Tag란 기본적으로 "이름"이다.Gameplay Tag 유형이 존재하며, Gameplay Tage Manager에 등록되어있다.Tag의 핵심 특징은 부모->자식->손자 형태와 같은 계층 구조이다.DoorAbilities.FireGameplayCue.Ability.FireBolt.Impact 위 예시와 같이 반드시 3단계일 필요는 없고, 더 짧을 수도 더 깊을 수도 있다.Tag 사용 이유그러면 그냥 문자열이나 enum 또는 bool 등을 사용하지 않고 Tag를 사용하는 이유는 무엇일까?내부적으로는 TagName이라는 FName 기반 멤버를 사용하지만, 계층 구조 덕분에 코드 설계가 훨씬 유연하다.또한 Tag를 통해 완전히 같은지, 부분적으로 같은지, 동일한 루트 Ta..
Curve Tables for Scalable Floats블루프린트에서 만들었던 GameEffect를 다룰 때 Scalable Float 항목이 있었던 것을 기억할 것이다.당시에는 해당 항목의 CurveTable에 대해 그냥 넘어갔었는데, 이번 Section을 마무리 하기전에 이에 대해 다룰 것이다. PotionHeal 항목으로 돌아가서 체크해보면, 우리는 원래 단일 값으로 25를 입력하여 항상 체력 25를 회복하는 효과를 만들었다.이번에는 Curve Table을 생성하여 레벨에 따라 수치가 자동으로 변화하는 구조를 만들 것이다.레벨 1 → 5 회복레벨 5 → 15 회복레벨 10 → 100 회복->이를 위해 사용하는 것 : Curve Table 생성할 때는 보간 타입을 정할 수 있는데, 이번에는 두 레..
PostGameplayEffectExecute이번엔 저번 강의에서 잠시 언급했던 PostGameplayEffectExecute 함수에 대해 구체적으로 다룰 것이다.먼저 전에 사용했던 PreAttributeChange 함수의 경우 속성이 왜 바뀌었는지, 누가 바꿨는지, 얼마나 바뀌었는 지 같은 실제 게임 로직에 필요한 정보는 부족하기에 Clamping으로 단순히 값을 보정하는 용도로 사용된다. 하지만 PostGameplayEffectExecute 함수의 경우 속성이 실제로 변경된 뒤 호출되기에 여기서는 변경된 속성, 변경된 수치, Source(효과를 발생시킨 원인), Target(효과를 받는 대상), Effect 정보 등을 모두 얻을 수 있다.따라서 해당 함수를 선언하고, 우선 간단하게 UE_LOG를 통해..
PreAttributeChange지금 상태로 속성 값이 변경되는 것을 보면, 체력이 0아래로 내려가 음수가 되거나 체력 바를 가득 채운 이후로도 계속해서 체력이 증가하는 것을 알 수 있다.마나 또한 마찬가지이며, 현재 상태에서는 속성 값이 clamping(값 보정)을 통해 제한되지 않는 상태이다.이번에닌 이러한 값을 제한하는 방법에 대해 알아볼 것이다. 먼저 AbilitySystem으로 돌아가서, AuraAttributeSet을 열어줄 것이다.그리고 PreArrituteCahnge라는 함수를 재정의할 것이다.해당 함수는 속성(Attribute) 값이 실제로 변경되기 직전에 호출되는 함수이며, 새로운 값이 최종 반영되기 전에 중간에 개입할 수 있도록 해주는 함수이다.다음과 같은 예시들의 경우에 모두 Pre..
Infinite Effect Application and Removal이제 Infinite 타입의 Gmaeplay Effect를 적용하고, 필요할 때 제거하는 작업을 해줄 것이다.효과 제거의 경우 우리는 오버랩 종료 시 제거로 처리한다. 먼저 이펙트롤 적용하는 코드로 돌아가서보면 Effect를 적용할 때 ApplyGameEffectSpecToSelf를 사용하고 있다.함수의 반환 타입을 보면, 단순히 성공 여부를 반환하는 것이 아니라 ActiveGameplayEffectHandle을 반환한다는 알 수 있다.해당 Handle을 통해 특정 이펙트를 제거하거나, 남은 시간을 조회하거나, 중첩 수 확인 등을 할 수 있다.따라서 우리의 목표인 Inifite 타입 Gameplay Effect 제거를 위해서는 해당 H..
Instant and Duration Application Policy이제 OnOverlap, OnEndOverlap 함수를 통해 각 Effect에 설정된 APply Policy에 따라 효과를 적용할지 결정할 수 있다.먼저 사전에 enum으로 정의한 Apply Policy는 다음과 같다.Do Not Apply → 아무 것도 하지 않음Apply On Overlap → OnOverlap에서 적용Apply On End Overlap → OnEndOverlap에서 적용 이를 토대로 OnOverlap/OnEndOverlap 함수에서 Apply Policy가 각 조건에 맞는 지 체크하고, 맞으면 해당 시점에 Instant /Duration Effect를 적용한다.Effect 적용 전에는 반드시 Gameplay Ef..
Infinite Gameplay EffectsInstant와 Duration에 이어 마지막으로 Infinite Gameplay Effect에 대해 다뤄보자.이를 위해 액터 클래스에서 Infinite Gameplay Effect를 참조할 수 있도록 TSubclassOf 타입의 변수를 선언하고, 해당 효과를 적용할 Effect Actor와 Gameplay Effect 기반 블루프린트도 함께 생성한다. 무한히 지속될 효과를 가진 Actor로는 불타오르는 일정 Area를 만들 것이다.이에 맞게 Niagara 시스템을 활용하여 불타는 지역을 생성해줄 것이다.그리고 여태 했던 것과 동일하게 Event Graph에서 Effect를 적용되도록 해주자. 사용한 효과 설정은 다음과 같다.매초 마다 체력이 -5가 감소되는 ..
Effect StackingDuration이 존재하는 Gameplay Effect 효과를 설정할 때 옵션에 Stacking 옵션이 존재한다.해당 옵션은 동일한 효과가 여러 번 적용될 때 이를 어떻게 처리할지에 대한 기준을 정의한다. Stacking 타입은 다음과 같이 3가지가 존재한다.없음 (None)소스별 집계 (Aggregate by Source)대상별 집계 (Aggregate by Target)1. None현재 기본 값으로 Staking 옵션을 할당하지 않은 상태이다.이 상태에서 동일한 마나 회복 Effect를 가진 크리스탈을 여러 개 습득한다고 가정해보자.크리스탈 3개 빠르게 연속 획득각각 동일한 효과 적용-> 마나 증가 속도가 매우 빠르게 증가 각 효과가 모두 1초 동안 +10씩 마나를 회복한다..
Periodic Gameplay Effects새로운 내용에 앞서 Gameplay Effect의 기본 개념을 정리하면 다음과 같다.Attribute 핵심 구조속성(Attribute)은 2가지 값으로 구성됨Base Value (기본값) → 영구적인 값Current Value (현재값) → 효과 적용된 결과값1. 인스턴트(Instant) 적용되는 순간 바로 값이 바뀜기본값(Base Value) 자체를 변경함그래서 효과가 끝나도 되돌아가지 않는 영구적 변화ex) 영구 능력치 증가, 레벨업2. 지속(Duration) / 무한(Infinite) 일정 시간 동안 유지되거나 (Duration)수동으로 제거할 때까지 유지됨 (Infinite)현재값(Current Value)만 변경함효과가 끝나면 자동으로 원래 상태로 돌..
Duration Gameplay Effects저번 강의를 통해 즉시 적용되는(Instant) Gameplay Effect를 만들고 적용하는 방법을 배웠다.이번에는 지속 시간(Duration)이 있는 Gameplay Effect를 다룰 것이다. 이에 앞서서, 해당 Effect를 C++에서 함수를 만들고 이를 블루 프린트에서 호출하고 적용했는데, C++ 함수 없이 블루프린트만으로 Gameplay Effect를 적용하는 방법을 알아볼 것이다. 기존 C++ 로직은 다음과 같다.1. 대상 Actor에서 Ability System Component 가져오기2. Effect Context 생성3. Gameplay Effect Spec 생성4. Effect 적용 블루프린트에서는 Overlap 이벤트의 Other Act..
Instant Gameplay Effects저번 강의에 이어서 Gameplay Effect를 적용을 블루프린트에서 해줄 것이다.이를 위해 기존 코드를 블루프린트에서 호출하거나 읽을 수 있도록 바꿔주자.그리고 변수 이름도 Target의 경우 블루 프린트에서 흔히 보이는 이름으로 혼동이 올 수 있기에 바꿔주자. 이제 적용할 효과를 담당하는 EffectClass를 만들어주자. 이제 해당 클래스에서 적용할 속성을 골라야 한다.해당 클래스는 체력을 채워주는 포션 기능을 담당할 클래스이기에, Health 속성을 선택한다.그리고 체력을 25 증가시켜주는 효과를 줄 것이기 때문에 Op를 Add로 하고, Magnitude를 25로 설정해주자. 그리고 중요한 것은 해당 효과가 지속 효과가 아니라 즉시 적용되는 효과이기 때..
Effect Actor Improved기존의 Aura Effect Actor의 경우 컴포넌트가 구체로 고정, 오버랩 시 특정 액터에만 작동, AttributeSet을 가져와 직접 값 수정 (하드 코딩),등 모듈화가 되어있지 않고 특정 기능만 수행하는 고정된 액터였다.따라서 해당 액터를 리팩토링해줄 것이며, 이를 위해 기존 내용을 모두 지워주자.모두 지워준 상태에서 생성자에서 기본 Root만 설정해준 후 블루프린트에서 자유롭게 구성 가능하도록 해줄 것이다. 해당 코드만 컴파일 후 언리얼에서 포션을 위한 Static Mesh Component를 할당해주자. 오버랩도 여기서 다룰 것이다.오버랩 용 Sphere Collision을 만들고, 기존 포션의 Collision 설정은 NoCollsion으로 바꿔주자. ..
