[TIL] 251111

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

โœ๏ธToday I Learned

๐Ÿ“… 2025-11-11

  • ์ธ๋ฒคํ† ๋ฆฌ ์Šฌ๋กฏ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ์•„์ดํ…œ ์ธ์Šคํ„ด์Šค ํ†ตํ•ฉ

  • ๋ถ€ํŒจ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๋ฐ ์ž๋™ ๋ณ€ํ™˜)

  • ์†Œ๋น„ ์•„์ดํ…œ ์‚ฌ์šฉ ์‹œ GAS ์–ด๋นŒ๋ฆฌํ‹ฐ ์ž๋™ ํ™œ์„ฑํ™”

  • ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋กœ์ง ํ†ตํ•ฉ์œผ๋กœ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ


์ธ๋ฒคํ† ๋ฆฌ ์Šฌ๋กฏ ๊ตฌ์กฐ ๊ฐœ์„  ๋ฐ ์•„์ดํ…œ ์ธ์Šคํ„ด์Šค ํ†ตํ•ฉ

FSlotStructMaster ๊ตฌ์กฐ์ฒด๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ๋ฅผ ๋‹จ์ˆœํ™”ํ–ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ:

  • FItemInstance ํƒ€์ž…์˜ ItemData ํ•„๋“œ ์ถ”๊ฐ€ํ•˜์—ฌ ์ •์ /๋™์  ๋ฐ์ดํ„ฐ๋ฅผ ํ†ตํ•ฉ ๊ด€๋ฆฌ
  • ExpirationTime ํ•„๋“œ ์ถ”๊ฐ€ํ•˜์—ฌ ์•„์ดํ…œ ๋ถ€ํŒจ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์ถ”์ 
  • ๊ธฐ์กด StaticDataID, DynamicDataID ํ•„๋“œ ์ œ๊ฑฐ๋กœ ๊ตฌ์กฐ ๋‹จ์ˆœํ™”

์ด์ „์—๋Š” ์ •์  ID์™€ ๋™์  ID๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ–ˆ์ง€๋งŒ, FItemInstance ํ•˜๋‚˜๋กœ ์•„์ดํ…œ ์ •๋ณด๋ฅผ ์บก์Аํ™”ํ•˜์—ฌ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๊ฐœ์„ ํ–ˆ๋‹ค.


๋ถ€ํŒจ ์‹œ์Šคํ…œ ๊ตฌํ˜„ (๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๋ฐ ์ž๋™ ๋ณ€ํ™˜)

์•„์ดํ…œ์ด ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด ๋ถ€ํŒจํ•˜๋Š” ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ตฌํ˜„ ๋‚ด์šฉ:
1. OnDecayTick(): ์ฃผ๊ธฐ์ ์œผ๋กœ ํ˜ธ์ถœ๋˜์–ด ๋งŒ๋ฃŒ๋œ ์•„์ดํ…œ์„ ์ฒดํฌ
2. ConvertToDecayedItem(): ๋งŒ๋ฃŒ๋œ ์•„์ดํ…œ์„ ๋ถ€ํŒจ ์•„์ดํ…œ(ID: 0)์œผ๋กœ ๋ณ€ํ™˜
3. UpdateExpirationTime(): ์Šคํƒ ์ถ”๊ฐ€ ์‹œ ๊ฐ€์ค‘ํ‰๊ท ์œผ๋กœ ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ์žฌ๊ณ„์‚ฐ

// ์ƒˆ ์•„์ดํ…œ๊ณผ ๊ธฐ์กด ์•„์ดํ…œ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ€์ค‘ํ‰๊ท ์œผ๋กœ ๊ณ„์‚ฐ
double UpdateExpirationTime(double CurrentExpirationTime, int 
CurrentStack,
                            int NewItemStack, float DecayRate)
{
    double NewItemExpirationTime = GetWorld()->GetTimeSeconds() + 
DecayRate;
    return (CurrentExpirationTime * CurrentStack + 
NewItemExpirationTime * NewItemStack) 
           / (CurrentStack + NewItemStack);
}

์•„์ดํ…œ์„ ์Šคํƒ์— ์ถ”๊ฐ€ํ•  ๋•Œ ๊ธฐ์กด ์•„์ดํ…œ์˜ ๋‚จ์€ ์‹œ๊ฐ„๊ณผ ์ƒˆ ์•„์ดํ…œ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์„ ๊ฐ€์ค‘ํ‰๊ท  ๋‚ด์–ด ๊ณต์ •ํ•˜๊ฒŒ ๊ณ„์‚ฐํ–ˆ๋‹ค.


์†Œ๋น„ ์•„์ดํ…œ ์‚ฌ์šฉ ์‹œ GAS ์–ด๋นŒ๋ฆฌํ‹ฐ ์ž๋™ ํ™œ์„ฑํ™”

์†Œ๋น„ ์•„์ดํ…œ ์‚ฌ์šฉ ์‹œ ์—ฐ๊ฒฐ๋œ Gameplay Ability๋ฅผ ์ž๋™์œผ๋กœ ํ™œ์„ฑํ™”ํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ๋‹ค.

๊ตฌํ˜„ ์ˆœ์„œ
1. Internal_UseItem()์—์„œ ์•„์ดํ…œ ๋ฐ์ดํ„ฐ ์กฐํšŒ
2. FItemData์— AbilityBP๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธ
3. ASC(AbilitySystemComponent)๋ฅผ ํ†ตํ•ด ์–ด๋นŒ๋ฆฌํ‹ฐ ๋ถ€์—ฌ ๋ฐ ์ฆ‰์‹œ ํ™œ์„ฑํ™”
4. ์•„์ดํ…œ ์Šคํƒ ๊ฐ์†Œ ์ฒ˜๋ฆฌ

  if (ItemInfo.AbilityBP)
  {
      FGameplayAbilitySpec Spec(ItemInfo.AbilityBP, 1, 0);
      ASC->GiveAbilityAndActivateOnce(Spec);
  }

์ฒด๋ ฅ ํšŒ๋ณต ๋ฌผ์•ฝ, ๋ฒ„ํ”„ ์•„์ดํ…œ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ํšจ๊ณผ๊ฐ€ ๋ฐœ๋™๋˜๋„๋ก ์—ฐ๋™ํ–ˆ๋‹ค.


๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋กœ์ง ํ†ตํ•ฉ์œผ๋กœ ์ค‘๋ณต ์ฝ”๋“œ ์ œ๊ฑฐ

์ธ๋ฒคํ† ๋ฆฌ ๋ณ€๊ฒฝ ๋ฐ ํ•ซํ‚ค ํ™œ์„ฑํ™” ์‹œ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋กœ์ง์„ ํ—ฌํผ ํ•จ์ˆ˜๋กœ ํ†ตํ•ฉํ–ˆ๋‹ค.

์ถ”๊ฐ€ํ•œ ํ•จ์ˆ˜

  • HandleInventoryChanged(): ์ธ๋ฒคํ† ๋ฆฌ ๋ณ€๊ฒฝ ์‹œ OnInventoryUpdated ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
  • HandleActiveHotkeyIndexChanged(): ํ•ซํ‚ค ๋ณ€๊ฒฝ ์‹œ OnHotkeyActivated ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฐ ์žฅ์ฐฉ/ํ•ด์ œ ์ฒ˜๋ฆฌ

๊ธฐ์กด์—๋Š” ๊ฐ RPC ํ•จ์ˆ˜์™€ OnRep_* ์ฝœ๋ฐฑ๋งˆ๋‹ค ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ–ˆ๋Š”๋ฐ, ํ—ฌํผ ํ•จ์ˆ˜๋กœ ์ถ”์ถœํ•˜์—ฌ ์ค‘๋ณต์„ ์ œ๊ฑฐํ•˜๊ณ  ์ผ๊ด€์„ฑ์„ ํ™•๋ณดํ–ˆ๋‹ค.

๋˜ํ•œ ๋ฐฉ์–ด๊ตฌ ์Šฌ๋กฏ ํƒ€์ž… ๊ฒ€์ฆ ๋กœ์ง(CanPlaceItemInSlot)์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋จธ๋ฆฌ ์Šฌ๋กฏ์—๋Š” ํ—ฌ๋ฉง๋งŒ, ๋ชธํ†ต ์Šฌ๋กฏ์—๋Š” ๊ฐ‘์˜ท๋งŒ ์žฅ์ฐฉ๋˜๋„๋ก ๊ฒ€์ฆํ–ˆ๋‹ค.


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

๋ฆฌ์Šจ์„œ๋ฒ„ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ™˜๊ฒฝ์—์„œ ์ธ๋ฒคํ† ๋ฆฌ ์‹œ์Šคํ…œ์„ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋ณต์ œ(Replication)์™€ ์„œ๋ฒ„ ๊ถŒํ•œ(Authority) ํŒจํ„ด์˜ ์ค‘์š”์„ฑ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ถ€ํŒจ ์‹œ์Šคํ…œ์— ๊ฐ€์ค‘ํ‰๊ท  ๋งŒ๋ฃŒ ์‹œ๊ฐ„ ๊ณ„์‚ฐ์„ ์ ์šฉํ–ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ƒˆ ์•„์ดํ…œ์˜ ๋งŒ๋ฃŒ ์‹œ๊ฐ„์œผ๋กœ ๋ฎ์–ด์“ฐ๋ฉด ๋ถˆ๊ณต์ •ํ•˜๊ณ , ์ตœ์†Œ๊ฐ’์„ ์“ฐ๋ฉด ๋ชจ๋“  ์•„์ดํ…œ์ด ๊ธ‰๊ฒฉํžˆ ์ฉ์–ด๋ฒ„๋ฆฌ๋Š”๋ฐ, ๊ฐ€์ค‘ํ‰๊ท ์„ ์“ฐ๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ณ  ํ˜„์‹ค์ ์ธ ๋ถ€ํŒจ๊ฐ€ ๊ฐ€๋Šฅํ–ˆ๋‹ค.

๋˜ํ•œ FItemInstance๋กœ ๊ตฌ์กฐ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๋ฉด์„œ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๊น”๋”ํ•ด์กŒ๋‹ค.
GiveAbilityAndActivateOnce()๋กœ ์–ด๋นŒ๋ฆฌํ‹ฐ๋ฅผ ์ผํšŒ์„ฑ์œผ๋กœ ์‹คํ–‰ํ•˜์—ฌ ์•„์ดํ…œ ์‚ฌ์šฉ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

๋‹ค๋งŒ ์•„์ง ๊ฑฐ๋ฆฌ ์ฒดํฌ ๊ฒ€์ฆ์ด ๋น ์ ธ ์žˆ์–ด์„œ ์•…์˜์ ์ธ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฉ€๋ฆฌ ์žˆ๋Š” ์ƒ์ž๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ๋‹ค. ์ƒํ˜ธ์ž‘์šฉ ์ปดํฌ๋„ŒํŠธ์— ๊ฑฐ๋ฆฌ ์ฒดํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ๊ฒ ๋‹ค.

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