[TIL] 250917

๊น€์„ธํฌยท2025๋…„ 9์›” 17์ผ
0

โœ๏ธToday I Learned

๐Ÿ“… 2025-09-17

  • Buff/Debuff UI ์‹œ์Šคํ…œ

Buff/Debuff UI ์‹œ์Šคํ…œ

๋ชฉํ‘œ

๊ฒŒ์ž„์—์„œ ํ”Œ๋ ˆ์ด์–ด์—๊ฒŒ ์ ์šฉ๋œ ๋ฒ„ํ”„/๋””๋ฒ„ํ”„ ์ƒํƒœ์ดํŽ™ํŠธ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œํ•˜๋Š” UI ์‹œ์Šคํ…œ ๊ตฌํ˜„

๊ตฌํ˜„ํ•œ UI

  • ๋ฒ„ํ”„/๋””๋ฒ„ํ”„ ์•„์ด์ฝ˜๋“ค์ด ๊ฐ€๋กœ๋กœ ๋‚˜์—ด๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ
  • ๊ฐ ์•„์ด์ฝ˜๋ณ„๋กœ ๋‚จ์€ ์‹œ๊ฐ„ ์นด์šดํŠธ๋‹ค์šด ํ‘œ์‹œ
  • ๋ฒ„ํ”„๋Š” ์ดˆ๋ก ํ…Œ๋‘๋ฆฌ, ๋””๋ฒ„ํ”„๋Š” ๋นจ๊ฐ„ ํ…Œ๋‘๋ฆฌ๋กœ ๊ตฌ๋ถ„
  • ์ตœ๋Œ€ ํ‘œ์‹œ ๊ฐœ์ˆ˜ ์ œํ•œ + ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ

์ฃผ์š” ๊ตฌํ˜„ ๋‚ด์šฉ

1. ์ด์ค‘ ๊ตฌ์กฐ ์„ค๊ณ„

  • GGBuffContainerWidget: ์—ฌ๋Ÿฌ ์ดํŽ™ํŠธ๋“ค์„ ๊ด€๋ฆฌํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ
  • GGBuffSlotWidget: ๊ฐœ๋ณ„ ์ดํŽ™ํŠธ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์Šฌ๋กฏ

2. GameplayEffect ์‹œ์Šคํ…œ ์—ฐ๋™

// ์ดํŽ™ํŠธ ์ถ”๊ฐ€/์ œ๊ฑฐ ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ
ASC->OnActiveGameplayEffectAddedDelegateToSelf.AddUObject(this, &UGGBuffContainerWidget::OnGameplayEffectAdded);
ASC->OnAnyGameplayEffectRemovedDelegate().AddUObject(this, &UGGBuffContainerWidget::OnGameplayEffectRemoved);

3. ์‹ค์‹œ๊ฐ„ ์‹œ๊ฐ„ ์—…๋ฐ์ดํŠธ

  • 0.1์ดˆ๋งˆ๋‹ค GameplayEffect์—์„œ ์‹ค์ œ ๋‚จ์€ ์‹œ๊ฐ„์„ ๊ฐ€์ ธ์™€์„œ UI ๋™๊ธฐํ™”
  • ์‹œ๊ฐ„ ํฌ๋งท: 60์ดˆ ์ด์ƒ โ†’ "2:35", 10์ดˆ ์ด์ƒ โ†’ "45s", 10์ดˆ ๋ฏธ๋งŒ โ†’ "3.2s"

ํ•ต์‹ฌ ๋ฌธ์ œ ํ•ด๊ฒฐ

๋ฌธ์ œ: ์ค‘๋ณต ์ดํŽ™ํŠธ ์ ์šฉ ์‹œ UI ๊นœ๋นก์ž„

์ƒํ™ฉ: 3์ดˆ ๋ฒ„ํ”„๋ฅผ 1์ดˆ ํ›„์— ๋‹ค์‹œ ์ ์šฉํ•˜๋ฉด, ์ฒซ ๋ฒˆ์งธ ๋ฒ„ํ”„ ๋งŒ๋ฃŒ ์‹œ UI์—์„œ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง

์›์ธ: ์–ธ๋ฆฌ์–ผ์—์„œ ๊ฐ™์€ ์ดํŽ™ํŠธ ์žฌ์ ์šฉ ์‹œ ๊ธฐ์กด ์ดํŽ™ํŠธ ์ œ๊ฑฐ โ†’ ์ƒˆ ์ดํŽ™ํŠธ ์ถ”๊ฐ€ ์ˆœ์„œ๋กœ ๋™์ž‘. ๊ธฐ์กด ์ฝ”๋“œ๋Š” ์ œ๊ฑฐ ์ด๋ฒคํŠธ์—์„œ ํƒœ๊ทธ๋งŒ ๋ณด๊ณ  ๋ฌด์กฐ๊ฑด UI ์ œ๊ฑฐ.

ํ•ด๊ฒฐ: ํ•ธ๋“ค ๊ธฐ๋ฐ˜ ์ œ๊ฑฐ ๋กœ์ง ๊ตฌํ˜„

// ์ œ๊ฑฐ๋œ ํ•ธ๋“ค์ด ํ˜„์žฌ ์ถ”์  ์ค‘์ธ ํ•ธ๋“ค๊ณผ ๊ฐ™์„ ๋•Œ๋งŒ UI์—์„œ ์ œ๊ฑฐ
if (*TrackedHandle == RemovedEffect.Handle) {
    RemoveEffect(EffectTag);  // UI์—์„œ ์ œ๊ฑฐ
}

ํ•ต์‹ฌ ํ•™์Šต ๋‚ด์šฉ

1. GameplayEffect์˜ Stacking Policy

  • Stack Policy: None (๊ธฐ๋ณธ) โ†’ ์žฌ์ ์šฉ ์‹œ ๊ธฐ์กด ๊ฒƒ ์ œ๊ฑฐ ํ›„ ์ƒˆ ๊ฒƒ ์ถ”๊ฐ€
  • Stack Policy: Aggregate โ†’ ์žฌ์ ์šฉ ์‹œ ๊ธฐ์กด ๊ฒƒ ๊ฐฑ์‹ 

2. Handle ๊ธฐ๋ฐ˜ ์ถ”์ ์˜ ์ค‘์š”์„ฑ

  • ๊ฐ™์€ ํƒœ๊ทธ๋ผ๋„ ์„œ๋กœ ๋‹ค๋ฅธ GameplayEffect ์ธ์Šคํ„ด์Šค๋Š” ๋‹ค๋ฅธ ํ•ธ๋“ค์„ ๊ฐ€์ง
  • UI ์ œ๊ฑฐ ํŒ๋‹จ ์‹œ ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ํ•ธ๋“ค๋กœ ๋น„๊ตํ•ด์•ผ ์ •ํ™•ํ•จ

3. ์‹ค์‹œ๊ฐ„ ๋™๊ธฐํ™” ํŒจํ„ด

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜: ์ดํŽ™ํŠธ ์ถ”๊ฐ€/์ œ๊ฑฐ ์‹œ ์ฆ‰์‹œ ๋ฐ˜์‘
  • ํด๋ง ๊ธฐ๋ฐ˜: ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹ค์ œ ์ƒํƒœ์™€ UI ๋™๊ธฐํ™”
  • ๋‘ ๋ฐฉ์‹์„ ์กฐํ•ฉํ•˜์—ฌ ์•ˆ์ •์ ์ด๊ณ  ์ •ํ™•ํ•œ UI ๊ตฌํ˜„

๊ฒฐ๊ณผ

  • ์ค‘๋ณต ์ดํŽ™ํŠธ ์ ์šฉ ์‹œ์—๋„ UI๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์‹œ๊ฐ„๋งŒ ๊ฐฑ์‹ ๋จ
  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ •ํ™•ํ•œ ๋‚จ์€ ์‹œ๊ฐ„ ํ‘œ์‹œ
  • ์ตœ๋Œ€ ์Šฌ๋กฏ ์ˆ˜ ์ œํ•œ์œผ๋กœ UI ๊ณต๊ฐ„ ํšจ์œจ์„ฑ ํ™•๋ณด
  • ๋ฒ„ํ”„/๋””๋ฒ„ํ”„ ์‹œ๊ฐ์  ๊ตฌ๋ถ„์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ํ–ฅ์ƒ

๐Ÿ’ก ๋А๋‚€ ์  (What I Felt)

์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ "๊ฐฑ์‹ ์ด ์•ˆ๋œ๋‹ค"๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ์–ธ๋ฆฌ์–ผ ์—”์ง„์˜ GameplayEffect ๋™์ž‘ ๋ฐฉ์‹(์ œ๊ฑฐโ†’์ถ”๊ฐ€)์„ ์ดํ•ดํ•ด์•ผ ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค. ํ‘œ๋ฉด์  ์ฆ์ƒ์ด ์•„๋‹Œ ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๋ฐฐ์› ๋‹ค.
ํƒœ๊ทธ๋งŒ์œผ๋กœ ํŒ๋‹จํ•˜๋ฉด ๊ฐ™์€ ์ข…๋ฅ˜์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ฐ ๊ฐ์ฒด์˜ ๊ณ ์œ ํ•œ ํ•ธ๋“ค์ด๋‚˜ ID๋ฅผ ํ†ตํ•ด ์ •ํ™•ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋‹ค.


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