๐Ÿ“˜TIL - PlayerController, ์œ ๋‹› ์„œ๋ธŒ์‹œ์Šคํ…œ UI์™€ ์—ฐ๋™

HappyCircleยท2026๋…„ 4์›” 10์ผ

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

์ด์ „ ๋‹จ๊ณ„์—์„œ๋Š”

Selection โ†’ CommandContext โ†’ UI ํ‘œ์‹œ

๊นŒ์ง€๋Š” ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ์ƒํƒœ์˜€๋‹ค.

ํ•˜์ง€๋งŒ ์‹ค์ œ ๊ฒŒ์ž„ ๋กœ์ง๊นŒ์ง€ ์—ฐ๊ฒฐํ•˜๋ ค๋Š” ์ˆœ๊ฐ„ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

UI์—์„œ ๋ฐœ์ƒํ•œ ๋ช…๋ น์ด ์‹ค์ œ ์œ ๋‹› ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Œ

๋Œ€ํ‘œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ ์ฆ์ƒ:

์šฐํด๋ฆญ ์‹œ ์œ ๋‹›์ด ํšŒ์ „๋งŒ ํ•˜๊ณ  ์ด๋™ํ•˜์ง€ ์•Š์Œ

์ฆ‰ ๋ฌธ์ œ๋Š” ๋‹จ์ˆœ UI๊ฐ€ ์•„๋‹ˆ๋ผ

UI โ†’ PlayerController โ†’ Mass โ†’ StateTree โ†’ Movement

์ด ์ „์ฒด ํ๋ฆ„ ์–ด๋”˜๊ฐ€์—์„œ ๋Š๊ธฐ๊ณ  ์žˆ์—ˆ๋‹ค.


๊ตฌ์กฐ์  ๋ฌธ์ œ

๊ตฌ๋ถ„๋ฌธ์ œ
๋ช…๋ น ์ „๋‹ฌ์ „๋‹ฌ์€ ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๋‚˜ ์‹ค์ œ ๋™์ž‘์œผ๋กœ ์ด์–ด์ง€์ง€ ์•Š์Œ
StateTree์ƒํƒœ๊ฐ€ ์œ ์ง€๋˜์ง€ ์•Š๊ณ  ๊ณ„์† ์žฌ์ง„์ž…
MovementPathFollow๊ฐ€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋จ
Command ๊ตฌ์กฐ์ƒํƒœ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ค๊ณ„๋˜์–ด ์žฌ์ง„์ž… ๋ฃจํ”„ ๋ฐœ์ƒ
SubsystemUI์™€ ์ง์ ‘ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์—ˆ๋˜ ๊ตฌ์กฐ
UI ๋ฐ์ดํ„ฐํด๋ผ์ด์–ธํŠธ์—์„œ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ๋กœ๋กœ ์ ‘๊ทผ

๊ธฐ์กด ๊ตฌ์กฐ

๋ฌธ์ œ ๋ฐœ์ƒ ๋‹น์‹œ ํ๋ฆ„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

์šฐํด๋ฆญ
โ†’ PlayerController
โ†’ Command Fragment ์„ค์ •
โ†’ StateTree ์ง„์ž…
โ†’ MoveToLocation
โ†’ NavMesh PathFollow

๊ฒ‰๋ณด๊ธฐ์—๋Š” ์ •์ƒ ๊ตฌ์กฐ์ง€๋งŒ ์‹ค์ œ ๋™์ž‘์€

Enter โ†’ Tick โ†’ Exit โ†’ Enter ๋ฐ˜๋ณต

์ฆ‰

์ƒํƒœ ์œ ์ง€ ์‹คํŒจ + ์ด๋™ ์ฆ‰์‹œ ์ข…๋ฃŒ

์˜€๋‹ค.


๋ถ„์„

ํ•ต์‹ฌ์€ ๋‘ ๊ฐ€์ง€์˜€๋‹ค.

1. ๋ช…๋ น ์ „๋‹ฌ์€ ์ •์ƒ
2. ์ƒํƒœ ์œ ์ง€์™€ ์ด๋™ ์‹คํ–‰์ด ๋ฌธ์ œ

๋กœ๊ทธ ๊ธฐ์ค€์œผ๋กœ ํ™•์ธ๋œ ์‚ฌ์‹ค:

TargetLocation ์ •์ƒ ์ „๋‹ฌ

์ฆ‰

PlayerController โ†’ StateTree ์ง„์ž…๊นŒ์ง€๋Š” ์ •์ƒ

๋ฌธ์ œ๋Š” ์ดํ›„์˜€๋‹ค.


์›์ธ 1. StateTree ์ƒํƒœ ์žฌ์ง„์ž… ๊ตฌ์กฐ

ํ˜„์žฌ ์กฐ๊ฑด:

CurrentCommand == MoveToLocation

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

๊ฐ’์ด ์œ ์ง€๋˜๋Š” ๋™์•ˆ ์กฐ๊ฑด์ด ๊ณ„์† true
โ†’ ์ƒํƒœ ๊ณ„์† ์žฌ์ง„์ž…

๊ฒฐ๊ณผ:

Move ์ƒํƒœ๊ฐ€ ๋งค ํ”„๋ ˆ์ž„ ์ดˆ๊ธฐํ™”๋จ

์›์ธ 2. Command๋ฅผ ์ƒํƒœ๋กœ ์‚ฌ์šฉํ•œ ์„ค๊ณ„

๊ธฐ์กด:

CommandType = Move

๋ฌธ์ œ:

์ƒํƒœ๊ฐ’์ด๋ผ์„œ ๊ณ„์† ์œ ์ง€๋จ
โ†’ ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ "์ง€์† ์กฐ๊ฑด"์ด ๋จ

์›์ธ 3. PathFollow ์ฆ‰์‹œ ์ข…๋ฃŒ

ํ™•์ธ๋œ ๊ฐ€๋Šฅ์„ฑ:

EndDistanceThreshold๊ฐ€ ํผ
โ†’ ๋ชฉํ‘œ ๋„๋‹ฌ๋กœ ์ฆ‰์‹œ ํŒ์ •

์ฆ‰

์ด๋™ ์‹œ์ž‘ โ†’ ๋ฐ”๋กœ ์™„๋ฃŒ โ†’ ์ƒํƒœ ์ข…๋ฃŒ โ†’ ์žฌ์ง„์ž…

ํ•ต์‹ฌ ํ•ด๊ฒฐ ๋ฐฉํ–ฅ

์˜ค๋Š˜ ์ •๋ฆฌ๋œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฐœ๋…:

Command๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ ์ด๋ฒคํŠธ๋‹ค

์ฆ‰ ๊ตฌ์กฐ๋Š” ์ด๋ ‡๊ฒŒ ๋ฐ”๋€Œ์–ด์•ผ ํ•œ๋‹ค.

CommandType (๋ฌด์—‡์„ ํ• ์ง€)
+
CommandIssued (์ด๋ฒˆ ํ”„๋ ˆ์ž„์— ๋ฐœ์ƒํ–ˆ๋Š”์ง€)

๊ทธ๋ฆฌ๊ณ 

EnterState ์‹œ์ ์— Command ์†Œ๋น„

PlayerController ์—ญํ•  ์žฌ์ •๋ฆฌ

๊ธฐ์กด:

๋ช…๋ น ํ•ด์„ + ์‹คํ–‰๊นŒ์ง€ ๋‹ด๋‹น

๋ณ€๊ฒฝ:

๋ช…๋ น "๋ผ์šฐํŒ…" ์—ญํ• ๋งŒ ๋‹ด๋‹น
์ž…๋ ฅ
โ†’ PlayerController
โ†’ CommandId ์ „๋‹ฌ
โ†’ ์‹ค์ œ ์ฒ˜๋ฆฌ ๋Œ€์ƒ(์œ ๋‹›/๊ฑด๋ฌผ)๋กœ ์ „๋‹ฌ

์ฆ‰ Controller๋Š”

"์˜๋ฏธ๋ฅผ ์•„๋Š” ์ฃผ์ฒด" โ†’ "์ „๋‹ฌ์ž"

๋กœ ์—ญํ• ์ด ์ถ•์†Œ๋œ๋‹ค.


Subsystem โ†” UI ๊ตฌ์กฐ ๋ฌธ์ œ

๊ธฐ์กด ๊ตฌ์กฐ:

UI โ†’ UnitSubsystem ์ง์ ‘ ์ ‘๊ทผ

๋ฌธ์ œ:

Subsystem์€ replication ์•ˆ๋จ
โ†’ ํด๋ผ์ด์–ธํŠธ UI์—์„œ ์‹ ๋ขฐ ๋ถˆ๊ฐ€

ํ•ด๊ฒฐ ๊ตฌ์กฐ

ํ•ต์‹ฌ ์ „ํ™˜:

UI๋Š” PlayerState๋งŒ ๋ณธ๋‹ค

์ „์ฒด ํ๋ฆ„:

[Server]

UnitSubsystem
โ†’ ์œ ๋‹› ์ƒํƒœ ๊ด€๋ฆฌ
โ†’ ์ง‘๊ณ„๊ฐ’ ๊ณ„์‚ฐ
โ†’ PlayerState ์—…๋ฐ์ดํŠธ

-------------------------

[Replication]

PlayerState โ†’ ํด๋ผ์ด์–ธํŠธ ์ „๋‹ฌ

-------------------------

[Client]

PlayerState OnRep
โ†’ Delegate

UIBridge
โ†’ ViewModel ๊ฐฑ์‹ 

HUDCoordinator
โ†’ UI ๋ฐ˜์˜

ํ•ต์‹ฌ ์„ค๊ณ„ ํฌ์ธํŠธ

1. ์œ ๋‹› ๋ชฉ๋ก์€ ๋ณต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค

โŒ ์ „์ฒด ์œ ๋‹› ๋ฆฌ์ŠคํŠธ replication
โœ” ์ง‘๊ณ„๊ฐ’๋งŒ replication

2. PlayerState๋Š” UI ์ „์šฉ ๊ณ„์ธต

๋ฐ์ดํ„ฐ ์ €์žฅ + replication + ์ด๋ฒคํŠธ ๋ฐœ์ƒ

์˜ˆ:

OnRep_CurrentPopulation()
โ†’ Delegate Broadcast

3. Subsystem์€ ์„œ๋ฒ„ ๋กœ์ง ์ „์šฉ

UI๋ฅผ ๋ชจ๋ฆ„
โ†’ PlayerState๋งŒ ๊ฐฑ์‹ 

4. UI๋Š” ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค

UI๋Š” ํ‘œํ˜„๋งŒ ๋‹ด๋‹น
๋ฐ์ดํ„ฐ๋Š” PlayerState์—์„œ ์ œ๊ณต

์ „์ฒด ํ๋ฆ„ ์ •๋ฆฌ

์ž…๋ ฅ ๋ฐœ์ƒ
โ†’ PlayerController (๋ผ์šฐํŒ…)
โ†’ Command Fragment ์„ค์ •

StateTree
โ†’ Move ์ƒํƒœ ์ง„์ž…
โ†’ ์ด๋™ ์ˆ˜ํ–‰

(๋ฌธ์ œ)
โ†’ PathFollow ์ฆ‰์‹œ ์ข…๋ฃŒ
โ†’ ์ƒํƒœ Exit
โ†’ ์กฐ๊ฑด์œผ๋กœ ์žฌ์ง„์ž…

(ํ•ด๊ฒฐ ๋ฐฉํ–ฅ)
โ†’ Command ์ด๋ฒคํŠธํ™”
โ†’ ์ƒํƒœ ์†Œ๋น„ ๊ตฌ์กฐ

์œ ๋‹› ์ƒํƒœ ๋ณ€ํ™”
โ†’ UnitSubsystem

โ†’ PlayerState ์ง‘๊ณ„๊ฐ’ ๊ฐฑ์‹ 
โ†’ Replication

โ†’ Client PlayerState OnRep
โ†’ UIBridge

โ†’ HUDCoordinator
โ†’ UI ๋ฐ˜์˜

Before / After

ํ•ญ๋ชฉ์ด์ „์ดํ›„
Command ๊ตฌ์กฐ์ƒํƒœ ๊ธฐ๋ฐ˜์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜
StateTree๋ฐ˜๋ณต ์ง„์ž…๋‹จ๋ฐœ ์†Œ๋น„ ๊ตฌ์กฐ
PlayerControllerํ•ด์„ + ์‹คํ–‰๋ผ์šฐํ„ฐ
UI ๋ฐ์ดํ„ฐSubsystem ์ง์ ‘ ์ ‘๊ทผPlayerState ๊ธฐ๋ฐ˜
๋„คํŠธ์›Œํฌ ์•ˆ์ •์„ฑ๋‚ฎ์Œ์•ˆ์ •
๋””๋ฒ„๊น…๋ถˆ๋ช…ํ™•๋‹จ๊ณ„๋ณ„ ๋ถ„๋ฆฌ

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

  1. UI ์—ฐ๊ฒฐ ์ดํ›„ ๋ฌธ์ œ๋Š” โ€œ๋ช…๋ น ์ „๋‹ฌโ€์ด ์•„๋‹ˆ๋ผ โ€œ์‹คํ–‰ ๊ตฌ์กฐโ€์˜€๋‹ค
  2. StateTree๋Š” ์กฐ๊ฑด ๊ธฐ๋ฐ˜ ์„ค๊ณ„ ์‹œ ์‰ฝ๊ฒŒ ๋ฌดํ•œ ์žฌ์ง„์ž…์ด ๋ฐœ์ƒํ•œ๋‹ค
  3. Command๋Š” ๋ฐ˜๋“œ์‹œ ์ด๋ฒคํŠธ๋กœ ์†Œ๋น„๋˜์–ด์•ผ ํ•œ๋‹ค
  4. Subsystem์€ ์„œ๋ฒ„ ์ „์šฉ, UI๋Š” PlayerState ๊ธฐ๋ฐ˜์œผ๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค
profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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