Udemy Unreal - Gameplay Ability System - Top Down RPG (Section 2)

๊น€์ข…๋ฏผยท2025๋…„ 3์›” 18์ผ

Udemy Unreal - GAS

๋ชฉ๋ก ๋ณด๊ธฐ
2/7

๐Ÿ“– ์œ ๋ฐ๋ฏธ GAS ๊ฐ•์˜ ์ค‘ ๊ธฐ๋กํ•ด๋‘๊ณ  ์‹ถ์€ ๋‚ด์šฉ์„ ์ ์–ด๋‘” ํฌ์ŠคํŠธ

Section 2 : GAS์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค๋ช…๊ณผ ์…‹์—…


AbilitySystemInterface

{ํ”„๋กœ์ ํŠธ๋ช…}.bulid.cs

  • ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ชจ๋“ˆ ๋“ฑ๋ก ํ•„์š” : "GameplayAbilities"
PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" , "EnhancedInput", "GameplayAbilities" });
  • ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌํ˜„์„ ํ†ตํ•ด ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ASC(AbilitySystemComponent)์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋กํ•œ๋‹ค.
    - GetAbilitySystemComponent() ์‚ฌ์šฉ (์ˆœ์ˆ˜๊ฐ€์ƒํ•จ์ˆ˜๋กœ ์ •์˜๋˜์–ด์žˆ์Œ)
UAbilitySystemComponent* AAuraCharacterBase::GetAbilitySystemComponent() const
{
	return AbilitySystemComponent;
}

์„œ๋ฒ„

๋ฐ๋””์ผ€์ดํŠธ ์„œ๋ฒ„ : ํ”Œ๋ ˆ์ด์–ด X, ๋ Œ๋”๋ง X
๋ฆฌ์Šจ ์„œ๋ฒ„ : ํ”Œ๋ ˆ์ด์–ด๊ฐ€ ์ง์ ‘ ํ˜ธ์ŠคํŒ…, ํ˜ธ์ŠคํŠธ๋Š” ์ง€์—ฐ์‹œ๊ฐ„ X

๋ฐ์ดํ„ฐ ์œ ํšจ์„ฑ์€ ์„œ๋ฒ„๊ฐ€ ๊ธฐ์ค€์ ์ด ๋œ๋‹ค.

  • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ์„œ๋ฒ„๊ฐ€ ๋ฎ์–ด์”Œ์›€
  • ๊ฒŒ์ž„๋ชจ๋“œ๋„ ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•˜๋ฉฐ ํด๋ผ๋Š” ์ ‘๊ทผ X

๋ชจ๋“  ์ปจํŠธ๋กค๋Ÿฌ์— ๋Œ€ํ•œ ๊ถŒํ•œ์€ ์„œ๋ฒ„๊ฐ€ ๊ฐ€์ง€๋ฉฐ ํด๋ผ๋Š” ๊ฐ์ž๊ฐ€ ์†Œ์œ ํ•œ ์ปจํŠธ๋กค๋Ÿฌ๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค

ํ”Œ๋ ˆ์ด์–ด ์Šคํ…Œ์ดํŠธ ์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ์—๋„ ๋ชจ๋‘ ์กด์žฌํ•œ๋‹ค.

HUD,Widget์€ ํด๋ผ์ด์–ธํŠธ์—๋งŒ ์กด์žฌํ•˜๋ฉด ๋œ๋‹ค.

  • ํ™”๋ฉด์— ํ‘œ์‹œ๋  ์ •๋ณด๋Š” ๊ตณ์ด ์„œ๋ฒ„๊ฐ€ ๊ด€๋ฆฌํ•  ํ•„์š”์—†์ด ๊ฐ์ž์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ํ‘œํ˜„๋˜๋ฉด ๋จ

Replication์€ ์„œ๋ฒ„ -> ํด๋ผ ๋‹จ๋ฐฉํ–ฅ์ด๋‹ค.


ASC(Ability System Component)

์ƒ์„ฑ๊ณผ ํ• ๋‹น

์บ๋ฆญํ„ฐ์˜ ๋ฉค๋ฒ„์ธ ๊ฒฝ์šฐ

์ง์ ‘ ์ƒ์„ฑ ํ›„ ํ• ๋‹นํ•˜๋ฉด ๋œ๋‹ค.

AAuraEnemy::AAuraEnemy()
{
	AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    // ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ
	AbilitySystemComponent->SetIsReplicated(true); 
    // AI์—ฌ์„œ Minial ๋ชจ๋“œ๋กœ ์‚ฌ์šฉ
	AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Minimal); 
}

ํ”Œ๋ ˆ์ด์–ด ์Šคํ…Œ์ดํŠธ์˜ ๋ฉค๋ฒ„์ธ ๊ฒฝ์šฐ

์Šคํ…Œ์ดํŠธ์—์„œ ์ƒ์„ฑ ํ›„ ์บ๋ฆญํ„ฐ์— ํ• ๋‹นํ•œ๋‹ค.

AAuraPlayerState::AAuraPlayerState()
{
	AbilitySystemComponent = CreateDefaultSubobject<UAuraAbilitySystemComponent>("AbilitySystemComponent");
    // ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‚ฌ์šฉ
	AbilitySystemComponent->SetIsReplicated(true);
    // ํ”Œ๋ ˆ์ด์–ด์—์„œ ์“ธ ๊ฑฐ๋ผ Mixed ๋ชจ๋“œ ์‚ฌ์šฉ
	AbilitySystemComponent->SetReplicationMode(EGameplayEffectReplicationMode::Mixed);
}

InitAbilityActorInfo

ASC๋Š” 2๊ฐœ์˜ Actor ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

  1. OwnerActor

  2. AvatarActor : Owner๊ฐ€ ์บ๋ฆญํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ์บ๋ฆญํ„ฐ์— ์ ‘๊ทผํ•˜๊ธฐ ์šฉ์ดํ•จ

Player Controlled Character ์˜ˆ์‹œ์ฒ˜๋Ÿผ PlayerState๊ฐ€ ASC๋ฅผ ๋“ค๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ
ASC์˜ OwnerActor๋Š” PlayerState๊ฐ€ ๋˜๊ณ  AvatarActor๋Š” Character๊ฐ€ ๋œ๋‹ค.


ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ์ 

์•กํ„ฐ๊ฐ€ ๋ชจ๋‘ ์ƒ์„ฑ๋œ ์ดํ›„ ASC์— AbliltyActorInfo๋ฅผ ํ• ๋‹นํ•ด์•ผํ•˜๋ฏ€๋กœ Possession์ด ์ผ์–ด๋‚œ ์ดํ›„๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•œ๋‹ค.

  1. ํ”Œ๋ ˆ์ด์–ด ์บ๋ฆญํ„ฐ

1-1. Pawn์ด ASC๋ฅผ ๋“ค๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ

  • ์„œ๋ฒ„ : PossessedBy()
  • ํด๋ผ : AcknowledgePossession()

1-2. PlayerState๊ฐ€ ASC๋ฅผ ๋“ค๊ณ ์žˆ๋Š” ๊ฒฝ์šฐ

  • ์„œ๋ฒ„ : PossessedBy()
  • ํด๋ผ : OnRep_PlayerState() : RepNotify ์‚ฌ์šฉ

-> 1-2์˜ ๊ฒฝ์šฐ ASC๊ฐ€ PlayerState์— ๋“ค์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— PlayerState๊ฐ€ Validํ•œ์ง€๋„ ์ฒดํฌํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— RepNotify๋กœ ํ™•์ธํ•˜๋Š” ๊ฒƒ
-> PlayerState๊ฐ€ ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜๋˜๋Š” ์‹œ์ ์—๋Š” ํ”Œ๋ ˆ์ด์–ด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ Possess๋œ ์ดํ›„์ด๋ฏ€๋กœ ์•ˆ์ „ํ•˜๋‹ค.

void AAuraCharacter::PossessedBy(AController* NewController)
{
	Super::PossessedBy(NewController);
	// ์„œ๋ฒ„ ์ „์šฉ
	//if (HasAuthority()) ์ฒดํฌ ์•ˆ ํ•ด๋„ ๋˜๋Š” ๊ฒŒ ์ด๋ฏธ Server์—์„œ๋งŒ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜์ž„
	InitAbilityActorInfo();
}

void AAuraCharacter::OnRep_PlayerState()
{
	Super::OnRep_PlayerState();
	// ํด๋ผ์ด์–ธํŠธ ์ „์šฉ
	InitAbilityActorInfo();
}

// InitAbilityActorInfo๋„ ํ˜ธ์ถœํ•˜๊ณ  State๊ฐ€ ์ƒ์„ฑํ•ด๋‘” ์ปดํฌ๋„ŒํŠธ๋„ ์บ๋ฆญํ„ฐ์— ํ• ๋‹นํ•ด์ฃผ๋Š” ๋‘๊ฐ€์ง€ ์—ญํ• 
void AAuraCharacter::InitAbilityActorInfo()
{
	AAuraPlayerState* PlayerState = GetPlayerState<AAuraPlayerState>(); // ํ…œํ”Œ๋ฆฟ ๋ฒ„์ „์ด ์žˆ์Œ
	check(PlayerState);
	AbilitySystemComponent = PlayerState->GetAbilitySystemComponent();
	AbilitySystemComponent->InitAbilityActorInfo(PlayerState, this); // OwnerActor != AvatarActor
}

  1. AI ์บ๋ฆญํ„ฐ

์˜ˆ์ œ์—์„œ AI ์บ๋ฆญํ„ฐ๋Š” ์ง์ ‘ ASC๋ฅผ ๋“ค๊ณ ์žˆ๊ณ , ์ผ๋ฐ˜์ ์œผ๋กœ BeginPlay ์‹œ์ ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ ํ• ๋‹น๋„ ๋˜์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ BeginPlay์—์„œ ํ˜ธ์ถœํ•œ๋‹ค.

void AAuraEnemy::BeginPlay()
{
	Super::BeginPlay();
	
	AbilitySystemComponent->InitAbilityActorInfo(this,this); // OwnerActor == AvatarActor
}

Replication Mode

ASC ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ชจ๋“œ๋Š” 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

  • Full : ์‹ฑ๊ธ€ ํ”Œ๋ ˆ์ด
  • Mixed : ํ”Œ๋ ˆ์ด์–ด ์ปจํŠธ๋กค๋Ÿฌ
  • Minimal : Ai ์ปจํŠธ๋กค๋Ÿฌ

์ฃผ์˜ ์‚ฌํ•ญ

Mixed ๋ชจ๋“œ ์‚ฌ์šฉ์‹œ ASC์˜ OwnerActor์˜ Owner๋Š” ํ•ญ์ƒ Controller ํด๋ž˜์Šค์—ฌ์•ผํ•œ๋‹ค.

  • State ํด๋ž˜์Šค๊ฐ€ OwnerActor์ธ ๊ฒฝ์šฐ ์ž๋™์œผ๋กœ Controller ํด๋ž˜์Šค๋กœ ์žก์•„์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์ƒ๊ด€ ์—†์Œ
  • Pawn ํด๋ž˜์Šค๋„ ๋งˆ์ฐฌ๊ฐ€์ง€
  • ๊ทธ ์™ธ์˜ ์•กํ„ฐ ํด๋ž˜์Šค A๋ฅผ ASC์˜ OwnerActor๋กœ ์‚ฌ์šฉํ•  ๋•Œ๋Š” A.SetOwner() ๋ฅผ ํ†ตํ•ด ๊ฐ•์ œ๋กœ Controller๋กœ ์žก์•„์ค€ ๋’ค ์‚ฌ์šฉํ•  ๊ฒƒ

์ปค๋ฐ‹

https://github.com/jongmin7759/Unreal_GAS/commit/e651ac220a9aa7b74f10b4b3d3e344510e289ef1

profile
์ •๋ฆฌ์™€ ๊ธฐ๋ก

0๊ฐœ์˜ ๋Œ“๊ธ€