๐Ÿ“˜TIL-๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ์ˆซ์ž์•ผ๊ตฌ๊ฒŒ์ž„ 2์ฐจ ๋ฆฌํŒฉํ† ๋ง

HappyCircleยท2026๋…„ 3์›” 18์ผ

Unreal ๊ฐœ๋ฐœ

๋ชฉ๋ก ๋ณด๊ธฐ
89/163

๋ฌธ์ œ

๊ธฐ์กด ์ˆซ์ž์•ผ๊ตฌ์— ํšŒ์›๊ฐ€์ž…,UI ์—ฐ๊ฒฐ ๋“ฑ ์—…๋ฐ์ดํŠธ๋œ ๊ฒŒ์ž„ ๊ตฌ์กฐ์—์„œ๋Š” ํ•œ ๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์„ ๊ฑฐ์นœGameMode๊ฐ€ ์—ฌ์ „ํžˆ ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ๋™์‹œ์— ๋งก๊ณ  ์žˆ์—ˆ๋‹ค.

ํ•˜๋‚˜์˜ ํด๋ž˜์Šค ์•ˆ์—์„œ ๋‹ค์Œ ์—ญํ• ์ด ํ•œ๊บผ๋ฒˆ์— ์ฒ˜๋ฆฌ๋˜๊ณ  ์žˆ์—ˆ๋‹ค.

  • ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ ์š”์ฒญ ์ฒ˜๋ฆฌ
  • ์ผ๋ฐ˜ ์ฑ„ํŒ… / ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
  • ํ„ด ์‹œ์ž‘ / ํ„ด ์ „ํ™˜ / ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ฒ˜๋ฆฌ
  • ์ˆซ์ž ํŒ์ •(์ŠคํŠธ๋ผ์ดํฌ/๋ณผ/์•„์›ƒ) ๋ฐ ์ŠนํŒจ/๋ฌด์Šน๋ถ€ ์ฒ˜๋ฆฌ
  • ์ „์  ๋ฐ˜์˜
  • ๊ฒŒ์ž„ ๋ฆฌ์…‹
  • UI ๊ฐฑ์‹  ํŠธ๋ฆฌ๊ฑฐ

์ด ๊ตฌ์กฐ๋Š” ์ฒ˜์Œ์—๋Š” ๋น ๋ฅด๊ฒŒ ๊ธฐ๋Šฅ์„ ๋ถ™์ด๊ธฐ์—๋Š” ํŽธํ–ˆ์ง€๋งŒ, ๊ธฐ๋Šฅ์ด ๋Š˜์–ด๋‚ ์ˆ˜๋ก ๋ฌธ์ œ๊ฐ€ ์ปค์กŒ๋‹ค.

  • GameMode ์ฝ”๋“œ๊ฐ€ ๊ณ„์† ๋น„๋Œ€ํ•ด์ง
  • ์ฑ„ํŒ… ์ˆ˜์ •์ด ํ„ด ๋กœ์ง์— ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ์Œ
  • ์ŠนํŒจ ์ฒ˜๋ฆฌ ์ˆ˜์ •์ด ๋ฆฌ์…‹ ๋กœ์ง๊นŒ์ง€ ํ•จ๊ป˜ ๊ฑด๋“œ๋ฆฌ๊ฒŒ ๋จ
  • ๋””๋ฒ„๊น… ์‹œ ์›์ธ ์ถ”์  ๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ๋„“์Œ
  • ์ดํ›„ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ์ถฉ๋Œ ์œ„ํ—˜์ด ์ปค์ง

์ฆ‰, ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ์ž‘๋™์€ ํ•˜์ง€๋งŒ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋–จ์–ด์ง€๋Š” ์ƒํƒœ์˜€๋‹ค.


๋ถ„์„

์ด๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ ๋ถ„์„ ํฌ์ธํŠธ๋Š”
โ€œ๊ธฐ๋Šฅ๋ณ„๋กœ ๋กœ์ง์ด ๋‹ค๋ฅด๋‹คโ€๊ฐ€ ์•„๋‹ˆ๋ผ
โ€œ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฑ…์ž„๊ณผ ๊ณ„์‚ฐ/์ถœ๋ ฅ์„ ๋‹ด๋‹นํ•˜๋Š” ์ฑ…์ž„์ด ์„ž์—ฌ ์žˆ๋‹คโ€๋Š” ์ ์ด์—ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

  • ๋กœ๊ทธ์ธ์€ ๊ณ„์ • ์ธ์ฆ๊ณผ ํ”Œ๋ ˆ์ด์–ด ์ƒํƒœ ๋ฐ˜์˜ ๋ฌธ์ œ
  • ์ฑ„ํŒ…์€ ๋ฉ”์‹œ์ง€ ํฌ๋งทํŒ…๊ณผ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋ฌธ์ œ
  • ํ„ด ์ง„ํ–‰์€ ๊ฒŒ์ž„ ํ๋ฆ„ ์ œ์–ด ๋ฌธ์ œ
  • ์ŠนํŒจ/๋ฌด์Šน๋ถ€๋Š” ๊ฒฝ๊ธฐ ์ข…๋ฃŒ ํŒ๋‹จ ๋ฌธ์ œ
  • ์ „์  ๋ฐ˜์˜์€ ๊ฒฐ๊ณผ ์ €์žฅ ๋ฌธ์ œ

์ธ๋ฐ, ์ด๊ฒƒ๋“ค์ด ๋ชจ๋‘ GameMode ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ์œผ๋ฉด
ํด๋ž˜์Šค ํ•˜๋‚˜๊ฐ€ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ + ๋กœ์ง ๋‹ด๋‹น์ž + ์ €์žฅ ์ฒ˜๋ฆฌ์ž + ๋ฉ”์‹œ์ง€ ์†ก์‹ ์ž๊นŒ์ง€ ๊ฒธํ•˜๊ฒŒ ๋œ๋‹ค.

๊ฒฐ๊ตญ GameMode๋Š” ์„œ๋ฒ„ ๊ถŒํ•œ ์•„๋ž˜์„œ ์ „์ฒด ํ๋ฆ„๋งŒ ์กฐ์œจํ•ด์•ผ ํ•˜๋Š”๋ฐ,
์‹ค์ œ๋กœ๋Š” ๋‚ด๋ถ€ ๊ตฌํ˜„๊นŒ์ง€ ์ง์ ‘ ๋“ค๊ณ  ์žˆ๋Š” God Class์— ๊ฐ€๊นŒ์šด ๊ตฌ์กฐ๊ฐ€ ๋˜์–ด ์žˆ์—ˆ๋‹ค.


๊ธฐ์กด ๊ตฌ์กฐ์˜ ๋ฌธ์ œ์ 

1. ์ฑ…์ž„ ์ง‘์ค‘

๊ธฐ์กด ๊ตฌ์กฐ๋Š” ์•„๋ž˜์ฒ˜๋Ÿผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

GameMode
 โ”œโ”€ ํšŒ์›๊ฐ€์ž… ์ฒ˜๋ฆฌ
 โ”œโ”€ ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ
 โ”œโ”€ ์ฑ„ํŒ… ์ฒ˜๋ฆฌ
 โ”œโ”€ ํ„ด ์‹œ์ž‘
 โ”œโ”€ ํ„ด ์ „ํ™˜
 โ”œโ”€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ์ฒ˜๋ฆฌ
 โ”œโ”€ ์ˆซ์ž ํŒ์ •
 โ”œโ”€ ์ŠนํŒจ/๋ฌด์Šน๋ถ€ ํŒ๋‹จ
 โ”œโ”€ ์ „์  ๋ฐ˜์˜
 โ””โ”€ ๊ฒŒ์ž„ ๋ฆฌ์…‹

์ด ๊ตฌ์กฐ์—์„œ๋Š” ์–ด๋–ค ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•ด๋„ ๊ฒฐ๊ตญ GameMode๋ฅผ ์—ด์–ด๋ด์•ผ ํ–ˆ๋‹ค.


2. ์ˆ˜์ • ๋ฒ”์œ„ ํ™•์žฅ

์˜ˆ๋ฅผ ๋“ค์–ด ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ ํ˜•์‹์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด๋„
GameMode ๋‚ด๋ถ€๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ–ˆ๊ณ ,

ํ„ด ๋กœ์ง์„ ๋ฐ”๊พธ๊ณ  ์‹ถ์–ด๋„
์ŠนํŒจ ์ฒ˜๋ฆฌ, ๋ฆฌ์…‹ ์ฒ˜๋ฆฌ์™€ ๋ถ™์–ด ์žˆ์–ด์„œ ์˜ํ–ฅ ๋ฒ”์œ„๊ฐ€ ์ปค์กŒ๋‹ค.

์ฆ‰, ํ•œ ๊ธฐ๋Šฅ์˜ ์ˆ˜์ •์ด ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์— ํŒŒ๊ธ‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•˜๋‹ค.


3. ํ…Œ์ŠคํŠธ์™€ ๋””๋ฒ„๊น… ๋‚œ์ด๋„ ์ฆ๊ฐ€

๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ

  • ์ž…๋ ฅ ๋‹จ๊ณ„ ๋ฌธ์ œ์ธ์ง€
  • ํ„ด ์ง„ํ–‰ ๋ฌธ์ œ์ธ์ง€
  • ํŒ์ • ๋ฌธ์ œ์ธ์ง€
  • ๊ฒฐ๊ณผ ๋ฐ˜์˜ ๋ฌธ์ œ์ธ์ง€
  • UI ๊ฐฑ์‹  ๋ฌธ์ œ์ธ์ง€

๋ฅผ ํ•œ ๋ฒˆ์— ๋ถ„๋ฆฌํ•ด์„œ ๋ณด๊ธฐ ์–ด๋ ค์› ๋‹ค.

ํŠนํžˆ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์—์„œ๋Š” ์„œ๋ฒ„ ๊ธฐ์ค€ ํ๋ฆ„์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
์ฑ…์ž„์ด ์„ž์—ฌ ์žˆ์œผ๋ฉด ๋ฒ„๊ทธ ์›์ธ ์ถ”์ ์ด ๋” ํž˜๋“ค์–ด์ง„๋‹ค.


๋ฆฌํŒฉํ† ๋ง ๋ชฉํ‘œ

์ด๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์˜ ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์—ญํ•  ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์กฐ๋ฅผ ๋‹ค์‹œ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

์ตœ์ข… ๋ฐฉํ–ฅ์€ ์•„๋ž˜์ฒ˜๋Ÿผ ์žก์•˜๋‹ค.

  • GameMode
    โ†’ ์š”์ฒญ ์ง„์ž…์ , ๋งค๋‹ˆ์ € ์ƒ์„ฑ, delegate ์—ฐ๊ฒฐ๋งŒ ๋‹ด๋‹น
  • MatchFlowManager
    โ†’ ํ„ด ์ง„ํ–‰, ์ œํ•œ ์‹œ๊ฐ„, ์ˆซ์ž ํŒ์ • ํ๋ฆ„, ์ŠนํŒจ/๋ฌด์Šน๋ถ€, ๋ฆฌ์…‹ ๋‹ด๋‹น
  • ChatManager
    โ†’ ์ผ๋ฐ˜ ์ฑ„ํŒ…, ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€, ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ ๋‹ด๋‹น
  • RecordManager
    โ†’ ์Šน/ํŒจ/๋ฌด ์ „์  ๋ฐ˜์˜ ๋‹ด๋‹น

์ฆ‰, GameMode๋Š” ๋” ์ด์ƒ ๋ชจ๋“  ๊ฑธ ์ง์ ‘ ํ•˜์ง€ ์•Š๊ณ 
๊ฐ ์ฑ…์ž„์„ ๊ฐ€์ง„ ๊ฐ์ฒด๋ฅผ ์กฐ๋ฆฝํ•˜๊ณ  ํ˜ธ์ถœํ•˜๋Š” ๊ตฌ์กฐ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์˜€๋‹ค.


ํ•ด๊ฒฐ

1. GameMode๋ฅผ ๋ผ์šฐํ„ฐ๋กœ ์ถ•์†Œ

๊ฐ€์žฅ ๋จผ์ € GameMode์˜ ์—ญํ• ์„ ์ค„์˜€๋‹ค.

์ด์ œ GameMode๋Š” ๋‹ค์Œ๋งŒ ๋‹ด๋‹นํ•œ๋‹ค.

  • ํ”Œ๋ ˆ์ด์–ด ์ ‘์† ์‹œ ์ดˆ๊ธฐ ๋“ฑ๋ก
  • ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž… ์š”์ฒญ ์ง„์ž…
  • ์ถ”์ธก ์ž…๋ ฅ ์š”์ฒญ ์ „๋‹ฌ
  • ์ผ๋ฐ˜ ์ฑ„ํŒ… ์š”์ฒญ ์ „๋‹ฌ
  • ๋งค๋‹ˆ์ € ์ƒ์„ฑ ๋ฐ ์ดˆ๊ธฐํ™”
  • delegate ๋ฐ”์ธ๋”ฉ

์ฆ‰, ์ง์ ‘ ํ„ด์„ ๋Œ๋ฆฌ๊ฑฐ๋‚˜, ์ง์ ‘ ์ฑ„ํŒ…์„ ๋ฟŒ๋ฆฌ๊ฑฐ๋‚˜, ์ง์ ‘ ์ „์ ์„ ๊ฐฑ์‹ ํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด๋ฉด ์ด๋ ‡๊ฒŒ ๋ฐ”๋€ ์…ˆ์ด๋‹ค.

Before
GameMode = ์š”์ฒญ ์ฒ˜๋ฆฌ + ๊ฒŒ์ž„ ํ๋ฆ„ + ์ฑ„ํŒ… + ์ „์  + ๋ฆฌ์…‹

After
GameMode = ์š”์ฒญ ์ง„์ž… + ๋งค๋‹ˆ์ € ์—ฐ๊ฒฐ

2. MatchFlowManager ๋ถ„๋ฆฌ

๊ฐ€์žฅ ํฐ ์ฑ…์ž„ ๋ฉ์–ด๋ฆฌ๋Š” ๊ฒฝ๊ธฐ ์ง„ํ–‰ ํ๋ฆ„์ด์—ˆ๋‹ค.

์ด๋ฅผ MatchFlowManager๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

์ด ๋งค๋‹ˆ์ €๋Š” ์•„๋ž˜ ์—ญํ• ์„ ๋งก๋Š”๋‹ค.

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

์ฆ‰, ๊ฒŒ์ž„ ํ•œ ํŒ์ด ์–ด๋–ป๊ฒŒ ํ˜๋Ÿฌ๊ฐ€๋Š”์ง€๋ฅผ ์ „๋‹ดํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ๋˜์—ˆ๋‹ค.


3. ChatManager ๋ถ„๋ฆฌ

์ฑ„ํŒ… ์ถœ๋ ฅ์€ ๊ฒŒ์ž„ ๊ทœ์น™๊ณผ๋Š” ๋ณ„๊ฐœ ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ฆฌํ–ˆ๋‹ค.

์ด ๋งค๋‹ˆ์ €๋Š” ๋‹ค์Œ์„ ๋‹ด๋‹นํ•œ๋‹ค.

  • ์ผ๋ฐ˜ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ํฌ๋งทํŒ…
  • ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ
  • ๋กœ๊ทธ์ธ ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
  • ํ„ด ์‹œ์ž‘ / ์‹œ๊ฐ„ ์ดˆ๊ณผ / ๊ฒฝ๊ธฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

์˜ˆ๋ฅผ ๋“ค์–ด,
PlayerName: Hello
๊ฐ™์€ ์ผ๋ฐ˜ ์ฑ„ํŒ… ํฌ๋งท๋„ ์ด์ œ ChatManager์—์„œ ์ฒ˜๋ฆฌํ•œ๋‹ค.


4. RecordManager ๋ถ„๋ฆฌ

์Šน/ํŒจ/๋ฌด ๊ธฐ๋ก ๋ฐ˜์˜๋„ ๋ณ„๋„ ์ฑ…์ž„์œผ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.

์ด ๋งค๋‹ˆ์ €๋Š”

  • ์Šน๋ฆฌ ํ”Œ๋ ˆ์ด์–ด ์ „์  ๊ฐฑ์‹ 
  • ํŒจ๋ฐฐ ํ”Œ๋ ˆ์ด์–ด ์ „์  ๊ฐฑ์‹ 
  • ๋ฌด์Šน๋ถ€ ํ”Œ๋ ˆ์ด์–ด ์ „์  ๊ฐฑ์‹ 

์„ ๋‹ด๋‹นํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ,
๊ฒฝ๊ธฐ ์ข…๋ฃŒ ํŒ๋‹จ๊ณผ ์ „์  ์ €์žฅ ๋กœ์ง์ด ๋ถ„๋ฆฌ๋˜์—ˆ๋‹ค.

์ฆ‰,

  • ๋ˆ„๊ฐ€ ์ด๊ฒผ๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๊ฒƒ์€ MatchFlowManager
  • ๊ทธ ๊ฒฐ๊ณผ๋ฅผ DB/PlayerState์— ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์€ RecordManager

๊ฐ€ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.


5. Delegate ๊ธฐ๋ฐ˜ ์—ฐ๊ฒฐ

๋งค๋‹ˆ์ € ๊ฐ„ ์ง์ ‘ ๊ฒฐํ•ฉ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด delegate๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค.

MatchFlowManager๋Š” ๊ฒฝ๊ธฐ ํ๋ฆ„ ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค๊ณ ,
ChatManager๊ฐ€ ์ด๋ฅผ ๊ตฌ๋…ํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ๋ฆ„์ด๋‹ค.

MatchFlowManager
 โ”œโ”€ OnTurnStarted
 โ”œโ”€ OnTurnTimedOut
 โ””โ”€ OnMatchEnded

ChatManager
 โ”œโ”€ ํ„ด ์‹œ์ž‘ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
 โ”œโ”€ ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
 โ””โ”€ ๊ฒฝ๊ธฐ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ

์ด ๊ตฌ์กฐ์˜ ์žฅ์ ์€
MatchFlowManager๊ฐ€ ์ฑ„ํŒ… ์ถœ๋ ฅ ๋ฐฉ์‹์„ ์•Œ ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์ ์ด๋‹ค.

์ฆ‰, โ€œํ„ด์ด ์‹œ์ž‘๋˜์—ˆ๋‹คโ€๋ผ๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ๋ฆฌ๊ณ ,
๊ทธ๊ฑธ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ค„์ง€๋Š” ChatManager๊ฐ€ ๋งก๋Š”๋‹ค.


๋ฆฌํŒฉํ† ๋ง ์ „ํ›„ ํด๋ž˜์Šค ๊ตฌ์กฐ

Before ๊ตฌ์กฐ

+----------------------+
| ABACGameModeBase     |
+----------------------+
| - AllPlayerControllers
| - SecretNumberString
| - TurnTimerHandle
| - ResultResetTimerHandle
+----------------------+
| + HandleRegisterRequest()
| + HandleLoginRequest()
| + HandleGuessRequest()
| + HandlePlainChatMessage()
| + BroadcastChatToAll()
| + BroadcastSystemMessageToAll()
| + StartTurn()
| + StartTurnByIndex()
| + AdvanceTurn()
| + HandleTurnTimeout()
| + JudgeGame()
| + ResetGame()
| + UpdateUserRecordOnWin()
| + UpdateUserRecordOnLose()
| + UpdateUserRecordOnDraw()
+----------------------+

๋ฌธ์ œ๋Š” ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์— ๋„ˆ๋ฌด ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์‘์ง‘๋˜์–ด ์žˆ๋‹ค๋Š” ์ ์ด์—ˆ๋‹ค.


After ๊ตฌ์กฐ

+----------------------+
| ABACGameModeBase     |
+----------------------+
| + BeginPlay()
| + OnPostLogin()
| + HandleRegisterRequest()
| + HandleLoginRequest()
| + HandleGuessRequest()
| + HandlePlainChatMessage()
| + BindManagerDelegates()
+----------------------+
          |
          v
+----------------------+     +----------------------+     +----------------------+
| UBACMatchFlowManager | --> |   UBACChatManager    |     | UBACRecordManager    |
+----------------------+     +----------------------+     +----------------------+
| ํ„ด ์ง„ํ–‰               |     | ์ฑ„ํŒ… ์ถœ๋ ฅ             |     | ์ „์  ๋ฐ˜์˜             |
| ์‹œ๊ฐ„ ์ œํ•œ             |     | ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€         |     | ์Šน/ํŒจ/๋ฌด ์ €์žฅ         |
| ์ž…๋ ฅ ํŒ์ • ํ๋ฆ„         |     | ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธ          |     | PlayerState ๊ฐฑ์‹       |
| ์ŠนํŒจ/๋ฌด์Šน๋ถ€ ์ฒ˜๋ฆฌ       |     | ์•ˆ๋‚ด ๋ฉ”์‹œ์ง€           |     | AccountService ์—ฐ๋™   |
| ๋ฆฌ์…‹                  |     | delegate ์ˆ˜์‹          |     |                      |
+----------------------+     +----------------------+     +----------------------+

์‹œํ€€์Šค ํ๋ฆ„๋„

1. ์ผ๋ฐ˜ ์ฑ„ํŒ… ์ฒ˜๋ฆฌ ํ๋ฆ„

Client UI
 -> PlayerController
 -> GameMode.HandlePlainChatMessage()
 -> ChatManager.HandlePlainChatMessage()
 -> ChatManager.BroadcastChatToAll()
 -> ๊ฐ ClientRPC
 -> ChatPanel ScrollBox ์ถœ๋ ฅ

2. ์ถ”์ธก ์ž…๋ ฅ ์ฒ˜๋ฆฌ ํ๋ฆ„

Client UI
 -> PlayerController
 -> GameMode.HandleGuessRequest()
 -> MatchFlowManager.SubmitGuess()
    -> ๋กœ๊ทธ์ธ ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
    -> ํ˜„์žฌ ํ„ด ์—ฌ๋ถ€ ๊ฒ€์‚ฌ
    -> MatchService.ValidateGuess()
    -> MatchService.JudgeGuess()
    -> ๊ฒฐ๊ณผ ์ฑ„ํŒ… ์ถœ๋ ฅ
    -> ์Šน๋ฆฌ / ๋ฌด์Šน๋ถ€ / ๋‹ค์Œ ํ„ด ํŒ๋‹จ

3. ๊ฒฝ๊ธฐ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ ํ๋ฆ„

MatchFlowManager
 -> ์Šน๋ฆฌ ๋˜๋Š” ๋ฌด์Šน๋ถ€ ํŒ๋‹จ
 -> RecordManager ์ „์  ๋ฐ˜์˜
 -> OnMatchEnded Broadcast
 -> ChatManager ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€ ์ถœ๋ ฅ
 -> ๊ฒฐ๊ณผ ํŒจ๋„ ๊ฐฑ์‹ 
 -> ์ผ์ • ์‹œ๊ฐ„ ํ›„ ResetRound()

ํด๋ž˜์Šค ์ฑ…์ž„ ์ •๋ฆฌ

ABACGameModeBase

  • ์„œ๋ฒ„ ์ง„์ž…์ 
  • ์š”์ฒญ ๋ผ์šฐํŒ…
  • ๋งค๋‹ˆ์ € ์ƒ์„ฑ
  • delegate ์—ฐ๊ฒฐ
  • ๋กœ๊ทธ์ธ ์‹œ PlayerState ๊ธฐ๋ณธ๊ฐ’ ๋ฐ˜์˜

UBACMatchFlowManager

  • ๊ฒฝ๊ธฐ ์ƒ๋ช…์ฃผ๊ธฐ ๊ด€๋ฆฌ
  • ํ„ด ์ƒํƒœ ๊ด€๋ฆฌ
  • ์ œํ•œ ์‹œ๊ฐ„ ๊ด€๋ฆฌ
  • ์ถ”์ธก ๊ฒฐ๊ณผ ํ๋ฆ„ ์ œ์–ด
  • ๊ฒฝ๊ธฐ ์ข…๋ฃŒ ํ›„ ๋ฆฌ์…‹

UBACChatManager

  • ์ผ๋ฐ˜ ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  • ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ
  • ๊ฒฝ๊ธฐ ํ๋ฆ„ ์ด๋ฒคํŠธ๋ฅผ ํ…์ŠคํŠธ๋กœ ์ถœ๋ ฅ
  • ํด๋ผ์ด์–ธํŠธ ์ฑ„ํŒ… UI ๋ฐ˜์˜ ํŠธ๋ฆฌ๊ฑฐ

UBACRecordManager

  • ์ „์  ๊ฐฑ์‹  ์ฑ…์ž„ ๋ถ„๋ฆฌ
  • AccountService ์—ฐ๋™
  • ์Šน/ํŒจ/๋ฌด๋ฅผ PlayerState์™€ ์ €์žฅ์†Œ์— ๋ฐ˜์˜

์ด๋ฒˆ ์ž‘์—…์—์„œ ์–ป์€ ํ•ต์‹ฌ ํšจ๊ณผ

1. ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ

์ด์ œ ์ฑ„ํŒ… ์ˆ˜์ •์€ ChatManager,
ํ„ด ๋กœ์ง ์ˆ˜์ •์€ MatchFlowManager,
์ „์  ์ˆ˜์ •์€ RecordManager ์ค‘์‹ฌ์œผ๋กœ ๋ณด๋ฉด ๋œ๋‹ค.

์ฆ‰, ์ˆ˜์ • ๋ฒ”์œ„๊ฐ€ ๋ช…ํ™•ํ•ด์กŒ๋‹ค.


2. ๋””๋ฒ„๊น… ๋ฒ”์œ„ ์ถ•์†Œ

๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ

  • ์ฑ„ํŒ…์ด ์•ˆ ๋œจ๋ฉด ChatManager
  • ํ„ด์ด ๊ผฌ์ด๋ฉด MatchFlowManager
  • ์ „์ ์ด ๋ฐ˜์˜๋˜์ง€ ์•Š์œผ๋ฉด RecordManager

์ฒ˜๋Ÿผ ์›์ธ ์ถ”์  ๋ฒ”์œ„๋ฅผ ๋น ๋ฅด๊ฒŒ ์ขํž ์ˆ˜ ์žˆ๋‹ค.


3. ํ™•์žฅ์„ฑ ํ™•๋ณด

์ด ๊ตฌ์กฐ์—์„œ๋Š” ์•ž์œผ๋กœ๋„ ๊ธฐ๋Šฅ์„ ๋” ๋ถ™์ด๊ธฐ ์‰ฝ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,

  • PlayerRegistryManager
  • AuthCoordinator
  • ResultPanelManager
  • RoomManager

๊ฐ™์€ ์ถ”๊ฐ€ ๋ถ„๋ฆฌ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฆ‰, ์ด๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์€ ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์ •๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ
๋‹ค์Œ ๊ธฐ๋Šฅ ์ถ”๊ฐ€๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐ์  ๊ธฐ๋ฐ˜ ๋งˆ๋ จ์ด๋ผ๋Š” ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.


ํšŒ๊ณ 

์ด๋ฒˆ ์ž‘์—…์€ ๋‹จ์ˆœํžˆ GameMode ์ฝ”๋“œ๋ฅผ ๋‚˜๋ˆˆ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
์„œ๋ฒ„ ์ค‘์‹ฌ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ๊ตฌ์กฐ์—์„œ ์ฑ…์ž„์„ ์–ด๋””์— ๋‘ฌ์•ผ ํ•˜๋Š”์ง€ ๋‹ค์‹œ ์ •๋ฆฌํ•œ ์ž‘์—…์ด์—ˆ๋‹ค.

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

์ด๋ฒˆ ๋ฆฌํŒฉํ† ๋ง์„ ํ†ตํ•ด

  • GameMode๋Š” ์กฐ๋ฆฝ์ž
  • MatchFlowManager๋Š” ๊ฒฝ๊ธฐ ํ๋ฆ„ ๋‹ด๋‹น
  • ChatManager๋Š” ์ถœ๋ ฅ ๋‹ด๋‹น
  • RecordManager๋Š” ๊ฒฐ๊ณผ ์ €์žฅ ๋‹ด๋‹น

์œผ๋กœ ์—ญํ• ์ด ๋ช…ํ™•ํ•ด์กŒ๊ณ ,
์ดํ›„ ๋กœ๊ทธ์ธ ๊ตฌ์กฐ ๋ถ„๋ฆฌ, ํ”Œ๋ ˆ์ด์–ด ๋“ฑ๋ก ๊ด€๋ฆฌ, ๋ฃธ ๋‹จ์œ„ ํ™•์žฅ๊นŒ์ง€ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋ฐ˜์„ ๋งŒ๋“ค์—ˆ๋‹ค.


์˜ค๋Š˜์˜ ์ •๋ฆฌ

  • ์ˆซ์ž์•ผ๊ตฌ ๊ฒŒ์ž„ ๋ฆฌํŒฉํ† ๋ง์˜ ํ•ต์‹ฌ์€ ๋‹จ์ˆœํ•œ ํŒŒ์ผ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ
    GameMode์— ๋ชฐ๋ ค ์žˆ๋˜ ๊ฒŒ์ž„ ํ๋ฆ„ / ์ฑ„ํŒ… / ์ „์  / ๋ฆฌ์…‹ ์ฑ…์ž„์„ ์—ญํ• ๋ณ„ ๋งค๋‹ˆ์ €๋กœ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๊ธฐ๋Šฅ ์ˆ˜์ • ๋ฒ”์œ„์™€ ๋””๋ฒ„๊น… ํฌ์ธํŠธ๊ฐ€ ๋ถ„๋ช…ํ•ด์ ธ ์ดํ›„ ํ™•์žฅ๊ณผ ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ํ›จ์”ฌ ์‰ฌ์šด ํ˜•ํƒœ๋กœ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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