본문으로 건너뛰기
Unreal Engine GAS(Gameplay Ability System) 심화LESSON 43

최종 실습 1: Attribute와 전투 기반 완성

난이도심화
예상 시간240분
선수지식42강까지의 GAS 구현·디버깅 기초

43강. 최종 실습 1: Attribute와 전투 기반 완성

1. 이번 강의에서 해결할 문제​

개별 예제를 최종 프로젝트로 합칠 때 ASC 초기화, Attribute 기본값, UI Delegate, 데미지 실행 책임이 다시 섞이기 쉽습니다. 첫 단계에서는 Ability를 늘리기 전에 서버 권한 전투 기반과 관찰 가능한 데이터 흐름을 고정합니다.

2. 학습 목표​

3. 핵심 개념​

최종 구조에서 AGASPlayerState는 ASC와 UGASAttributeSet을 소유하고, AGASCombatCharacter는 Avatar와 입력·애니메이션을 담당합니다. UGASCombatComponent는 ASC 접근과 사망 이벤트를 중계하지만 Attribute 원본을 복제하지 않습니다. UI는 Attribute Delegate를 구독하는 Presenter를 통해 읽기 전용으로 갱신합니다.

4. 구현​

GASPlayerState.h
UCLASS()
class GASDEMO_API AGASPlayerState : public APlayerState,
public IAbilitySystemInterface
{
GENERATED_BODY()

public:
AGASPlayerState();
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;
const UGASAttributeSet* GetCombatAttributes() const;

private:
UPROPERTY(VisibleAnywhere)
TObjectPtr<UGASAbilitySystemComponent> AbilitySystemComponent;

UPROPERTY()
TObjectPtr<UGASAttributeSet> CombatAttributes;
};
GASAttributeSet.h
UCLASS()
class GASDEMO_API UGASAttributeSet : public UAttributeSet
{
GENERATED_BODY()

public:
ATTRIBUTE_ACCESSORS(UGASAttributeSet, Health)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, MaxHealth)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, Mana)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, MaxMana)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, AttackPower)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, Defense)
ATTRIBUTE_ACCESSORS(UGASAttributeSet, MoveSpeed)

virtual void PreAttributeChange(
const FGameplayAttribute& Attribute, float& NewValue) override;
virtual void PostGameplayEffectExecute(
const FGameplayEffectModCallbackData& Data) override;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Health)
FGameplayAttributeData Health;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MaxHealth)
FGameplayAttributeData MaxHealth;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Mana)
FGameplayAttributeData Mana;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MaxMana)
FGameplayAttributeData MaxMana;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_AttackPower)
FGameplayAttributeData AttackPower;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_Defense)
FGameplayAttributeData Defense;

UPROPERTY(BlueprintReadOnly, ReplicatedUsing=OnRep_MoveSpeed)
FGameplayAttributeData MoveSpeed;

private:
UFUNCTION() void OnRep_Health(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_MaxHealth(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_Mana(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_MaxMana(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_AttackPower(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_Defense(const FGameplayAttributeData& OldValue);
UFUNCTION() void OnRep_MoveSpeed(const FGameplayAttributeData& OldValue);
};

서버의 GE_InitializeAttributes가 Spawn/부활 초기값을 적용하고, UGE_DamageExecution이 방어·무적·팀 규칙을 반영한 뒤 Meta Attribute IncomingDamage에 결과를 전달합니다. PostGameplayEffectExecute는 체력을 Clamp하고 0 전환을 전투 컴포넌트에 알립니다. 생성자 기본값과 수동 Set을 여러 곳에서 섞지 않습니다.

5. 코드가 동작하는 이유​

PlayerState의 ASC는 Pawn 교체에도 유지되고, 새 Avatar만 다시 연결됩니다. Effect 기반 초기화와 데미지는 서버의 하나의 변경 경로를 거치므로 UI, 로그, 사망 판정이 같은 결과를 관찰합니다. Presenter는 위젯 수명과 데이터 수명을 분리합니다.

6. 실패 사례와 해결​

7. 직접 실습​

8. 이해 점검 질문 3개​

9. 핵심 요약​

MINI QUIZ

최종 실습 1: Attribute와 전투 기반 완성 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“최종 실습 1: Attribute와 전투 기반 완성” 실습을 안전하게 진행하기 위한 판단으로 가장 알맞은 것은 무엇인가요?
  2. 문제 2‘클라이언트 PostGameplayEffectExecute에 사망 권한 기대’ 실수를 판단할 때 “최종 실습 1: Attribute와 전투 기반 완성” 강의가 제시한 기준은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

43강. 최종 실습 1: Attribute와 전투 기반 완성 미완료 상태