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

AbilitySystemComponent와 IAbilitySystemInterface

난이도심화
예상 시간125분
선수지식3강의 GASCombat 구조

4강. AbilitySystemComponent와 IAbilitySystemInterface

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

다른 Actor가 피격 대상을 Character로 Cast해 ASC를 꺼내면 AI, 소환물, PlayerState 소유 ASC를 처리하지 못합니다. ASC는 Ability와 Effect, Tag, Attribute, 예측·복제 상태의 중심이므로 검색 계약과 복제 정책을 명시해야 합니다.

2. 학습 목표​

3. 핵심 개념​

ASC는 Ability Spec, Active Gameplay Effect, Tag Count, AttributeSet과 예측 정보를 관리합니다. 외부 코드는 구체 클래스보다 IAbilitySystemInterface::GetAbilitySystemComponent를 통해 접근합니다. 한 Actor에 여러 ASC가 있으면 Attribute·Tag·Effect 적용 대상이 모호해집니다.

ASC가 관리하는 데이터와 실행 주체​

데이터·계약무엇인가누가 주로 변경·사용하나
Ability Spec지급된 Ability 클래스·레벨·입력 Handle과 실행 상태서버가 지급·회수하고 소유 Client가 예측 Activation에 사용
Active Gameplay Effect현재 적용 중인 Duration·Infinite Effect 정보서버가 권위 있게 적용·제거하고 Replication Mode에 따라 Client가 관찰
Gameplay Tag Count여러 Effect·Ability가 부여한 Tag의 누적 상태ASC가 계산하고 Activation 조건·UI가 조회
AttributeSetHealth·Mana 같은 수치와 변경 Hook서버 Effect가 변경하고 개별 Attribute RepNotify 정책으로 Client에 전달
Prediction 상태소유 Client의 선행 실행과 서버 확인을 연결하는 정보ASC가 Prediction Key와 함께 관리
IAbilitySystemInterfaceActor에서 ASC 하나를 찾는 공통 C++ 계약Damage·Targeting·UI 등 외부 소비자가 사용

Replication Mode는 모든 GAS 데이터를 한 번에 복제하는 스위치가 아닙니다. 주로 Active Gameplay Effect 상세 정보의 전송 범위를 결정합니다.

  • Full: Active Effect 상세를 관련 Client에 폭넓게 보냅니다. 소규모 Player Actor에서 단순하지만 비용이 큽니다.
  • Mixed: 소유 Client에는 상세 Effect를, 다른 Client에는 최소 표현만 보냅니다. Player 소유 관계가 정확해야 합니다.
  • Minimal: 상세 Active Effect 복제를 최소화하는 AI·대량 Actor용 선택입니다.

Gameplay Tag·Cue와 Attribute 복제에는 각자의 규칙이 있으며, Attribute는 이후 강의에서 UPROPERTY(ReplicatedUsing=...)와 GetLifetimeReplicatedProps를 구현해야 합니다. SetIsReplicated(true)만으로 모든 Attribute 선언이 자동 완성되지는 않습니다.

외부 시스템이 Target Actor를 받음
→ IAbilitySystemInterface로 ASC 조회
→ 서버가 Effect Spec 적용
→ ASC가 Effect·Tag·Attribute 상태 갱신
→ Replication Mode와 Attribute 복제 선언에 따라 전송
→ 소유 Client HUD·다른 Client 표현이 각자 필요한 정보 관찰

4. 구현​

GASCombatCharacter.h
#pragma once

#include "AbilitySystemInterface.h"
#include "GameFramework/Character.h"
#include "GASCombatCharacter.generated.h"

class UGASAbilitySystemComponent;

UCLASS()
class GASCOMBAT_API AGASCombatCharacter
: public ACharacter,
public IAbilitySystemInterface
{
GENERATED_BODY()

public:
AGASCombatCharacter();
virtual UAbilitySystemComponent* GetAbilitySystemComponent() const override;

protected:
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="GAS")
TObjectPtr<UGASAbilitySystemComponent> AbilitySystemComponent;
};
GASCombatCharacter.cpp
#include "Characters/GASCombatCharacter.h"
#include "AbilitySystem/GASAbilitySystemComponent.h"

AGASCombatCharacter::AGASCombatCharacter()
{
AbilitySystemComponent = CreateDefaultSubobject<UGASAbilitySystemComponent>(
TEXT("AbilitySystemComponent"));
AbilitySystemComponent->SetIsReplicated(true);
AbilitySystemComponent->SetReplicationMode(
EGameplayEffectReplicationMode::Mixed);
}

UAbilitySystemComponent*
AGASCombatCharacter::GetAbilitySystemComponent() const
{
return AbilitySystemComponent;
}

AI와 일회성 Pawn처럼 ASC 상태가 Pawn 수명과 같으면 Character 소유가 간단합니다. 플레이어 Respawn 뒤 Cooldown과 Buff가 유지되어야 하면 다음 강의의 PlayerState 소유 패턴을 사용합니다.

코드 한 줄씩 이해하기​

  1. IAbilitySystemInterface를 다중 상속해 구체 Character 타입을 모르는 코드도 ASC를 요청할 수 있습니다.
  2. Interface 반환 타입은 기반 UAbilitySystemComponent*이므로 프로젝트 전용 하위 타입을 소비자에게 강제하지 않습니다.
  3. ASC를 CreateDefaultSubobject로 생성해 Character 클래스 구조와 수명을 같이 가져갑니다.
  4. SetIsReplicated(true)는 서버 ASC의 복제 참여를 켭니다. Actor 자체의 복제와 네트워크 Owner도 별도로 올바르게 설정돼야 합니다.
  5. Mixed Mode는 Player Character에 흔한 출발점이지만 소유 Client 연결과 ActorInfo 초기화가 맞아야 의도대로 동작합니다.
  6. Getter는 매번 새 ASC를 만들지 않고 같은 Component 포인터를 반환해야 합니다. 한 Actor의 상태 원본은 하나여야 합니다.

가장 작은 Interface 조회 확인​

Damage나 Targeting 코드가 Target을 받았다고 가정하고 구체 Character Cast 없이 ASC를 찾습니다.

UAbilitySystemComponent* FindASC(const AActor* Target)
{
const IAbilitySystemInterface* Provider =
Cast<IAbilitySystemInterface>(Target);
return Provider ? Provider->GetAbilitySystemComponent() : nullptr;
}

Character와 테스트 Dummy가 모두 Interface를 구현하면 같은 함수가 각자의 ASC를 반환합니다. Interface가 없는 일반 Actor에는 null이 나오며, 호출자는 GAS 대상이 아닌 경우를 정책에 맞게 처리합니다.

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

ASC를 Default Subobject로 만들면 Actor 수명과 함께 등록됩니다. 복제를 켜야 서버의 Attribute·Tag·Effect 정보가 정책에 따라 클라이언트에 전달됩니다. Interface는 소비자가 ASC의 실제 소유 위치를 몰라도 같은 진입점을 사용하게 합니다.

6. 실패 사례와 해결​

7. 직접 실습​

실습 목표​

서로 다른 Actor 클래스에서 같은 Interface로 ASC를 찾고, 서버·소유 Client·관찰 Client가 어느 ASC 복사본을 보는지 PIE 로그로 구분합니다.

시작 전 상태​

GameplayAbilities·GameplayTags·GameplayTasks 모듈 의존성과 플러그인 활성화를 확인합니다. 2인 Listen Server PIE를 사용하고 Character에 bReplicates와 ASC 복제가 켜져 있어야 합니다.

1단계: 따라 하기​

Character BeginPlay에서 Interface를 통해 자기 ASC를 조회하고 NetMode, Role, Actor 이름, ASC 포인터를 로그로 남깁니다. 같은 World의 한 Actor에서는 직접 멤버와 Interface 반환값이 같은 포인터여야 합니다.

2단계: 값 바꿔 보기​

ASC를 가진 테스트 Dummy와 Interface가 없는 일반 Actor를 같은 함수에 전달합니다. Dummy는 유효 포인터, 일반 Actor는 null을 반환해야 하며 null 경로가 크래시를 만들지 않아야 합니다.

3단계: 직접 적용​

서버에서만 테스트 Gameplay Effect를 Target ASC에 적용하고 서버·소유 Client·관찰 Client의 Effect·Tag·Attribute 관찰 결과를 표로 기록합니다. 아직 Attribute 복제를 구현하지 않았다면 “서버만 변경” 결과를 Replication Mode 오류로 오해하지 말고 선언 누락을 별도로 표시합니다.

4단계: 스스로 확인​

막혔을 때​

증상원인 후보확인과 해결
Interface Cast가 nullActor가 Interface를 상속하지 않거나 다른 인스턴스클래스 선언과 실제 Target 이름을 로그로 확인합니다.
ASC Getter가 nullDefault Subobject 생성 누락 또는 잘못된 반환생성자와 멤버 포인터를 확인합니다.
서버에서만 Effect가 보임ASC/Actor 복제, Owner 관계, Attribute 선언 문제Active Effect와 Attribute를 분리해 복제 설정을 점검합니다.
Respawn 뒤 상태가 사라짐ASC가 Character 수명에 묶임다음 강의에서 PlayerState 소유 패턴이 필요한지 판단합니다.

8. 이해 점검 질문 3개​

9. 핵심 요약​

다음 강의 연결​

다음 강의: ASC는 Character와 PlayerState 중 어디에 두어야 할까에서는 Respawn 뒤 Effect·Cooldown 유지 요구와 네트워크 Owner 관계를 기준으로 ASC 수명을 결정합니다.

MINI QUIZ

AbilitySystemComponent와 IAbilitySystemInterface 미니 퀴즈

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

0 / 2
  1. 문제 1“AbilitySystemComponent와 IAbilitySystemInterface” 실습 결과를 해석하는 올바른 기준은 무엇인가요?
  2. 문제 2‘SetIsReplicated 누락’ 상태에 관한 “AbilitySystemComponent와 IAbilitySystemInterface” 본문의 설명으로 가장 알맞은 것은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

4강. AbilitySystemComponent와 IAbilitySystemInterface 미완료 상태