Develop document : Event - Tiny-Metro/Poly-Metro GitHub Wiki

์ด๋ฒคํŠธ

๊ฐœ์š”

๊ฒŒ์ž„์„ ์ง„ํ–‰ํ•˜๋ฉด์„œ, ํŠน์ • ํ™•๋ฅ ์— ๋”ฐ๋ผ ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ํŠน์ • ํšจ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ

์ด๋ฒคํŠธ๋Š” ์œ ์ €์— ์˜ํ•ด ์ถ”๊ฐ€, ๋ณ€๊ฒฝ(๋ชจ๋”ฉ) ์ด ๊ฐ€๋Šฅํ•œ ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์ธ ์‚ฌํ•ญ์€ ๋‹ค์Œ ๋ฌธ์„œ๋“ค์— ๊ธฐ์ˆ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ : EventManager

Event๋Š” EventManager์™€ Event๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์ค‘, EventManager์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

Begin play

EventManager๋Š” GameMode์— ์˜ํ•ด ๊ฒŒ์ž„ ์‹œ์ž‘ ์‹œ ๋ ˆ๋ฒจ์— ์Šคํฐ๋ฉ๋‹ˆ๋‹ค. ์Šคํฐ ๋œ EventManager๋Š” Lua์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ฝ์–ด Event๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™” ํ•˜์—ฌ, ๋ฐฐ์—ด๋กœ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„ ์ผ์ผ ํ™•๋ฅ  ๊ณ„์‚ฐ์„ ์œ„ํ•ด DailyTaskํ•จ์ˆ˜๋ฅผ Timer์˜ Delegate์— Bindํ•ฉ๋‹ˆ๋‹ค.

Game loop

EventManager๋Š” Timer์— ์˜ํ•ด ๋งค์ผ 0์‹œ์— ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ฉ๋‹ˆ๋‹ค. 0์‹œ์— ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋Š” DailyTask์ž…๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ Day์นด์šดํ„ฐ๋ฅผ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ DailyTask๊ฐ€ SimulateProbability๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋œ SimulateProbabilityํ•จ์ˆ˜๋Š” Day๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ ๋ฐœ์ƒ์„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ UpdateEventWeight์™€ OccurEventํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. UpdateEventWeight๋Š” ์ด๋ฒคํŠธ๋“ค์˜ ๋ฐœ์ƒ ํ™•๋ฅ (๊ฐ€์ค‘์น˜)์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค. OccurEvent๋Š” ์ด๋ฒคํŠธ ๋ฐœ์ƒ ํ™•๋ฅ ์— ๋”ฐ๋ผ, ๋žœ๋คํ•œ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

DailyTask

์ด๋ฒคํŠธ๋Š” ๋งค์ผ 0์‹œ๋ฅผ ๊ธฐ์ ์œผ๋กœ ์ƒ์„ฑ ์—ฌ๋ถ€๊ฐ€ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Timer์— ์˜ํ•ด Broadcast๋˜๋Š” DailyTaskํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ํ™•๋ฅ ์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด Day๊ฐ’์„ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. Day๋Š” ์ด๋ฒคํŠธ EventOccurProbability์˜ ์ธ๋ฑ์Šค๊ฐ€ ๋˜์–ด, ํ™•๋ฅ  ๊ฐ’์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ค‘์ผ ๋•Œ์—๋Š” ์ถ”๊ฐ€์ ์ธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, Day๊ฐ’์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์€ EventPeriod ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜๋Š” Event์‹œ์ž‘ ์‹œ, ์ด๋ฒคํŠธ ์ง„ํ–‰ ๊ธฐ๊ฐ„๋งŒํผ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, DailyTask์—์„œ 1์”ฉ ๊ฐ์†Œ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ 0์ดํ•˜์ผ ๋•Œ ์ฆ‰, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ค‘์ด์ง€ ์•Š์„ ๋•Œ์—๋Š” EventEndTask๋ฅผ Broadcastํ•ฉ๋‹ˆ๋‹ค.

SimulateProbability

์ด๋ฒคํŠธ๋Š” ์ •ํ•ด์ง„ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. 0~14์ผ์€ 0%๋กœ, ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ํ™•๋ฅ ์€ 15์ผ์˜ 33.33%๋กœ ์‹œ์ž‘ํ•˜์—ฌ, 35์ผ์— ์ตœ๋Œ€์น˜์ธ 100%๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ฐœ์ƒ ํ™•๋ฅ ์€ ๋งˆ์ง€๋ง‰ ์ด๋ฒคํŠธ์˜ ์ข…๋ฃŒ ์‹œ์ ์—์„œ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ๊ฐ์˜ ์ด๋ฒคํŠธ ์‚ฌ์ด์—๋Š” ์ตœ์†Œ 14์ผ์˜ ๊ณต๋ฐฑ๊ธฐ๊ฐ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ๊ณต๋ฐฑ ๊ธฐ๊ฐ„์€ DailyTask์—์„œ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ์ค‘์ผ ๋•Œ Day๊ฐ’์ด ์ฆ๊ฐ€ํ•˜์ง€ ์•Š๋Š” ์‹์œผ๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋˜์—ˆ๋‹ค๋ฉด Day์นด์šดํ„ฐ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , UpdateEventWeight์™€ OccurEventํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

UpdateEventWeight

๊ฐ๊ฐ์˜ ์ด๋ฒคํŠธ๋Š” ๋ฐœ์ƒ ๊ฐ€์ค‘์น˜๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. [๊ฐœ๋ณ„ ์ด๋ฒคํŠธ์˜ ๊ฐ€์ค‘์น˜ / ๋ชจ๋“  ์ด๋ฒคํŠธ์˜ ๊ฐ€์ค‘์น˜์˜ ํ•ฉ]์ด ํŠน์ • ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ€์ค‘์น˜๋“ค์€ ๊ฒŒ์ž„ ๋‚ด ๋‹ค๋ฅธ ์š”์ธ(์ •์ฑ… ๋“ฑ)์— ๋”ฐ๋ผ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ ์ „ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Event๊ฐ์ฒด์˜ ๊ฐ€์ค‘์น˜๋ฅผ ์ ๊ฒ€ํ•˜์—ฌ, ๊ฐ€์ค‘์น˜ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

OccurEvent

์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๋Š” ํ˜ธ์ถœ ์‹œ ์•„๋ž˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค

  • ๊ฐ€์ค‘์น˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ์„ ํƒํ•˜์—ฌ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
  • EventPeriod๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์ด๋ฒคํŠธ ์ง€์† ๊ธฐ๊ฐ„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ UI๋“ฑ์— ์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•ด EventOccurTask๋ฅผ Broadcastํ•ฉ๋‹ˆ๋‹ค.

๋ฐœ์ƒํ•œ ์ด๋ฒคํŠธ๋Š” EventLog๊ตฌ์กฐ์ฒด์— ๊ธฐ๋ก๋˜์–ด EventManager์˜ ๋ฐฐ์—ด ๋ณ€์ˆ˜์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋˜๋Š” Log๋Š” UI์˜ ์—…๋ฐ์ดํŠธ์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ด๋ฒคํŠธ์˜ ์ง€์† ์ค‘์—๋Š” ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋Š” Event์˜ ๋ฐœ์ƒ๊ณผ ๋™์‹œ์— ํ•ด๋‹น Event์˜ ์ง€์†์‹œ๊ฐ„ ๊ฐ’ ๋งŒํผ EventPeriod๊ฐ’์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ๊ฐ’์€ DailyTask์— ์˜ํ•ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

EventOccurTask

์ด๋ฒคํŠธ์˜ ๋ฐœ์ƒ์— ๋Œ€ํ•œ ์•Œ๋ฆผ์€ ์œ ์ €์—๊ฒŒ UI์˜ ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. EventOccurTask์—๋Š” Event UI์˜ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๊ฐ€ ๋ฐ”์ธ๋”ฉ ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. OccurEvent์—์„œ EventOccurTask๊ฐ€ Broadcast๋˜๋Š” ๊ฒƒ์œผ๋กœ, Event UI์˜ ํŒ์—… ์•Œ๋ฆผ ๋ฐ ๋ฆฌ์ŠคํŠธ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

EventEndTask

์ด๋ฒคํŠธ๋Š” ๊ฒŒ์ž„ ๋‚ด ์‹œ์Šคํ…œ์˜ ํ™•๋ฅ  ๋ฐ ๊ฐ€์ค‘์น˜์— ๋ณ€๋™์„ ์ค๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ณ€๋™์€ ์ง€์ • ๊ธฐ๊ฐ„๋งŒ ์ž‘๋™ํ•˜๊ณ , ์ด๋ฒคํŠธ๊ฐ€ ํ™œ์„ฑํ™”์ค‘์ด ์•„๋‹ ๋•Œ์—๋Š” 0์˜ ๊ฐ’์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๊ฐ€ ํ™œ์„ฑํ™” ์ค‘์ด ์•„๋‹ ๋•Œ EventEndTask๋ฅผ ์ง€์†์ ์œผ๋กœ Broadcastํ•˜์—ฌ ์ด๋ฒคํŠธ์— ์˜ํ•œ ๋ณ€๋™๊ฐ’์„ ์ดˆ๊ธฐํ™”์‹œํ‚ต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ : Event

Event๋Š” EventManager์™€ Event๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๊ทธ ์ค‘, Event์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค.

CreateEvent

Event๋Š” EventManager์— ์˜ํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑ๋˜๋Š” Event๋Š” ์•กํ„ฐ๊ฐ€ ์•„๋‹Œ UObject์˜ ์ƒ์†์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ ˆ๋ฒจ์— ์Šคํฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ World Referencing์ด ๋ถˆ๊ฐ€๋Šฅํ•˜์—ฌ, EventManager์— ์˜ํ•ด World๋ฐ ๊ธฐํƒ€ ์ฐธ์กฐ๋ฅผ ์˜์กดํ•ฉ๋‹ˆ๋‹ค.

InitEvent

Event๊ฐ์ฒด์˜ ์ƒ์„ธ ์ •๋ณด๋Š” ๊ฐ๊ฐ์˜ Lua์Šคํฌ๋ฆฝํŠธ์— ์ž‘์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ๊ฐ์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์–ด๋–ค Lua์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฐธ์กฐํ• ์ง€๋Š” EventManager์— ์˜ํ•ด ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. InitEvent์—์„œ๋Š” ์ง€์ •๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ฝ์–ด, ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๊ธฐํ™”๋˜๋Š” ์ •๋ณด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Id : Id๋Š” ์Šคํฌ๋ฆฝํŠธ์˜ ํŒŒ์ผ๋ช…์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. (Event.{Id}.lua)
  • Title : Event์˜ ์ œ๋ชฉ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Lua์Šคํฌ๋ฆฝํŠธ์— ์Šคํฌ๋ฆฝํŒ… ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Message : Event์˜ ์˜ํ–ฅ์— ๋Œ€ํ•ด UI์— ํ‘œ์‹œ๋  ๋ฉ”์‹œ์ง€๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Lua์Šคํฌ๋ฆฝํŠธ์— ์Šคํฌ๋ฆฝํŒ… ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • Period : Event์˜ ์ง€์† ๊ธฐ๊ฐ„์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. Lua์Šคํฌ๋ฆฝํŠธ์— ์Šคํฌ๋ฆฝํŒ… ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

EventStart

EventManager์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š”, Event๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. Lua์Šคํฌ๋ฆฝํŠธ์˜ Startํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ, ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์ด๋ฒคํŠธ์˜ ์ง€์† ๊ธฐ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

GetEventPeriod

Event์˜ ์ง€์† ๊ธฐ๊ฐ„์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

GetEventWeight

Event์˜ ๋ฐœ์ƒ ๊ฐ€์ค‘์น˜๋Š” ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ณ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์กฐ๊ฑด์€ Lua์Šคํฌ๋ฆฝํŠธ์˜ Weightํ•จ์ˆ˜์— ์ •์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. GetEventWeight๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ, ์ง€์ •๋œ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

GetEventData

InitEvent์— ์˜ํ•ด ์ดˆ๊ธฐํ™” ๋œ EventData๊ตฌ์กฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.