본문 바로가기

Unreal

[Unreal] Lyra 프로젝트 분석 - 12. GameplayEffect

AttributeSet

직업을 추가할 때마다 클래스를 추가해야 하는데 Attribute를 사용하면 직업 구분 필요 없이

그때그때 필요한 속성들을 추가해서 직업처럼 구성할 수 있다.

 

ATTRIBUTE_ACCESSORS 매크로로 Get, Set, 초기화가 자동 정의된다.

AbilitySystemComponent가 생성된 곳에 같이 생성해야 함 

 

PreAttributeBaseChange

AttributeSet에서 값을 변경하기 전에 Clamp를 해서 값의 범위를 제한한다.

 

PreGameplayEffectExecute, PostGameplayEffectExecute로 게임플레이이펙트 실행 전 후 코드를 작성한다.

PostGameplayEffectExecute에서 힐링을 받으면 체력에 힐링값을 추가한다.

 

 

 

GameplayEffect

캐릭터의 AttributeSet의 영향을 주는 효과다.

DurationType은 Instant(즉발), Infinite(무한), HasDuration(시간 지정)이 있다.

GameplayEffect 또한 게임플레이태그로 발동한다.

 

ModifierMagnitude는 값이 얼마나 변할지 정한다. 

Modifier은 그 값이 + 될지, -될지, 곱하거나 나눠질지 정한다.

 

Execution은 처리방식을 정한다. Modifier와 Character의 Attribute를 참조해서 처리한다.

예를 들어 Character의 체력 회복 비율이 200%라면 Modifier에서 5를 더할 때, Execution에서 10을 더한다.

Execution의 생성자에서 가져오고 싶은 Attribute를 Capture한다.

AttemptCalculateCapturedAttributeMagnitude에서 최종 계산 결과가 나오고 AddOutputModifer에서 값을 변경한다.

 

 

 

HealthComponent

UI와 Character의 중간다리 역할을 하는 컴포넌트다.

UI와 캐릭터 직접적으로 통신하지 않는 이유는 첫번째로 매번 Tick을 돌려야해서 굉장히 무거워진다.

두번째로 종속성이 너무 강해져서 서로 어떤 것을 수정할 때 다른 쪽도 수정해줘야 한다.

 

캐릭터는 HealthComponent에 HP가 바뀌었을 때 알려준다. (Tick필요없음)

GetGameplayAttributeValueChangeDelegate로 Attribute값이 변경되었을 때 함수를 바인딩한다.

체력이 변경될 때 마다 OnHealthChanged 델리게이트를 브로드캐스트한다.

 

델리게이트 설정을 위해 InitializeWithAbilitySystem을 해줘야 하는데 AbilitySystemComponent가 필요하다.

그러면 이걸 언제 해줘야 할까? 1.AbilitySystemComponent 초기화 돼있어야함. 2. PlayerState 세팅완료

3. Pawn 등록 완료 4. Experience 관련 세팅 완료. 이 조건을 모두 만족하는 시점이 HeroComponent::HandleChangeInitState다. 여기에 PawnExtensionComponent::OnAbilitySystemInitialized_RegisterAndCall함수에서

OnAbilitySystemInitialized 델리게이트를 등록한다.