๐
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);
}
์์ดํ ์ ์คํ์ ์ถ๊ฐํ ๋ ๊ธฐ์กด ์์ดํ ์ ๋จ์ ์๊ฐ๊ณผ ์ ์์ดํ ์ ๋ง๋ฃ ์๊ฐ์ ๊ฐ์คํ๊ท ๋ด์ด ๊ณต์ ํ๊ฒ ๊ณ์ฐํ๋ค.
์๋น ์์ดํ ์ฌ์ฉ ์ ์ฐ๊ฒฐ๋ 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)์ ์ถ๊ฐํ์ฌ ๋จธ๋ฆฌ ์ฌ๋กฏ์๋ ํฌ๋ฉง๋ง, ๋ชธํต ์ฌ๋กฏ์๋ ๊ฐ์ท๋ง ์ฅ์ฐฉ๋๋๋ก ๊ฒ์ฆํ๋ค.
๋ฆฌ์จ์๋ฒ ๋ฉํฐํ๋ ์ด ํ๊ฒฝ์์ ์ธ๋ฒคํ ๋ฆฌ ์์คํ ์ ๊ตฌํํ๋ฉด์ ๋ณต์ (Replication)์ ์๋ฒ ๊ถํ(Authority) ํจํด์ ์ค์์ฑ์ ๊น์ด ์ดํดํ๊ฒ ๋์๋ค.
๋ถํจ ์์คํ ์ ๊ฐ์คํ๊ท ๋ง๋ฃ ์๊ฐ ๊ณ์ฐ์ ์ ์ฉํ๋ค. ๋จ์ํ ์ ์์ดํ ์ ๋ง๋ฃ ์๊ฐ์ผ๋ก ๋ฎ์ด์ฐ๋ฉด ๋ถ๊ณต์ ํ๊ณ , ์ต์๊ฐ์ ์ฐ๋ฉด ๋ชจ๋ ์์ดํ ์ด ๊ธ๊ฒฉํ ์ฉ์ด๋ฒ๋ฆฌ๋๋ฐ, ๊ฐ์คํ๊ท ์ ์ฐ๋ ์์ฐ์ค๋ฝ๊ณ ํ์ค์ ์ธ ๋ถํจ๊ฐ ๊ฐ๋ฅํ๋ค.
๋ํ FItemInstance๋ก ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๋ฉด์ ์ฝ๋๊ฐ ํจ์ฌ ๊น๋ํด์ก๋ค.
GiveAbilityAndActivateOnce()๋ก ์ด๋น๋ฆฌํฐ๋ฅผ ์ผํ์ฑ์ผ๋ก ์คํํ์ฌ ์์ดํ
์ฌ์ฉ์ ๊ตฌํํ๋ค.
๋ค๋ง ์์ง ๊ฑฐ๋ฆฌ ์ฒดํฌ ๊ฒ์ฆ์ด ๋น ์ ธ ์์ด์ ์ ์์ ์ธ ํด๋ผ์ด์ธํธ๊ฐ ๋ฉ๋ฆฌ ์๋ ์์๋ฅผ ์กฐ์ํ ์ ์๋ ๋ณด์ ์ทจ์ฝ์ ์ด ์๋ค. ์ํธ์์ฉ ์ปดํฌ๋ํธ์ ๊ฑฐ๋ฆฌ ์ฒดํฌ๋ฅผ ์ถ๊ฐํด์ผ๊ฒ ๋ค.