๐Ÿ“˜TIL - ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ์ˆซ์ž์•ผ๊ตฌ๊ฒŒ์ž„ UI ๊ตฌํ˜„ ๋ฐ ๋กœ์ง ์ ์šฉ

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

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

๊ธฐ์กด ์ฑ„ํŒ… ๊ธฐ๋ฐ˜ ์ˆซ์ž์•ผ๊ตฌ ๊ฒŒ์ž„์— UI๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋ฌธ์ œ ์˜์—ญ๋‚ด์šฉ
์ž…๋ ฅ ๊ตฌ์กฐ์ฑ„ํŒ… ์ž…๋ ฅ๊ณผ UI ์ž…๋ ฅ์ด ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•„ ๋ผ์šฐํŒ… ํ˜ผ์žฌ
์ƒํƒœ ๋™๊ธฐํ™”๋กœ๊ทธ์ธ / ํ„ด / ๊ฒŒ์ž„ ์ƒํƒœ๊ฐ€ UI์— ์ฆ‰์‹œ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ
ํ„ด ํ‘œ์‹œ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๊ธฐ์ค€ ๋ฐฐ์—ด์ด ๋‹ฌ๋ผ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด ํ‘œ์‹œ
ํŒ์ • UIStrike / Ball / Out ๊ฒฐ๊ณผ๊ฐ€ UI์— ์—ฐ๊ฒฐ๋˜์ง€ ์•Š์Œ
UI ๊ฐฑ์‹ GameState ๊ฐ’์€ ๋ฐ”๋€Œ์ง€๋งŒ UI๊ฐ€ ๊ฐฑ์‹ ๋˜์ง€ ์•Š์Œ

๋ถ„์„

ํ•ต์‹ฌ ๋ฌธ์ œ

์„œ๋ฒ„ ๋ฐ์ดํ„ฐ โ†’ ํด๋ผ์ด์–ธํŠธ UI๊นŒ์ง€ ํ๋ฆ„ ๋‹จ์ ˆ

1. ์ž…๋ ฅ ์ฒ˜๋ฆฌ ๊ตฌ์กฐ ๋ฌธ์ œ

BeforeAfter
์ฑ„ํŒ… ๋ฌธ์ž์—ด ํ•˜๋‚˜๋กœ ๋ชจ๋“  ์ฒ˜๋ฆฌ๊ธฐ๋Šฅ๋ณ„ RPC ๋ถ„๋ฆฌ

2. ํ„ด ์ƒํƒœ ๋ถˆ์ผ์น˜

Server: AllPlayerControllers ๊ธฐ์ค€
Client: GameState.PlayerArray ๊ธฐ์ค€

๋™์ผ ์ธ๋ฑ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๊ธฐ์ค€ ๋ฐฐ์—ด์ด ๋‹ฌ๋ผ ์„œ๋กœ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.


3. UI ๊ฐฑ์‹  ๋ฌธ์ œ

์ƒํƒœ ์œ„์น˜๊ฒฐ๊ณผ
PlayerStateUI ๊ฐฑ์‹ ๋จ
GameStateUI ๊ฐฑ์‹  ์•ˆ๋จ

ํ„ด ์ƒํƒœ๋Š” GameState์— ์žˆ์ง€๋งŒ UI ๊ฐฑ์‹  ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ์—†์–ด ๋ฐ˜์˜๋˜์ง€ ์•Š์•˜๋‹ค.


4. ํŒ์ • ๊ฒฐ๊ณผ ์ „๋‹ฌ ๋‹จ์ ˆ

GameMode โ†’ (์ค‘๊ฐ„ ์ „๋‹ฌ ์—†์Œ) โ†’ UI

์„œ๋ฒ„์—์„œ ๊ณ„์‚ฐ๋œ ๊ฒฐ๊ณผ๊ฐ€ UI๊นŒ์ง€ ์ „๋‹ฌ๋˜์ง€ ์•Š์•˜๋‹ค.


5. UI ๊ตฌ์กฐ ๋ฌธ์ œ

ChatPanel / GamePanel ์—ญํ•  ๋ถˆ๋ช…ํ™•

UI๊ฐ€ ๋‹จ์ˆœ ์ถœ๋ ฅ ๊ตฌ์กฐ๋กœ ๋˜์–ด ์žˆ์–ด ์ƒํƒœ ๊ธฐ๋ฐ˜ ํ‘œํ˜„์ด ์–ด๋ ค์› ๋‹ค.


ํ•ด๊ฒฐ


1. ์ž…๋ ฅ ๋ผ์šฐํŒ… ๊ตฌ์กฐ ๋ถ„๋ฆฌ

[Client Input]
        โ†“
PlayerController
        โ†“
โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ /register โ†’ ServerRPCRegister โ”‚
โ”‚ /login    โ†’ ServerRPCLogin    โ”‚
โ”‚ ์ˆซ์ž ์ž…๋ ฅ  โ†’ SubmitGuess      โ”‚
โ”‚ ๊ธฐํƒ€ ์ฑ„ํŒ…  โ†’ SubmitChat       โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์ž…๋ ฅ์€ ํ•˜๋‚˜์˜ ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋‚ด๋ถ€ ๋กœ์ง์€ ์™„์ „ํžˆ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.


2. ํ„ด ์ƒํƒœ ๋™๊ธฐํ™” ๊ตฌ์กฐ ๊ฐœ์„ 

๋ณ€๊ฒฝ ์ „

๋ฐฐ์—ด ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ์ถ”๋ก 

๋ณ€๊ฒฝ ํ›„

GameState์— ๋ช…์‹œ์  ๊ฐ’ ์ €์žฅ
๋ณ€์ˆ˜์—ญํ• 
CurrentTurnPlayerNameํ˜„์žฌ ํ„ด ํ”Œ๋ ˆ์ด์–ด
CurrentTurnPlayerIndexํ„ด ์ธ๋ฑ์Šค
TurnEndServerTimeํ„ด ์ข…๋ฃŒ ์‹œ๊ฐ„
bTurnInProgressํ„ด ์ง„ํ–‰ ์—ฌ๋ถ€

UI๋Š” ๋” ์ด์ƒ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„์—์„œ ํ™•์ •๋œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€๋‹ค.


3. GameState โ†’ UI ๊ฐฑ์‹  ํ๋ฆ„

์ „์ฒด ๊ตฌ์กฐ

[Server]
GameMode
   โ†“
GameState ๊ฐ’ ๋ณ€๊ฒฝ

[Client]
GameState (OnRep)
   โ†“
PlayerController
   โ†“
MainHUD
   โ†“
GamePanel / ๊ธฐํƒ€ Panel

ํ˜ธ์ถœ ํ๋ฆ„

OnRep_CurrentTurnPlayerName
โ†’ NotifyTurnStateUpdated
โ†’ PlayerController.HandleTurnStateReplicated
โ†’ MainHUD.RefreshGamePanel

OnRep ๊ธฐ๋ฐ˜์œผ๋กœ UI๊ฐ€ ์ž๋™ ๊ฐฑ์‹ ๋˜๋„๋ก ๊ตฌ์กฐ๋ฅผ ๊ตฌ์„ฑํ•˜์˜€๋‹ค.


4. ํŒ์ • ๊ฒฐ๊ณผ UI ์—ฐ๊ฒฐ

์ „์ฒด ํ๋ฆ„

[Server]
GameMode (Judge ๊ณ„์‚ฐ)
        โ†“
Client RPC
        โ†“
[Client]
PlayerController
        โ†“
MainHUD
        โ†“
GamePanel
        โ†“
SetJudgeResult

์ „๊ด‘ํŒ ์ฒ˜๋ฆฌ ๋กœ์ง

SetJudgeResult
โ†’ ResetJudgeBoard
โ†’ Strike ๊ฐœ์ˆ˜ ON
โ†’ Ball ๊ฐœ์ˆ˜ ON
โ†’ Out ๊ฐœ์ˆ˜ ON

์ƒ‰์ƒ ์ •์ฑ…

์ƒํƒœ์ƒ‰์ƒ
OFF(0.12, 0.12, 0.12)
StrikeRed
BallYellow
OutBlue

์ƒํƒœ๋ฅผ ์ƒ‰์œผ๋กœ ์ง๊ด€์ ์œผ๋กœ ํ‘œํ˜„ํ•˜๋„๋ก ๊ตฌ์„ฑํ•˜์˜€๋‹ค.


5. UI ๊ตฌ์กฐ ๊ฐœ์„ 

Before

๋‹จ์ˆœ ์ฑ„ํŒ… ์ถœ๋ ฅ UI

After

MainHUD
 โ”œโ”€โ”€ LoginPanel   (๋กœ๊ทธ์ธ ์ƒํƒœ)
 โ”œโ”€โ”€ GamePanel    (ํ„ด / ์ž…๋ ฅ / ์ „๊ด‘ํŒ)
 โ”œโ”€โ”€ ChatPanel    (์ฑ„ํŒ… ๋กœ๊ทธ)
 โ””โ”€โ”€ StatusPanel  (์ „์ )

UI๋ฅผ ์ƒํƒœ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.


6. ์ฑ…์ž„ ๋ถ„๋ฆฌ ๊ตฌ์กฐ

๊ณ„์ธต์—ญํ• 
GameMode๊ฒŒ์ž„ ๋กœ์ง (Server Only)
GameState์ƒํƒœ ๋ณต์ œ
PlayerControllerUI ํŠธ๋ฆฌ๊ฑฐ
MainHUDUI ๊ด€๋ฆฌ
Panel์‹ค์ œ UI ๋ Œ๋”๋ง

๊ฐ ๊ณ„์ธต์˜ ์—ญํ• ์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜์˜€๋‹ค.


์ตœ์ข… ์ „์ฒด ๊ตฌ์กฐ

[Server]
GameMode
   โ†“
GameState

[Client]
GameState (OnRep)
   โ†“
PlayerController
   โ†“
MainHUD
   โ†“
Panels

[Panels]
- GamePanel (ํ„ด / ์‹œ๊ฐ„ / ์ „๊ด‘ํŒ)
- ChatPanel (์ฑ„ํŒ…)
- LoginPanel (๋กœ๊ทธ์ธ)
- StatusPanel (์ „์ )

์ธ์‚ฌ์ดํŠธ

  • UI๋Š” ๋‹จ์ˆœ ์ถœ๋ ฅ์ด ์•„๋‹ˆ๋ผ ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ ˆ์ด์–ด์ด๋‹ค
  • ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฐฐ์—ด ์ธ๋ฑ์Šค ๊ธฐ๋ฐ˜ ๋กœ์ง์ด ์‰ฝ๊ฒŒ ๊นจ์ง„๋‹ค
  • ์„œ๋ฒ„๊ฐ€ ํ™•์ •ํ•œ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ตฌ์กฐ๊ฐ€ ๊ฐ€์žฅ ์•ˆ์ •์ ์ด๋‹ค
  • OnRep ๊ธฐ๋ฐ˜ UI ๊ฐฑ์‹ ์€ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด์—์„œ ํ•„์ˆ˜ ํŒจํ„ด์ด๋‹ค
  • ์ž…๋ ฅ, ์ƒํƒœ, UI๋ฅผ ๋ถ„๋ฆฌํ•˜๋ฉด ๊ตฌ์กฐ ์•ˆ์ •์„ฑ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋œ๋‹ค

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

  • ์ฑ„ํŒ… ๊ธฐ๋ฐ˜ ์ž…๋ ฅ ๊ตฌ์กฐ๋ฅผ UI ์ค‘์‹ฌ ๊ตฌ์กฐ๋กœ ํ™•์žฅํ•˜๋ฉด์„œ, GameState(OnRep)์™€ RPC ํ๋ฆ„์„ ํ†ตํ•ด ์„œ๋ฒ„ ์ƒํƒœ๋ฅผ ํด๋ผ์ด์–ธํŠธ UI๊นŒ์ง€ ์•ˆ์ •์ ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์™„์„ฑํ–ˆ๋‹ค.
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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