ํฌ์ŠคํŠธ

๐Ÿซ WitchMendokusai DevLog 00

๐ŸŽฒ _


์˜ค๋Š˜๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ผ์ง€๋ฅผ ์“ฐ๊ธฐ๋กœ ๋งˆ์Œ๋จน์—ˆ๋‹ค.
๋‚ด ์ƒ๊ฐ์ด๋‚˜ ๊ฐœ๋ฐœ ๊ณผ์ •๋ณด๋‹ค๋Š” ์ƒ๊ฐ ์ •๋ฆฌ, ์ž๋ฃŒ ์ •๋ฆฌ์— ์ง‘์ค‘ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์˜ค๋Š˜์€ ํ€˜์ŠคํŠธ ์‹œ์Šคํ…œ์„ ๊ธฐํš ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

๐ŸŽฒ ํ€˜์ŠคํŠธ ์‹œ์Šคํ…œ ๊ธฐํš



๐Ÿ‘พ Ref 1 : ์ฟ ํ‚ค๋Ÿฐ ํ‚น๋ค - ๊ณฐ์ ค๋ฆฌ ์—ด์ฐจ

์ฟ ํ‚ค๋Ÿฐ ํ‚น๋ค์—๋Š” ๊ณฐ์ ค๋ฆฌ ์—ด์ฐจ๋ผ๋Š” ๊ฑด๋ฌผ์ด ์žˆ๋‹ค.
๊ณฐ์ ค๋ฆฌ ์—ด์ฐจ๋Š” ์•„๋ž˜ ๊ธฐ๋Šฅ์„ ํ•œ๋‹ค.

  1. ์ผ์ •์‹œ๊ฐ„๋งˆ๋‹ค ์—ด์ฐจ๊ฐ€ ์—ญ์— ๋“ค์–ด์˜จ๋‹ค.
  2. ์—ด์ฐจ๋งˆ๋‹ค ์„œ๋กœ๋‹ค๋ฅธ ์•„์ดํ…œ์„ ์š”๊ตฌํ•œ๋‹ค.
  3. ์—ด์ฐจ์— ์•„์ดํ…œ์„ ๋‚ฉํ’ˆํ•˜๋ฉด, ์—ด์ฐจ๊ฐ€ ์—ญ์„ ๋– ๋‚œ๋‹ค.
  4. ๋– ๋‚œ ์—ด์ฐจ๋Š” ๋žœ๋คํ•œ ๋ณด์ƒ์„ ๊ฐ€์ง€๊ณ  ๋Œ์•„์˜จ๋‹ค.
  5. ๋ฐ˜๋ณต

๋‚ฉํ’ˆ์˜ ๋‚œ์ด๋„๊ฐ€ ์–ด๋ ค์šธ์ˆ˜๋ก ๋” ์ข‹์€ ๋ณด์ƒ์„ ์ค€๋‹ค.
์ปจํ…์ธ ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด ์—ด์ฐจ์˜ ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚œ๋‹ค.

๐Ÿ‘พ Ref 2 : ์‹œ์ฆŒ ํŒจ์Šค

์ตœ๊ทผ ๋ช‡ ๋…„๊ฐ„, ์—ฌ๋Ÿฌ ๊ฒŒ์ž„์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์‹œ์Šคํ…œ์ด๋‹ค.

์‹œ๊ฐ„์„ ํŠน์ • ์ฃผ๊ธฐ๋ฅผ ๋‚˜๋ˆ  ์‹œ์ฆŒ์œผ๋กœ ๊ตฌ๋ถ„์‹œํ‚ค๊ณ , ์•„๋ž˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  1. ํ€˜์ŠคํŠธ๋ฅผ ์ค€๋‹ค.
  2. ํ€˜์ŠคํŠธ๋ฅผ ์™„๋ฃŒํ•˜๋ฉด ํฌ์ธํŠธ๋ฅผ ์ค€๋‹ค.
  3. ํฌ์ธํŠธ๋ฅผ ์ผ์ •๋Ÿ‰ ๋ชจ์œผ๋ฉด ๋ ˆ๋ฒจ์ด ๋Š˜์–ด๋‚œ๋‹ค.
  4. ๋ ˆ๋ฒจ๋งˆ๋‹ค ๋ณด์ƒ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์žฌํ™”๋ฅผ ์ฃผ๊ณ  ํ‹ฐ์ผ“์„ ๊ตฌ๋งคํ•˜๋ฉด, ๋ ˆ๋ฒจ๋งˆ๋‹ค ์ถ”๊ฐ€์ ์ธ ๋ณด์ƒ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.
ํ€˜์ŠคํŠธ๋Š” ์ผ์ผ, ์ฃผ๊ฐ„, ๋žœ๋ค ๋“ฑ ๋‹ค์–‘ํ•˜๊ฒŒ ์ฃผ์–ด์ง„๋‹ค.

๐Ÿ‘พ Ref 3

ํŠน์ • ์Šคํ† ๋ฆฌ๋‚˜ ์ฃผ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์ญ‰ ์ด์–ด์ง€๋Š” ํ€˜์ŠคํŠธ (Like RPG, ์•„์ด๋Ÿฌ๋ธŒ์ปคํ”ผ)
์ผํ€˜, ์ฃผ๊ฐ„ํ€˜ (Like RPG, ์›์‹ )

๐Ÿ‘พ ์Šค๊นŒ๋ณด์ž

  • ์˜๋ขฐ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉด ๋ณด์ƒ๊ณผ ์˜๋ขฐ ๊ฒฝํ—˜์น˜๋ฅผ ๋ฐ›์Œ
  • ์˜๋ขฐ ๊ฒฝํ—˜์น˜๋ฅผ ๋ชจ์•„ ์˜๋ขฐ ๋ ˆ๋ฒจ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์Œ
  • ์˜๋ขฐ ๋ ˆ๋ฒจ์ด ๋†’์•„์งˆ์ˆ˜๋ก, ๋†’์€ ๋“ฑ๊ธ‰์˜ ์˜๋ขฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ์˜๋ขฐ๊ฐ€ ํ•ด๊ธˆ๋จ

์˜๋ขฐ ๋ ˆ๋ฒจ์„ ์ž„์˜๋กœ ์กฐ์ •ํ•˜์—ฌ, ์›ํ•˜๋Š” ์˜๋ขฐ๋ฅผ ์ง‘์ค‘ํ•˜์—ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก

  • ์˜๋ขฐ ์ข…๋ฅ˜
    • ๋‹จ์ˆœ ์˜๋ขฐ : ์ „๋‹ฌ, ๋Œ€ํ™”, ํ˜ธ์œ„, ์•„์ดํ…œ ์š”์ฒญ, ๋˜์ „ ํด๋ฆฌ์–ด, ๋ชน ์ฒ˜์น˜, ์ƒํ˜ธ์ž‘์šฉ
    • ์Šคํ† ๋ฆฌ ์˜๋ขฐ (๋ฉ”์ธ, ์„œ๋ธŒ, ํ™•์žฅํŒฉ) : ์Šคํ† ๋ฆฌ, ๋Œ€ํ™”, ์ปท์”ฌ + ๋‹จ์ˆœ ์˜๋ขฐ

๐ŸŽฒ ์ผ๋‹จ ๋งŒ๋“ค์–ด๋ณด์ž


์ฟ ํ‚ค๋Ÿฐ ํ‚น๋ค์˜ ๊ณฐ์ ค๋ฆฌ ์—ด์ฐจ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์ž.

๊ทผ๋ฐ ๋งˆ๋…€์˜ ์ง‘์—๋Š” ์—ด์ฐจ๊ฐ€ ์—†๋‹ค.

์ฃผ๋ณ€ ๋งˆ์„์— ์žˆ๋Š” ์˜๋ขฐ ๊ฒŒ์‹œํŒ์—์„œ ์˜๋ขฐ๋ฅผ ์ฐพ์•„์˜ค๊ธฐ๋กœ ํ•˜์ž.
์˜๋ขฐ๋ฅผ ์ฐพ์•„์˜ค๊ณ , ์•„์ดํ…œ์„ ์ „๋‹ฌํ•˜๋Š” ์ผ์€ ๋ชจ๋‘ ์ธํ˜•์ด ๋Œ€์‹  ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.

์ธํ˜•์€ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ์ง€๋งŒ,
๋™์‹œ์— ํด๋ž˜์‹œ์˜ค๋ธŒํด๋žœ์˜ ์žฅ์ธ๊ณผ ๊ฐ™์€ ์—ญํ• ๋„ ํ•ด์ค„ ๊ฒƒ์ด๋‹ค.
๋ถ„์žฌ ๊ฒŒ์ž„์—์„œ ๋งŽ์ด ๋ณธ ๊ฒƒ ๊ฐ™์€ ์‹œ์Šคํ…œ์ด๋‹ค.

์–ด์จŒ๋“ ,
๊ฑฐ๋Š๋ฆฌ๊ณ  ์žˆ๋Š” ์ธํ˜•์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ๊ณผ UI๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
์ด๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์ž.

๐ŸŽฒ ์ธํ˜• ๊ด€๋ฆฌ


๊ธฐ์กด ์ธํ˜• ๊ด€๋ฆฌ UI

์‚ฌ์‹ค ์ธํ˜• ๊ด€๋ฆฌ UI๋Š” ์ด๋ฏธ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ ๋˜์ „์— ๋“ค์–ด๊ฐˆ ์ธํ˜•์„ ์„ ํƒํ•˜๋Š” ๊ธฐ๋Šฅ, ์ธํ˜•์˜ ์žฅ๋น„๋ฅผ ์„ ํƒํ•˜๋Š” ๊ธฐ๋Šฅ๋งŒ ์žˆ๋Š” ์ƒํƒœ๋‹ค.

์—ฌ๊ธฐ์„œ ๋” ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜•์˜ ์ˆ˜๋ฅผ ํ‘œ์‹œ
  • ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜• Slot ๋‚˜์—ด

๊ฐ‘์ž๊ธฐ ์ƒ๊ฐ๋‚ฌ๋Š”๋ฐ,

ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์ผ์€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ˜•์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
๋”๋ฏธ ์ธํ˜•์ด๋ผ๊ณ  ๋ถ€๋ฅด๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

์ถ”ํ›„ ์ด๋Ÿฐ ๋”๋ฏธ ์ธํ˜•์— ํ˜ผ์„ ์ง‘์–ด๋„ฃ์–ด์„œ,
ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ๋กœ ์ง„ํ™”์‹œํ‚ค๋Š” ์‹์œผ๋กœ ๋งŒ๋“ค๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

  • ๋”๋ฏธ ์ธํ˜•

๐Ÿ‘พ ๋”๋ฏธ ์ธํ˜•

1
2
3
4
5
public class GameData
{
	// ~
	public int dummyDollCount = 1;
}

๊ธฐ์กด ์ธํ˜• ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, ๋”๋ฏธ ์ธํ˜•๋„ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

์ด๋•Œ, ๋”๋ฏธ ์ธํ˜•์€ ๋ชจ๋‘ ๋˜‘๊ฐ™์€ ๋ชจ์Šต์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ฐœ์„ฑ์„ ์ฃผ์ง€ ์•Š์„ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—,
๊ธฐ์กด ์ธํ˜•์ฒ˜๋Ÿผ ์ธํ˜•์ด ์ฐฉ์šฉํ•˜๊ณ  ์žˆ๋Š” ์žฅ๋น„ ๊ฐ™์€ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ GameDataํด๋ž˜์Šค์— dummyDollCount๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ–ˆ๋‹ค.

๋ชจ๋“  ์ธํ˜•์„ ์‹ค์ฒดํ™”์‹œ์ผœ ๋งต์— ๋Œ์•„๋‹ค๋‹ˆ๊ฒŒ ํ•˜๊ณ  ์‹ถ๊ธด ํ•œ๋ฐ, ๋‹น์žฅ ํ•„์š”ํ•˜์ง„ ์•Š์•„์„œ ํŒจ์Šค.

๐Ÿ‘พ ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜• ํ‘œ์‹œ

๊ฑฐ๋Š๋ฆฌ๊ณ  ์žˆ๋Š” ์ธํ˜•์€ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œํ• ๊นŒ?

๋ชจ๋“  ์ธํ˜• ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ธ๋ฒคํ† ๋ฆฌ ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค๊ณ ,
๊ฑฐ๋Š๋ฆฌ๊ณ  ์žˆ๋Š” ์ธํ˜•๋งŒ ํ™œ์„ฑํ™”์‹œํ‚ค๊ธฐ๋กœ ํ•˜์ž.

์ƒˆ๋กœ UIDollBuffer : UIDataBuffer<Doll> ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
UIDataBuffer<T>๋Š” ํŠน์ • ์ปจํ…Œ์ด๋„ˆ์— ์žˆ๋Š” ์š”์†Œ๋“ค์„ UISlot์— ํ• ๋‹น์‹œ์ผœ ๋ณด์—ฌ์ฃผ๋Š”, ๋‚ด๊ฐ€ ๋งŒ๋“  ํด๋ž˜์Šค๋‹ค.
์ด๋ฅผ ์ƒ์† ๋ฐ›๊ณ , ๋”๋ฏธ ์ธํ˜•๊ณผ ํ•จ๊ป˜ ๊ฑฐ๋Š๋ฆฌ๊ณ  ์žˆ๋Š” ์ธํ˜•๋งŒ ํ‘œ์‹œํ•˜๋„๋ก Overrideํ–ˆ๋‹ค.

์œ„ ์ž‘์—…์€ ๊ธˆ๋ฐฉ ๋๋‚ฌ๋Š”๋ฐ,
๊ธฐ์กด ์ธํ˜• ๊ด€๋ฆฌ UI์— ์žˆ๋˜ ๊ธฐ๋Šฅ๋“ค์„ ์˜ฎ๊ธฐ๊ณ  ์ˆ˜์ •ํ•˜๋Š๋ผ ์‹œ๊ฐ„์„ ์ข€ ๋จน์—ˆ๋‹ค.

๊ธฐ์กด์—๋Š” ๋˜์ „์— ๋“ค์–ด๊ฐˆ ์ธํ˜• ์ •๋ณด ํ•˜๋‚˜๋งŒ UI๋กœ ๋ณด์—ฌ์คฌ๋‹ค.
๊ทธ๋ž˜์„œ Prev/Next ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด selectedDollIndex ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , dollDic[selectedDollIndex]๋กœ ์ธํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ UI๋ฅผ ๊ฐฑ์‹ ํ–ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์ธํ˜•์„ ๋ฆฌ์ŠคํŠธ๋กœ ๋‚˜์—ดํ•˜๊ฒŒ ๋˜๋ฉด์„œ, ๋˜์ „์— ๋“ค์–ด๊ฐˆ ์ธํ˜•์ด ์•„๋‹Œ ๋‹ค๋ฅธ ์ธํ˜•์˜ ์ •๋ณด๋„ UI์— ๋„์šธ ์ˆ˜ ์žˆ์–ด์•ผ ํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ UI์—์„œ ๋งˆ์ง€๋ง‰์œผ๋กœ ์„ ํƒํ•œ ์ธํ˜•์˜ Index๋ฅผ ๊ธฐ์ค€์œผ๋กœ UI๋ฅผ ๋„์šฐ๊ณ , ํ‘œ์‹œ๋œ ์ธํ˜•์„ ๋˜์ „์— ๋“ค์–ด๊ฐˆ ์ธํ˜•์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ„ํŠผ์„ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ๋‹ค.

์ƒˆ ์ธํ˜• ๊ด€๋ฆฌ UI 0
์ƒˆ ์ธํ˜• ๊ด€๋ฆฌ UI 1

UI๋Š” ์ถ”ํ›„ ๋” ๊พธ๋ฉฐ๋ณด๊ธฐ๋กœ.

๐Ÿ‘พ ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜• ์ˆ˜ ํ‘œ์‹œ๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ

ํด๋ž˜์‹œ์˜ค๋ธŒํด๋žœ ์žฅ์ธ์ฒ˜๋Ÿผ, ์—ฌ๊ธฐ์„œ๋„ ๊ฑฐ๋Š๋ฆฌ๊ณ  ์žˆ๋Š” ์ธํ˜• ์ˆ˜๋ฅผ ํ‘œ์‹œํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.
๋ชฉ์ ์€ ํ˜„์žฌ ์ผ์„ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ธํ˜• ์ˆ˜๊ฐ€ ์–ผ๋งˆ๋‚˜ ์žˆ๊ณ , ์ผ์„ ํ•˜๊ณ  ์ธํ˜• ์ˆ˜๋Š” ์–ผ๋งˆ๋‚˜ ์žˆ๋Š”์ง€ ์•Œ๋ ค์ฃผ๋Š” ๊ฒƒ.

์—ฌ๊ธฐ์„œ ์ข€ ๊ณ ๋ฏผ์Šค๋Ÿฌ์›Œ์ง€๋Š”๊ฒŒ ์žˆ๋‹ค.
์–ด๋–ค ์ธํ˜•์ด ์–ด๋–ค ์ผ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ, ์š”๊ฑด ์–ด๋–ป๊ฒŒ ์ €์žฅํ• ๊นŒ?

๋”๋ฏธ์ธํ˜•๋งŒ ์ผ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์ผ ์ •๋ณด๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•˜๋ฉด ๋œ๋‹ค.
๋”๋ฏธ์ธํ˜•์˜ ๋ชจ์Šต์€ ๋ชจ๋‘ ๋˜‘๊ฐ™๊ธฐ ๋•Œ๋ฌธ์—, ์ผ ์ •๋ณด์™€ ๋”๋ฏธ์ธํ˜•์„ ๋‹จ์ˆœํžˆ ์ธ๋ฑ์Šค ์ˆœ์„œ๋Œ€๋กœ ๋งค์นญ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

ํ•˜์ง€๋งŒ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ๋„ ์ผํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค.
ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ๊ฐ€ ์ผ์„ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค๋ฉด, ์ผ ์ •๋ณด์™€ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ์˜ ์ •๋ณด๋ฅผ ๋งค์นญ์‹œ์ผœ์„œ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค.
๋˜‘๊ฐ™์€ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ธฐ ๊ฐ€์งˆ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—, ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ์˜ ID์™€ ์ผ ์ •๋ณด๋ฅผ ๋งค์นญ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

๋‘˜ ๋‹ค ์ผ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด..
์ƒ๊ฐํ•ด๋ณด๋‹ˆ ๊ทธ๋ƒฅ ๋”๋ฏธ์ธํ˜• ๋”ฐ๋กœ, ํ”Œ๋ ˆ์ด์–ด๋ธ” ์บ๋ฆญํ„ฐ ๋”ฐ๋กœ ์ €์žฅํ•˜๋ฉด ๋˜๋„ค !

๐Ÿ‘พ ์ผ ์ •๋ณด ์ €์žฅ

์ผ ์ •๋ณด๋ฅผ ๋จผ์ € ๋งŒ๋“ค์–ด๋ณด์ž.

์ผ์˜ ํŠน์ง•์€ ์•„๋ž˜์™€ ๊ฐ™์„ ๊ฒƒ์ด๋‹ค.

  • ์‹œ๊ฐ„๊ณผ ์ด๋ฒคํŠธ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ธ๊ฒŒ์ž„ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ, ์ž๋™์œผ๋กœ ์™„๋ฃŒ๋„๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.
  • ์™„๋ฃŒ๋„๊ฐ€ 100% ์ง„ํ–‰๋˜๋ฉด ์™„๋ฃŒ๋˜๋ฉฐ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.

์Œ, ์ด๋ฒคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์ €์žฅํ•˜๊ณ  ์ฒ˜๋ฆฌํ• ์ง€๊ฐ€ ๊ณ ๋ฏผ์Šค๋Ÿฝ๋‹ค.
Action ๊ฐ™์€ ๊ฑธ ์ง๋ ฌํ™” ์‹œํ‚ฌ ์ˆ˜๋Š” ์—†์„ ๊ฒƒ ๊ฐ™๊ณ , ๋‹จ์ˆœํžˆ WorkType Enum์„ ๋งŒ๋“ค์–ด์„œ ํ•˜๋“œ์ฝ”๋”ฉ ํ•ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public enum WorkType
{
	CompleteQuest
}

public class Work
{
	public WorkType workType;
	public int value;

	public float time;
	public float curTime = 0;

	public Work(WorkType workType, int value, float time)
	{
		this.workType = workType;
		this.value = value;
		this.time = time;
	}

	public void Tick(float tick)
	{
		curTime += tick;

		if (IsCompleted)
		{
			curTime = time;
		}
	}

	public bool IsCompleted => curTime >= time;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public void TickWorks()
{
	foreach (KeyValuePair<int, List<Work>> work in Works)
	{
		for (int i = work.Value.Count - 1; i >= 0; i--)
		{
			work.Value[i].Tick(TimeManager.Tick);
			if (work.Value[i].IsCompleted)
			{
				switch (work.Value[i].workType)
				{
					case WorkType.CompleteQuest:
						SOManager.Instance.QuestDataBuffer.RuntimeItems[work.Value[i].value].Complete();
						break;
					default:
						throw new ArgumentOutOfRangeException();
				}
				work.Value.RemoveAt(i);
			}
		}
	}
}

์ฝ”๋“œ๊ฐ€ ์ด์˜์ง„ ์•Š๋‹ค.
ํ•˜๋“œ์ฝ”๋”ฉํ•œ ์ผ ์ด๋ฒคํŠธ๋ฅผ ๋”ฐ๋กœ ํ•จ์ˆ˜๋กœ ๋นผ๋ฉด ์ข€ ๊ดœ์ฐฎ์•„์งˆ ๊ฒƒ ๊ฐ™๋‹ค.
Work๋ฅผ Struct์œผ๋กœ ๋งŒ๋“ค๋ฉด TickWorks์—์„œ ๊ฐ Work๋ฅผ Tick์‹œํ‚ค๋Š” ๋ถ€๋ถ„ ๋•Œ๋ฌธ์— ๋” ์ง€์ €๋ถ„ํ•ด์ ธ์„œ, Class๋กœ ๋งŒ๋“ค์—ˆ๋‹ค.

Dictionary<int, List<Work>>๋กœ ์ผ๋“ค์„ ๊ด€๋ฆฌํ•œ๋‹ค.
Key๊ฐ’์œผ๋กœ ์ธํ˜•์˜ ID๋ฅผ, Value๊ฐ’์œผ๋กœ ํ•ด๋‹น ์ธํ˜•์˜ ์ผ ์ •๋ณด๋ฅผ ์ €์žฅํ•œ๋‹ค.

works๋ฅผ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์ธํ˜• ์šฉ Dictionary<int, Work>, ๋”๋ฏธ ์ธํ˜• ์šฉList<Work>๋กœ ๊ตฌ๋ถ„์‹œํ‚ฌ๊นŒํ•˜๋‹ค๊ฐ€, ๋ฐ์ดํ„ฐ ์ €์žฅ/๋ถˆ๋Ÿฌ์˜ค๊ธฐ๊ฐ€ ๋ณต์žกํ•ด์งˆ ๊ฒƒ ๊ฐ™์•„์„œ Dictionary ํ•˜๋‚˜๋กœ ํ†ต์ผ์‹œ์ผฐ๋‹ค.

๊ทธ๋ž˜์„œ ์ธํ˜•์ด ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ผ์„ ํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ์ผ ์ •๋ณด๋ฅผ List๋กœ ์ €์žฅํ•œ๋‹ค.
๋˜‘๊ฐ™์€ ID๋ฅผ ๊ฐ€์ง€๋Š” ๋”๋ฏธ์ธํ˜•์˜ ์ผ์„ ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

AddWork ๊ฐ™์€ ํ•จ์ˆ˜์—์„œ ํ”Œ๋ ˆ์ด์–ด๋ธ” ์ธํ˜•์€ ์ผ์„ ํ•˜๋‚˜๋งŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ„๊ฐœ์˜ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๊ธด ํ•˜์ง€๋งŒ,
๊ทธ๊ฑด ํ”Œ๋ ˆ์ด์–ด๋ธ” ์ธํ˜•๊ณผ ๋”๋ฏธ ์ธํ˜• ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋ถ„๋ฆฌ์‹œ์ผœ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋ผ ๋…ผ์™ธ๋กœ ๋‘”๋‹ค.


๐Ÿ‘พ ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜• ์ˆ˜ ํ‘œ์‹œ

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๊ฑฐ๋Š๋ฆฌ๋Š” ์ธํ˜• ์ˆ˜๋ฅผ ํ‘œ์‹œํ•ด๋ณด์ž.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private IEnumerator UpdateUI()
{
	WaitForSeconds wait = new(.1f);
	while (true)
	{
		int workableDollCount = SOManager.Instance.Dolls.RuntimeItems.Count;
		foreach (Doll doll in SOManager.Instance.Dolls.RuntimeItems)
		{
			if (doll.ID == Doll.DUMMY_ID)
				continue;

			if (workManager.DoseDollHaveWork(doll.ID))
				workableDollCount--;
		}

		if (workManager.Works.ContainsKey(Doll.DUMMY_ID))
			workableDollCount -= workManager.Works[Doll.DUMMY_ID].Count;

		text.text = $"{workableDollCount}/{SOManager.Instance.Dolls.RuntimeItems.Count} ์ธํ˜•";
		yield return wait;
	}
}

ํ…Œ์ŠคํŠธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค๊ณ  ํ…Œ์ŠคํŠธ ํ•ด๋ณด์ž.
์•„๋ž˜๋Š” ๋”๋ฏธ์ธํ˜•์ด 10์ดˆ์˜ ์ผ์„ ํ•˜๋„๋ก ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ฝ”๋“œ๋‹ค.

1
2
3
4
5
[ContextMenu(nameof(TestWork))]
public void TestWork()
{
	WorkManager.AddWork(Doll.DUMMY_ID, new Work(WorkType.CompleteQuest, 0, 10));
}

์ž˜ ์ž‘๋™ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ ์ €์žฅ/๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋„ ์ž˜ ๋™์ž‘ํ•œ๋‹ค.
์ผ๋ฐ˜์ ์ธ SNG ๋ฅ˜์˜ ๊ฒŒ์ž„์€ ์˜คํ”„๋ผ์ธ์—๋„ ์‹œ๊ฐ„์ด ํ๋ฅด์ง€๋งŒ, ์ด ๊ฒŒ์ž„์—์„œ๋Š” Cult of the Lamb ์ฒ˜๋Ÿผ ๊ฒŒ์ž„์— ์ ‘์†ํ•ด ์žˆ์„ ๋•Œ๋งŒ ์‹œ๊ฐ„์ด ํ๋ฅด๊ฒŒ ํ•  ๊ฒƒ์ด๋‹ค.

๐ŸŽฒ ๋งˆ์„ ์˜๋ขฐ


์ด์ œ ๋งˆ์„ ์˜๋ขฐ๋ฅผ ๋งŒ๋“ ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ๋งˆ์„ ์˜๋ขฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์€ ์–ด์ƒ‰ํ•  ๊ฒƒ์ด๋‹ค.
์ฃผ๋ณ€ ๋งˆ์„์—์„œ ์˜จ NPC๋ฅผ ๋งŒ๋“ค๊ณ , ๋งˆ์„ ์˜๋ขฐ๋ฅผ ํ•˜๋‚˜ ๋ฐ›๋„๋ก ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

๐Ÿ‘พ NPC๋กœ๋ถ€ํ„ฐ ํ€˜์ŠคํŠธ ๋ฐ›๊ธฐ

NPC๊ฐ€ ํ€˜์ŠคํŠธ๋ฅผ ์ฃผ๊ธฐ ์œ„ํ•ด์„œ๋Š”, ์–ด๋–ค ํ€˜์ŠคํŠธ๋ฅผ ์ค„์ง€ ์•Œ๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค.

NPC ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ์— List<Quest>๋ฅผ ์ƒˆ๋กœ ์ถ”๊ฐ€ํ•˜๊ณ ,
NPC UI๋ฅผ ๊ฐฑ์‹ ํ•  ๋•Œ, NPC๊ฐ€ ํ€˜์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ์„ ํƒ์ง€๋กœ ๋ณด์—ฌ์ค€๋‹ค.

ํ€˜์ŠคํŠธ ์„ ํƒ์ง€๋ฅผ ์„ ํƒํ–ˆ์„ ๋•Œ,

๋งŒ์•ฝ ํ€˜์ŠคํŠธ๋ฅผ ๋ฐ›์ง€ ์•Š์€ ์ƒํƒœ๋ผ๋ฉด ๋ฐ›๊ณ ,
๋งŒ์•ฝ ํ€˜์ŠคํŠธ๋ฅผ ๋ฐ›์•˜์ง€๋งŒ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•œ ์ƒํƒœ๋ผ๋ฉด ๋ฌด์‹œ,
๋งŒ์•ฝ ํ€˜์ŠคํŠธ๋ฅผ ๋ฐ›๊ณ  ์™„๋ฃŒํ•œ ์ƒํƒœ๋ผ๋ฉด ๋ณด์ƒ์„ ๋ฐ›๋„๋ก ํ•œ๋‹ค.

์ด๋Ÿฐ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ํ€˜์ŠคํŠธ ์Šคํฌ๋ฆฝํ„ฐ๋ธ” ์˜ค๋ธŒ์ ํŠธ์— QuestType์„ ์ถ”๊ฐ€ํ•œ๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void SelectQuest(int index)
{
	Quest quest = curNPCData.Quests[index];

	switch (quest.QuestState)
	{
		case QuestState.Locked:
			quest.Unlock();
			break;
		case QuestState.Unlocked:
			// ๋Œ€ํ™”
			break;
		case QuestState.Completed:
			// ๋ณด์ƒ
			break;
		default:
			throw new ArgumentOutOfRangeException();
	}

	UIManager.Instance.SetOverlay(MPanelType.None);
}

๋‹ค๋งŒ, ๋งˆ์„ ์˜๋ขฐ๋Š” ๊ธฐํš ์ƒ NPC์—๊ฒŒ ์ง์ ‘ ๋ณด์ƒ์„ ๋ฐ›๋Š” ๋ฐฉ์‹์ด ์•„๋‹ˆ๋‹ค.
๋•Œ๋ฌธ์— case QuestState.Completed ๋ธ”๋Ÿญ์•ˆ์— ์ถ”๊ฐ€์ ์ธ ์กฐ๊ฑด์„ ๋‹ฌ์•„์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

1
2
3
4
5
public enum QuestType
{
	Normal,
	VillageQuest
}
1
2
3
4
5
6
case QuestState.Completed:
	if (quest.QuestType != QuestType.VillageQuest)
	{
		// ๋ณด์ƒ
	}
	break;

์•„์ง ๋ชจ๋“  case๊ฐ€ ๋‚ด๋ถ€ ๊ตฌํ˜„์€ ์•ˆ๋์ง€๋งŒ, ์ „์ฒด์ ์ธ ํ๋ฆ„์€ ๋งŒ๋“ค์–ด์กŒ๋‹ค.
์ถ”ํ›„, ๊ฐœ์„ ๋œ ๋Œ€ํ™” ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค๋ฉด์„œ ํ•จ๊ป˜ ๊ฐœ์„ ์‹œํ‚ฌ ๊ฒƒ.

ํ€˜์ŠคํŠธ๊ฐ€ ์ž˜ ๋ฐ›์•„์ง€๋Š” ๊ฑธ ํ™•์ธํ–ˆ์œผ๋‹ˆ, ์ด์ œ ์˜๋ขฐ UI์—์„œ ๋งˆ์„ ์˜๋ขฐ๋ฅผ ์™„๋ฃŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค์–ด๋ณด์ž.

๐Ÿ‘พ ๋งˆ์„ ์˜๋ขฐ ์™„๋ฃŒํ•˜๊ธฐ

To Be Continued..


๐Ÿ‘พ Memo

๋ฉ”์ดํ”Œ์Šคํ† ๋ฆฌ NPC์ฒ˜๋Ÿผ, ํ€˜์ŠคํŠธ ์ƒํ™ฉ์„ ๋จธ๋ฆฌ ์œ„ ์•„์ด์ฝ˜์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

์ด ๊ธฐ์‚ฌ๋Š” ์ €์ž‘๊ถŒ์ž์˜ CC BY 4.0 ๋ผ์ด์„ผ์Šค๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.