최종 실습 1: Attribute와 전투 기반 완성
43강. 최종 실습 1: Attribute와 전투 기반 완성
1. 이번 강의에서 해결할 문제
개별 예제를 최종 프로젝트로 합칠 때 ASC 초기화, Attribute 기본값, UI Delegate, 데미지 실행 책임이 다시 섞이기 쉽습니다. 첫 단계에서는 Ability를 늘리기 전에 서버 권한 전투 기반과 관찰 가능한 데이터 흐름을 고정합니다.
2. 학습 목표
3. 핵심 개념
최종 구조에서 AGASPlayerState는 ASC와 UGASAttributeSet을 소유하고, AGASCombatCharacter는 Avatar와 입력·애니메이션을 담당합니다. UGASCombatComponent는 ASC 접근과 사망 이벤트를 중계하지만 Attribute 원본을 복제하지 않습니다. UI는 Attribute Delegate를 구독하는 Presenter를 통해 읽기 전용으로 갱신합니다.
4. 구현
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;
};
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. 핵심 요약
최종 실습 1: Attribute와 전투 기반 완성 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.