๐Ÿ“˜ TIL - ์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ : ํƒ€๊ฒŸ ๋„˜๋ฒ„ , GAS ๋ฐฉ์–ด ์‹œ์Šคํ…œ ๊ตฌํ˜„

HappyCircleยท2026๋…„ 3์›” 9์ผ

Unreal ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
83/163

1. ํƒ€๊ฒŸ ๋„˜๋ฒ„

๋ฌธ์ œ ํ•ต์‹ฌ

๋ฐฐ์—ด numbers๊ฐ€ ์ฃผ์–ด์ง€๊ณ  ๊ฐ ์ˆซ์ž ์•ž์— + ๋˜๋Š” -๋ฅผ ๋ถ™์—ฌ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ target์ด ๋˜๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

ํ•ต์‹ฌ ํŠน์ง•

๊ฐ ์ˆซ์ž๋งˆ๋‹ค ๋‘ ๊ฐ€์ง€ ์„ ํƒ ์กด์žฌ
+numbers[i]
-numbers[i]

์˜ˆ์‹œ

numbers = [1,1,1,1,1]
target = 3

์ฒ˜์Œ ์ ‘๊ทผํ•œ ๋ฐฉ์‹ (DFS ์™„์ „ ํƒ์ƒ‰)

์ฒ˜์Œ์—๋Š” ๊ฐ ์ˆซ์ž๋งˆ๋‹ค + ๋˜๋Š” -๋ฅผ ์„ ํƒํ•˜๋Š” ์™„์ „ ํƒ์ƒ‰ ๊ตฌ์กฐ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.

ํ•ต์‹ฌ ๊ตฌ์กฐ

ํ˜„์žฌ ํ•ฉ
โ†’ +numbers[i]
โ†’ -numbers[i]

DFS ์ฝ”๋“œ ๊ตฌ์กฐ

void DFS(vector<int>& numbers, int target, int sum, int idx)
{
    if(idx == numbers.size())
    {
        if(sum == target)
            count++;
        return;
    }

    DFS(numbers, target, sum + numbers[idx], idx + 1);
    DFS(numbers, target, sum - numbers[idx], idx + 1);
}

์‹œ๊ฐ„ ๋ณต์žก๋„

O(2^n)

๋ถ„์„

๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•˜๋ฉด์„œ ์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํ•œ DFS ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ
๋‘ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๋ฌธ์ œ๋กœ ํ•ด์„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ํ™•์ธํ•˜์˜€๋‹ค.

์ •์˜

P = +๋กœ ์„ ํƒํ•œ ์ˆซ์ž๋“ค์˜ ํ•ฉ
N = -๋กœ ์„ ํƒํ•œ ์ˆซ์ž๋“ค์˜ ํ•ฉ

๋ฌธ์ œ ์กฐ๊ฑด

P - N = target

๋˜ํ•œ ๋ชจ๋“  ์ˆซ์ž๋Š” ๋ฐ˜๋“œ์‹œ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ

P + N = S

์—ฌ๊ธฐ์„œ S๋Š” ๋ฐฐ์—ด์˜ ์ „์ฒด ํ•ฉ์ด๋‹ค.

๋‘ ์‹์„ ๋”ํ•˜๋ฉด

2P = S + target

๋”ฐ๋ผ์„œ

P = (S + target) / 2

์ฆ‰ ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณ€ํ™˜๋œ๋‹ค.

ํ•ฉ์ด (S + target) / 2 ๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜ ๊ตฌํ•˜๊ธฐ

Target Sum ๋ฌธ์ œ๋ฅผ Subset Sum ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜ ๊ฐ€๋Šฅํ•˜๋‹ค


๊ตฌ์กฐ์  ์ ‘๊ทผ (DP)

๋ฌธ์ œ๋ฅผ ๋ถ€๋ถ„์ง‘ํ•ฉ ํ•ฉ ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜ํ•˜๋ฉด DP๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค

DP ์ •์˜

dp[s] = ํ•ฉ์ด s๊ฐ€ ๋˜๋Š” ๋ถ€๋ถ„์ง‘ํ•ฉ์˜ ๊ฐœ์ˆ˜

์ดˆ๊ธฐ ์ƒํƒœ

dp[0] = 1

์ด ์˜๋ฏธ๋Š”

์•„๋ฌด๊ฒƒ๋„ ์„ ํƒํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ
โ†’ ํ•ฉ 0์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ 1๊ฐœ

์ „์ด์‹

dp[s] += dp[s - num]

์˜๋ฏธ

ํ•ฉ (s - num)์„ ๋งŒ๋“ค๋˜ ๋ชจ๋“  ๊ฒฝ์šฐ์—
num์„ ์ถ”๊ฐ€ํ•˜๋ฉด
ํ•ฉ s๊ฐ€ ๋˜๋Š” ์ƒˆ๋กœ์šด ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธด๋‹ค

๊ตฌํ˜„ ์ฝ”๋“œ

int sum = accumulate(numbers.begin(), numbers.end(), 0);
int goal = (sum + target) / 2;

vector<int> dp(goal + 1, 0);
dp[0] = 1;

for (int num : numbers)
{
    for (int s = goal; s >= num; s--)
    {
        dp[s] += dp[s - num];
    }
}

์‹œ๊ฐ„ ๋ณต์žก๋„

O(n * goal)

2. GAS ๋ฐฉ์–ด ์‹œ์Šคํ…œ ๊ตฌํ˜„

๋ฌธ์ œ

๋ฐฉ์–ด ๊ธฐ๋Šฅ์„ ๋‹จ์ˆœํžˆ ๋ง‰๊ธฐ ๋™์ž‘์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹ค์ œ ํ”Œ๋ ˆ์ด ํ๋ฆ„์— ๋งž๊ฒŒ ๋‹ค์Œ ์š”์†Œ๋ฅผ ํ•จ๊ป˜ ๋ถ™์—ฌ์•ผ ํ–ˆ๋‹ค.

  • ๋ฐฉ์–ด ์ค‘ ์Šคํƒœ๋ฏธ๋‚˜ ์ง€์† ์†Œ๋ชจ
  • ๋ฐฉ์–ด ํ•ด์ œ ํ›„ ์Šคํƒœ๋ฏธ๋‚˜ ์ž์—ฐ ํšŒ๋ณต
  • ๋ฐฉ์–ด ์ƒํƒœ์— ๋งž๋Š” ์‹ค๋“œ VFX / ์•กํ„ฐ ์—ฐ์ถœ
  • Ability ๋กœ์ง๊ณผ ์—ฐ์ถœ ๋กœ์ง์˜ ๋ถ„๋ฆฌ

ํ•ต์‹ฌ ๊ตฌ์กฐ

์ž…๋ ฅ
  โ†“
GA_Block ์‹คํ–‰
  โ†“
๋ฐฉ์–ด ๋ฒ„ํ”„ ์ ์šฉ
์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ ์‹œ์ž‘
์ž์—ฐ ํšŒ๋ณต ์ค‘์ง€
  โ†“
GameplayCue ์‹คํ–‰
  โ†“
์‹ค๋“œ VFX / ์•กํ„ฐ / ๋ฉ”์‹œ ํ‘œ์‹œ
๋ฐฉ์–ด ํ•ด์ œ
  โ†“
GA_Block ์ข…๋ฃŒ
  โ†“
๋ฐฉ์–ด ๋ฒ„ํ”„ ์ œ๊ฑฐ
์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ ์ข…๋ฃŒ
์Šคํƒœ๋ฏธ๋‚˜ ์ž์—ฐ ํšŒ๋ณต ์‹œ์ž‘
  โ†“
GameplayCue ์ œ๊ฑฐ
  โ†“
์‹ค๋“œ VFX / ์•กํ„ฐ / ๋ฉ”์‹œ ์ œ๊ฑฐ

๊ตฌ์„ฑ ์š”์†Œ ์š”์•ฝ

๊ตฌ์„ฑ ์š”์†Œ์—ญํ• 
GA_Block๋ฐฉ์–ด ์‹œ์ž‘/์œ ์ง€/์ข…๋ฃŒ ์ œ์–ด
DefenseBuffEffect๋ฐฉ์–ด๋ ฅ ์ฆ๊ฐ€ ๋ฒ„ํ”„
StaminaDrainEffect๋ฐฉ์–ด ์ค‘ ์Šคํƒœ๋ฏธ๋‚˜ ๊ฐ์†Œ
StaminaRegenEffect๋ฐฉ์–ด ์ข…๋ฃŒ ํ›„ ์ž์—ฐ ํšŒ๋ณต
GameplayCue.State.BlockingShield๋ฐฉ์–ด ์ค‘ ์‹ค๋“œ ์—ฐ์ถœ ํ‘œ์‹œ

๋ฐฉ์–ด ์‹œ์ž‘ ์‹œ ์ฒ˜๋ฆฌ

RemoveStaminaRegen();
ApplyStaminaDrain();
ApplyDefenseBuff();
์ฒ˜๋ฆฌ์˜๋ฏธ
RemoveStaminaRegen()์ž์—ฐ ํšŒ๋ณต ์ค‘๋‹จ
ApplyStaminaDrain()๋ฐฉ์–ด ์ค‘ ์Šคํƒœ๋ฏธ๋‚˜ ๊ฐ์†Œ ์‹œ์ž‘
ApplyDefenseBuff()๋ฐฉ์–ด ๋ฒ„ํ”„ ์ ์šฉ

๋ฐฉ์–ด ์ข…๋ฃŒ ์‹œ ์ฒ˜๋ฆฌ

RemoveDefenseBuff();
RemoveStaminaDrain();
ApplyStaminaRegen();
์ฒ˜๋ฆฌ์˜๋ฏธ
RemoveDefenseBuff()๋ฐฉ์–ด ๋ฒ„ํ”„ ์ œ๊ฑฐ
RemoveStaminaDrain()์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ ์ค‘๋‹จ
ApplyStaminaRegen()์ž์—ฐ ํšŒ๋ณต ์‹œ์ž‘

์Šคํƒœ๋ฏธ๋‚˜ ํ๋ฆ„

ํ‰์ƒ์‹œ
โ†’ StaminaRegenEffect ์ ์šฉ ์ƒํƒœ
โ†’ ์Šคํƒœ๋ฏธ๋‚˜ ์ž์—ฐ ํšŒ๋ณต

๋ฐฉ์–ด ์‹œ์ž‘
โ†’ ์ž์—ฐ ํšŒ๋ณต ์ œ๊ฑฐ
โ†’ ์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ ์ ์šฉ

๋ฐฉ์–ด ์ข…๋ฃŒ
โ†’ ์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ ์ œ๊ฑฐ
โ†’ ์ž์—ฐ ํšŒ๋ณต ๋‹ค์‹œ ์ ์šฉ

GameplayCue ํ™œ์šฉ ๋ฐฉ์‹

DefenseBuffEffect
   โ†“
GameplayCue.State.BlockingShield
   โ†“
ํŠน์ • VFX / ์•กํ„ฐ / SkeletalMesh ํ‘œ์‹œ

์ฆ‰ Ability ๋‚ด๋ถ€์—์„œ ์ง์ ‘ ์ดํŽ™ํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹ ,
๋ฒ„ํ”„์— ์—ฐ๊ฒฐ๋œ GameplayCue๊ฐ€ ์—ฐ์ถœ์„ ๋‹ด๋‹นํ•˜๋„๋ก ๋ถ„๋ฆฌํ–ˆ๋‹ค.


GameplayCue๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์—ฐ์ถœ

๋ฐฉ์‹์˜ˆ์‹œ
VFX ์žฌ์ƒNiagara ์‹ค๋“œ ์ดํŽ™ํŠธ
์•กํ„ฐ Spawn๋ฐฉ์–ด๋ง‰ ์•กํ„ฐ ์ƒ์„ฑ
๋ฉ”์‹œ ํ‘œ์‹œStaticMesh / SkeletalMesh ์‹ค๋“œ
์ปดํฌ๋„ŒํŠธ ํ† ๊ธ€๋ฏธ๋ฆฌ ๋ถ™์—ฌ๋‘” ์‹ค๋“œ ๋ฉ”์‹œ Show / Hide

์ตœ์ข… ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ

Block ์ž…๋ ฅ
   โ†“
GA_Block
   โ”œโ”€ DefenseBuffEffect ์ ์šฉ
   โ”œโ”€ StaminaDrainEffect ์ ์šฉ
   โ””โ”€ StaminaRegenEffect ์ œ๊ฑฐ
            โ†“
GameplayCue.State.BlockingShield
            โ†“
์‹ค๋“œ ์—ฐ์ถœ ํ‘œ์‹œ
Block ํ•ด์ œ
   โ†“
EndAbility
   โ”œโ”€ DefenseBuffEffect ์ œ๊ฑฐ
   โ”œโ”€ StaminaDrainEffect ์ œ๊ฑฐ
   โ””โ”€ StaminaRegenEffect ์ ์šฉ
            โ†“
GameplayCue ์ œ๊ฑฐ
            โ†“
์‹ค๋“œ ์—ฐ์ถœ ์ œ๊ฑฐ

ํ•ต์‹ฌ ์ •๋ฆฌ ๋ฐ ๋ฐฐ์šด ์ 

1. ๋ฐฉ์–ด๋Š” ๋‹จ๋ฐœ์„ฑ ์Šคํ‚ฌ์ด ์•„๋‹ˆ๋ผ ์ƒํƒœํ˜• Ability๋‹ค

๋ฐฉ์–ด๋Š” ํ•œ ๋ฒˆ ์‹คํ–‰ํ•˜๊ณ  ๋๋‚˜๋Š” ์Šคํ‚ฌ์ด ์•„๋‹ˆ๋ผ,
์ž…๋ ฅ ์œ ์ง€ ๋™์•ˆ ์ƒํƒœ๋ฅผ ๊ณ„์† ์œ ์ง€ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ๋งž์•˜๋‹ค.


2. ์Šคํƒœ๋ฏธ๋‚˜๋Š” ์†Œ๋ชจ์™€ ์ž์—ฐ ํšŒ๋ณต์„ ๋ถ„๋ฆฌํ•ด์•ผ ํ๋ฆ„์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค

  • ๋ฐฉ์–ด ์ค‘์—๋Š” ์†Œ๋ชจ๋งŒ ๋™์ž‘
  • ๋ฐฉ์–ด ์ข…๋ฃŒ ํ›„์—๋Š” ์ž์—ฐ ํšŒ๋ณต๋งŒ ๋™์ž‘

์ด๋ ‡๊ฒŒ ์—ญํ• ์„ ๋‚˜๋ˆ ์•ผ ํ”Œ๋ ˆ์ด ๊ฐ๊ฐ์ด ์ž์—ฐ์Šค๋Ÿฝ๋‹ค.


3. ์—ฐ์ถœ์€ Ability๋ณด๋‹ค GameplayCue์— ๋‘๋Š” ๊ฒƒ์ด ๊น”๋”ํ•˜๋‹ค

Ability๋Š” ์ƒํƒœ์™€ ๊ทœ์น™์„ ๋‹ด๋‹นํ•˜๊ณ ,
์‹ค๋“œ ์—ฐ์ถœ์€ GameplayCue๊ฐ€ ๋‹ด๋‹นํ•˜๊ฒŒ ํ•˜๋ฉด ๊ตฌ์กฐ๊ฐ€ ํ›จ์”ฌ ์ •๋ฆฌ๋œ๋‹ค.


๊ตฌํ˜„ ๊ฒฐ๊ณผ


์˜ค๋Š˜์˜ ์ •๋ฆฌ

  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ์ ‘๊ทผ ๋ฐฉ์‹ ํ•™์Šต
    ๋ถ€ํ˜ธ ์„ ํƒ ๋ฌธ์ œ๋ฅผ ๋‘ ๊ทธ๋ฃน(P, N)์œผ๋กœ ๋ถ„๋ฆฌ โ†’ ์ˆ˜์‹ ๋ณ€ํ™˜ โ†’ Subset Sum ๋ฌธ์ œ๋กœ ๋ณ€ํ™˜ โ†’ DP๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•˜์˜€๋‹ค.
    GAS ๋ฐฉ์–ด ์‹œ์Šคํ…œ ๊ตฌํ˜„
  • GA_Block์—์„œ ๋ฐฉ์–ด ์ƒํƒœ์™€ ์Šคํƒœ๋ฏธ๋‚˜ ์†Œ๋ชจ/์ž์—ฐ ํšŒ๋ณต์„ ์ œ์–ดํ•˜๊ณ , GameplayCue๋ฅผ ํ†ตํ•ด ๋ฐฉ์–ด๋ง‰ VFX๋‚˜ ์•กํ„ฐ ์—ฐ์ถœ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์„ค๊ณ„ํ•˜์˜€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด Ability๋Š” ์ƒํƒœ์™€ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ, GameplayCue๋Š” ์‹œ๊ฐ ํšจ๊ณผ ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•˜๋„๋ก ์—ญํ• ์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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