๐Ÿ“˜ TIL - RTS ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ ๋ฆฌ๋ทฐ

HappyCircleยท2026๋…„ 5์›” 7์ผ

Unreal ๊ฐœ๋ฐœ

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

๋ฐฐ๊ฒฝ

์ด๋ฒˆ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ๋Š” ๋‹จ์ˆœํžˆ โ€œ๊ธฐ๋Šฅ์ด ๋™์ž‘ํ•˜๋Š”๊ฐ€โ€๋ณด๋‹ค,
ํ˜‘์—… ํ™˜๊ฒฝ์—์„œ ์ฝ”๋“œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ฝ๊ธฐ ์‰ฝ๊ณ  ์œ ์ง€๋ณด์ˆ˜ ๊ฐ€๋Šฅํ•œ์ง€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ๋งŽ์ด ๋ฐ›์•˜๋‹ค.

ํŠนํžˆ ์–ธ๋ฆฌ์–ผ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ”„๋กœ์ ํŠธ๋Š” ์‹œ์Šคํ…œ ๊ทœ๋ชจ๊ฐ€ ์ปค์งˆ์ˆ˜๋ก:

  • ์ดˆ๊ธฐํ™” ์ˆœ์„œ
  • ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ๋ผ์ดํ”„์‚ฌ์ดํด
  • ๊ฐ์ฒด ์ฑ…์ž„ ๋ถ„๋ฆฌ
  • ์„ฑ๋Šฅ ๊ด€๋ฆฌ

๊ฐ™์€ ์š”์†Œ๋“ค์ด ๊ณ„์† ์–ฝํžˆ๊ธฐ ๋•Œ๋ฌธ์—,
๊ตฌํ˜„ ์ž์ฒด๋ณด๋‹ค ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๊ตฌ์กฐ๊ฐ€ ๋” ์ค‘์š”ํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์ธ์ƒ์ ์ด์—ˆ๋‹ค.

์ด๋ฒˆ ํ”ผ๋“œ๋ฐฑ๋“ค์„ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์‹ค์ œ ์ฝ”๋”ฉ ์Šต๊ด€ ์ž์ฒด๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ์žก๊ฒŒ ๋๋‹ค.


์ฝ”๋“œ ํ’ˆ์งˆ๊ณผ ์ฒซ ์ธ์ƒ

๊ธฐ๋Šฅ๋ณด๋‹ค ๋จผ์ € ๋ณด์ด๋Š” ๊ฑด ์ฝ”๋“œ ์Šคํƒ€์ผ

์ด๋ฒˆ ๋ฆฌ๋ทฐ์—์„œ ๊ฐ€์žฅ ํฌ๊ฒŒ ๋“ค์—ˆ๋˜ ์ด์•ผ๊ธฐ๋Š”
โ€œ๊ตฌ์กฐ๋‚˜ ๋ฆฌํŒฉํ† ๋ง ์ด์ „์— ์ฝ”๋“œ ์ž์ฒด๊ฐ€ ์ง€์ €๋ถ„ํ•˜๋ฉด ์•ˆ ๋œ๋‹คโ€๋Š” ๋ถ€๋ถ„์ด์—ˆ๋‹ค.

์ถฉ๋ถ„ํžˆ ๋” ๊น”๋”ํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ์ธ๋ฐ๋„:

  • ํ•จ์ˆ˜๊ฐ€ ๋„ˆ๋ฌด ๊ธธ๊ฑฐ๋‚˜
  • ๋„ค์ด๋ฐ์ด ์ผ๊ด€๋˜์ง€ ์•Š๊ฑฐ๋‚˜
  • ์ฑ…์ž„ ๋ถ„๋ฆฌ๊ฐ€ ์•ˆ ๋˜์–ด ์žˆ๊ฑฐ๋‚˜
  • ๋ถˆํ•„์š”ํ•œ ๋ถ„๊ธฐ์™€ null ์ฒดํฌ๊ฐ€ ๋งŽ์œผ๋ฉด

์ฝ”๋“œ๋งŒ ๋ดค์„ ๋•Œ:

โ€œ์‹ค๋ฌด์—์„œ๋„ ์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์„ฑํ•˜๊ฒ ๊ตฌ๋‚˜โ€

๋ผ๋Š” ์ธ์ƒ์„ ๋‚จ๊ธฐ๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์ฝ”๋“œ ํ’ˆ์งˆ์ด ์˜ฌ๋ผ๊ฐˆ์ˆ˜๋ก:

  • ํ˜‘์—… ์‹ ๋ขฐ๋„ ์ฆ๊ฐ€
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์†๋„ ์ฆ๊ฐ€
  • ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ ๊ฐ์†Œ
  • ๋ฉด์ ‘ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ†ต๊ณผ ๊ฐ€๋Šฅ์„ฑ ์ฆ๊ฐ€

๊ฐ™์€ ๋ถ€๋ถ„๋“ค์ด ๊ฐ™์ด ์˜ฌ๋ผ๊ฐ„๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๊ทธ๋ž˜์„œ ๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜ ์ •๋„๋Š”:

  • ๊ตฌ์กฐ
  • ๋„ค์ด๋ฐ
  • ์ฑ…์ž„ ๋ถ„๋ฆฌ
  • ๋ฐ์ดํ„ฐ ํ๋ฆ„

๊นŒ์ง€ ์ •๋ง ๊น”๋”ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•œ ์‹œ์Šคํ…œ์„ ๋งŒ๋“ค์–ด๋ณด๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ์žก์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.


ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ํŒŒ์ผ ๊ด€๋ฆฌ

Public / Private ํด๋” ๋ถ„๋ฆฌ

์–ธ๋ฆฌ์–ผ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ฒ˜๋Ÿผ:

  • Public
  • Private

ํด๋”๋ฅผ ๋‚˜๋ˆ„๊ธด ํ–ˆ์ง€๋งŒ,
๋ฆฌ๋ทฐ์—์„œ๋Š” ์ด ๊ตฌ์กฐ๋Š” ๋ชจ๋“ˆ dependency๋ฅผ ๊ฐ•ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋Œ€๊ทœ๋ชจ ๊ตฌ์กฐ์—์„œ ์˜๋ฏธ๊ฐ€ ํฌ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํ˜„์žฌ ํ”„๋กœ์ ํŠธ ๊ทœ๋ชจ์—์„œ๋Š” ์˜คํžˆ๋ ค:

  • ํŒŒ์ผ ํƒ์ƒ‰ ์–ด๋ ค์›€
  • ๊ตฌ์กฐ ํŒŒ์•… ์‹œ๊ฐ„ ์ฆ๊ฐ€

๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ๋” ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฌด์กฐ๊ฑด ์—”์ง„ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ๋ณด๋‹ค๋Š”:

  • ๊ธฐ๋Šฅ ๋‹จ์œ„
  • ์—ญํ•  ๋‹จ์œ„
  • ์‹œ์Šคํ…œ ๋‹จ์œ„

๋กœ ํด๋”๋ฅผ ์ •๋ฆฌํ•˜๋Š” ๋ฐฉํ–ฅ๋„ ์ถฉ๋ถ„ํžˆ ๊ดœ์ฐฎ๋‹ค๋Š” ๊ฑธ ๋А๊ผˆ๋‹ค.


์ฝ”๋“œ ๋ฐฐ์น˜์™€ ํด๋ž˜์Šค ์ •๋ฆฌ

๋ผ์ดํ”„์‚ฌ์ดํด ์ˆœ์„œ๋Œ€๋กœ ์ฝ”๋“œ ๋ฐฐ์น˜

BeginPlay, Tick, EndPlay ๊ฐ™์€ ๋ผ์ดํ”„์‚ฌ์ดํด ํ•จ์ˆ˜๋“ค์ด
ํ˜ธ์ถœ ํ๋ฆ„ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉด ์ฝ”๋“œ ๋ฆฌ๋”ฉ์ด ํ›จ์”ฌ ํŽธํ•˜๋‹ค๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด:

public:
protected:
private:

์ ‘๊ทผ ์ง€์ •์ž ์ž์ฒด๋ณด๋‹ค๋„:

  • ์ƒ์„ฑ์ž
  • BeginPlay
  • Tick
  • EndPlay
  • Override
  • ์ผ๋ฐ˜ ํ•จ์ˆ˜
  • ์ฝœ๋ฐฑ
  • ๋ณ€์ˆ˜

์ˆœ์„œ ํ๋ฆ„์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ BeginPlay๋Š” Protected: ์˜์—ญ์— ๋‘๋Š” ์‹์œผ๋กœ
์–ธ๋ฆฌ์–ผ ์Šคํƒ€์ผ์„ ๋งž์ถ”๋Š” ๊ฒƒ๋„ ์ด์•ผ๊ธฐ ๋‚˜์™”๋‹ค.


Region์ด ํ•„์š”ํ•  ์ •๋„๋ฉด ๋ถ„๋ฆฌ ์‹œ์ 

์–ธ๋ฆฌ์–ผ ์ฝ”๋“œ ํŠน์„ฑ์ƒ:

  • ํ•จ์ˆ˜
  • ๋ณ€์ˆ˜
  • ํ•จ์ˆ˜
  • ๋ณ€์ˆ˜

๊ฐ€ ์„ž์ด๋ฉด์„œ ํด๋ž˜์Šค๊ฐ€ ๋น„๋Œ€ํ•ด์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฆฌ๋ทฐ์—์„œ๋Š”:

region์œผ๋กœ ์ ‘์–ด์•ผ ํ•  ์ •๋„๋ฉด ์ด๋ฏธ ๋ถ„๋ฆฌ ์‹œ์ ์ด๋‹ค

๋ผ๋Š” ์ด์•ผ๊ธฐ๊ฐ€ ์ธ์ƒ์ ์ด์—ˆ๋‹ค.

ํŠนํžˆ:

  • PlayerController
  • GameMode
  • Manager ํด๋ž˜์Šค

๋“ค์ด ๋งŒ๋Šฅ ํด๋ž˜์Šค๊ฐ€ ๋˜๊ธฐ ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์—:

  • Component ๋ถ„๋ฆฌ
  • Utility ๋ถ„๋ฆฌ
  • Subsystem ๋ถ„๋ฆฌ

๋ฅผ ์ดˆ๋ฐ˜๋ถ€ํ„ฐ ์˜์‹ํ•˜๋Š” ๊ฒŒ ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


๋„ค์ด๋ฐ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ

Resolve ์ ‘๋‘์–ด ๋‚จ์šฉํ•˜์ง€ ์•Š๊ธฐ

๊ธฐ์กด์—๋Š”:

ResolveCommandMeta()

๊ฐ™์€ ์ด๋ฆ„์„ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,
๋ฆฌ๋ทฐ์—์„œ๋Š” Resolve๋Š”:

  • ์ถฉ๋Œ ํ•ด๊ฒฐ
  • ๋‘˜ ์ค‘ ํ•˜๋‚˜ ์„ ํƒ
  • ๋ชจํ˜ธ์„ฑ ํ•ด์†Œ

๊ฐ™์€ ์ƒํ™ฉ์—์„œ๋งŒ ์“ฐ๋Š” ๊ฒŒ ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ๋Š”:

  • Get
  • Find
  • Calculate

์ •๋„๊ฐ€ ๋” ๋ช…ํ™•ํ•˜๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


ํด๋ž˜์Šค ์ด๋ฆ„๊ณผ ํ•จ์ˆ˜๋ช… ์˜๋ฏธ ์ค‘๋ณต ์ œ๊ฑฐ

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

UTWPlayerSelectionVisualComponent::GetSelectionVisualData()

๋ณด๋‹ค๋Š”:

GetVisualData()

์ฒ˜๋Ÿผ ํด๋ž˜์Šค ์ปจํ…์ŠคํŠธ์—์„œ ์ด๋ฏธ ์˜๋ฏธ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜๋ฉด
ํ•จ์ˆ˜๋ช…์€ ์ค„์—ฌ๋„ ์ถฉ๋ถ„ํ•˜๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ค์—ˆ๋‹ค.


bIs ๋Œ€์‹  b๋งŒ ์‚ฌ์šฉ

์–ธ๋ฆฌ์–ผ์—์„œ๋Š” ์ด๋ฏธ b ์ ‘๋‘๊ฐ€ bool ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—:

bIsVisible

๋ณด๋‹ค๋Š”:

bVisible

ํ˜•ํƒœ๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์‚ฌ์†Œํ•ด ๋ณด์ด์ง€๋งŒ ์ด๋Ÿฐ ๋„ค์ด๋ฐ ํ†ต์ผ์ด
ํ”„๋กœ์ ํŠธ ์ „์ฒด ์ธ์ƒ์„ ๊ฝค ๋งŽ์ด ๋ฐ”๊พผ๋‹ค๋Š” ๊ฑธ ๋А๊ผˆ๋‹ค.


์ƒ์„ฑ์ž์™€ ์ดˆ๊ธฐํ™” ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ

์ƒ์„ฑ์ž์—์„œ ๋ถ„๊ธฐ ์ตœ์†Œํ™”

์ƒ์„ฑ์ž์—์„œ:

if (GetRootComponent())

๊ฐ™์€ ๋ถ„๊ธฐ๋ฅผ ํƒ€๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ๋„ ๋ฐ›์•˜๋‹ค.

์ƒ์„ฑ์ž๋Š”:

  • ๊ฐ์ฒด ์ƒ์„ฑ ์ˆœ์„œ
  • ๋ถ€๋ชจ โ†’ ์ž์‹ ์ดˆ๊ธฐํ™” ํ๋ฆ„

์ด ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๊ฐ€๋Šฅํ•˜๋ฉด ๋‹จ์ˆœํ•œ ์ดˆ๊ธฐํ™”๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ ์ƒ์„ฑ์ž์—์„œ:

  • Virtual ํ•จ์ˆ˜ ํ˜ธ์ถœ
  • ์ƒํƒœ ์˜์กด ๋ถ„๊ธฐ
  • ๋ณต์žกํ•œ ๋กœ์ง

์€ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


๋ถ€๋ชจ ์ƒ์„ฑ์ž์—์„œ Virtual ํ˜ธ์ถœ ๊ธˆ์ง€

๊ฐ์ฒด ์ƒ์„ฑ ์‹œ์ ์€:

  • ๋ถ€๋ชจ ์ƒ์„ฑ์ž ํ˜ธ์ถœ
  • ์ž์‹ ์ƒ์„ฑ์ž ํ˜ธ์ถœ

์ˆœ์„œ์ด๊ธฐ ๋•Œ๋ฌธ์—,
๋ถ€๋ชจ ์ƒ์„ฑ์ž์—์„œ Virtual ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ
์ž์‹ ์ƒํƒœ๊ฐ€ ์•„์ง ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๊ทธ๋ž˜์„œ ์—”์ง„ ๋‚ด๋ถ€๋„:

  • Initialize ๊ณ„์—ด ํ•จ์ˆ˜
  • PostInitProperties
  • OnRegister

๊ฐ™์€ ์ „์šฉ ์ดˆ๊ธฐํ™” ํƒ€์ด๋ฐ์„ ๋”ฐ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


๋ผ์ดํ”„์‚ฌ์ดํด ๊ด€๋ฆฌ

BeginPlay์—์„œ World Null ์ฒดํฌ ์ œ๊ฑฐ

๊ธฐ์กด์—๋Š” ์Šต๊ด€์ ์œผ๋กœ:

if (!GetWorld())
{
    return;
}

๋ฅผ ๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋Š”๋ฐ,
BeginPlay ์‹œ์ ์€ ์›”๋“œ๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ
๋ณดํ†ต์€ ๋ถˆํ•„์š”ํ•œ ์ฝ”๋“œ๋ผ๊ณ  ํ•˜์…จ๋‹ค.

์˜คํžˆ๋ ค ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋ฉด:

check(GetWorld());

์ฒ˜๋Ÿผ ์ฆ‰์‹œ ํ„ฐ๋œจ๋ฆฌ๋Š” ๊ฒŒ ๋””๋ฒ„๊น…์— ๋” ๋„์›€์ด ๋œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


EndPlay์™€ Destroy ์—ญํ•  ๊ตฌ๋ถ„

์ด ๋ถ€๋ถ„์€ ๊ฝค ์ƒˆ๋กญ๊ฒŒ ๋А๊ปด์กŒ๋‹ค.

๊ธฐ์กด์—๋Š” ์ •๋ฆฌ ์ฝ”๋“œ๋ฅผ Destroy์— ๋„ฃ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์—ˆ๋Š”๋ฐ:

  • Destroy โ†’ ๋ช…์‹œ์  ์ œ๊ฑฐ
  • EndPlay โ†’ ์‹ค์ œ ์ข…๋ฃŒ ์ฒ˜๋ฆฌ

๊ฐœ๋…์œผ๋กœ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์ฆ‰:

  • BeginPlay ๋“ฑ๋ก
  • EndPlay ํ•ด์ œ

ํŒจํ„ด์ด ๊ธฐ๋ณธ์ด๋ผ๋Š” ๋А๋‚Œ์ด์—ˆ๋‹ค.


Utility์™€ ๊ณตํ†ต ํ•จ์ˆ˜ ๊ด€๋ฆฌ

Fragment ์ ‘๊ทผ ๋ž˜ํ•‘

MassEntity Fragment ์ ‘๊ทผ์„ ๋งค๋ฒˆ ์ง์ ‘ ์“ฐ๊ธฐ๋ณด๋‹ค:

UTWMassUtility::GetHealthFragment()

๊ฐ™์€ Utility ํ•จ์ˆ˜๋กœ ๊ฐ์‹ธ๋Š” ๋ฐฉํ–ฅ์„ ์ถ”์ฒœ๋ฐ›์•˜๋‹ค.

ํŠนํžˆ ํŒ€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š”:

  • ์ ‘๊ทผ ๋ฐฉ์‹ ํ†ต์ผ
  • ์‹ค์ˆ˜ ๊ฐ์†Œ
  • ์ฝ”๋“œ ๊ฐ€๋…์„ฑ ์ฆ๊ฐ€

ํšจ๊ณผ๊ฐ€ ํฌ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


Blueprint Function Library ์ ๊ทน ํ™œ์šฉ

๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์€:

  • Blueprint Function Library
  • Utility Static Class

ํ˜•ํƒœ๋กœ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ:

  • Enum ๋ณ€ํ™˜
  • DataTable ์กฐํšŒ
  • UI Text ๋ณ€ํ™˜
  • ํƒœ๊ทธ ์กฐํšŒ

๊ฐ™์€ ๋ถ€๋ถ„๋“ค์€ ๊ณตํ†ตํ™” ๊ฐ€์น˜๊ฐ€ ๋†’๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ๋ฐฉ์‹

FName ํ•˜๋“œ์ฝ”๋”ฉ ์ค„์ด๊ธฐ

๊ธฐ์กด์—๋Š”:

FName("Enemy")

ํ˜•ํƒœ๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,
ํƒœ๊ทธ๋“ค์€ ๋ณ„๋„ ํ—ค๋”๋‚˜ ํด๋ž˜์Šค์— ๋ชจ์•„๋†“๊ณ  ์“ฐ๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์˜ˆ์‹œ ๋А๋‚Œ:

namespace TWTags
{
    static const FName Enemy;
}

์‹ค์ˆ˜๋„ ์ค„๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์›Œ์ง„๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


GameplayTag ์ ๊ทน ํ™œ์šฉ

์•กํ„ฐ ํƒœ๊ทธ ๊ธฐ๋ฐ˜ ์กฐํšŒ๋Š” ์–ด์ฉ” ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ์•„๋‹ˆ๋ฉด ์ง€์–‘ํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๋ฐ˜๋ฉด GameplayTag๋Š”:

  • ini ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ
  • Enum์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐํ™” ๊ฐ€๋Šฅ

ํ•ด์„œ ์ถฉ๋ถ„ํžˆ ๊ดœ์ฐฎ์€ ๋ฐฉ์‹์ด๋ผ๊ณ  ํ•˜์…จ๋‹ค.


String ๋Œ€์‹  Enum ์‚ฌ์šฉ

์ƒํƒœ๋‚˜ ์ด์œ ๋ฅผ ๋ฌธ์ž์—ด๋กœ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๊ธฐ๋ณด๋‹ค:

enum class EEnqueueUnitResult

ํ˜•ํƒœ๋กœ ์ •์˜ํ•˜๊ณ ,
UI์—์„œ๋Š” Enum์— ๋งž๋Š” Text๋ฅผ ๋งคํ•‘ํ•˜๋Š” ๋ฐฉ์‹์ด ๋” ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ:

  • ๋‹ค๊ตญ์–ด ๋Œ€์‘
  • UI ๋ณ€๊ฒฝ
  • ๋””๋ฒ„๊น…
  • ์œ ์ง€๋ณด์ˆ˜

์ธก๋ฉด์—์„œ ์žฅ์ ์ด ํฌ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


Enum ๊ฐ’ ๊ตฌ์„ฑ ๋ฐฉ์‹์€ Unreal ์Šคํƒ€์ผ์— ๋งž์ถ”๊ธฐ

๊ธฐ์กด์—๋Š” ๋‹จ์ˆœํžˆ:

bool CanEnqueue(...);

ํ˜•ํƒœ ๋Œ€์‹  Enum์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉํ–ฅ์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋กœ ์ดํ•ดํ–ˆ๋Š”๋ฐ,
์‹ค์ œ ํ”ผ๋“œ๋ฐฑ ์˜๋„๋Š” Unreal์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” Enum ๊ตฌ์„ฑ ์Šคํƒ€์ผ์— ๋งž์ถ”์ž๋Š” ์ชฝ์— ๊ฐ€๊นŒ์› ๋‹ค.

ํŠนํžˆ ์–ธ๋ฆฌ์–ผ์—์„œ๋Š” ๋ณดํ†ต:

enum class EEnqueueUnitResult : uint8
{
    None = 0,
    Success,
    QueueFull,
    InvalidUnit,
    Max
};

ํ˜•ํƒœ์ฒ˜๋Ÿผ:

  • None = 0
  • ๋งˆ์ง€๋ง‰ Max ์ถ”๊ฐ€

ํŒจํ„ด์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑํ•˜๋ฉด:

  • ๊ธฐ๋ณธ ์ดˆ๊ธฐ๊ฐ’ ๊ด€๋ฆฌ๊ฐ€ ์‰ฌ์›Œ์ง€๊ณ 
  • Enum Count ๊ณ„์‚ฐ ๊ฐ€๋Šฅํ•˜๊ณ 
  • ๋ฐ˜๋ณต๋ฌธ์ด๋‚˜ ๋ฐฐ์—ด ์ธ๋ฑ์‹ฑ ์ฒ˜๋ฆฌ ํŽธํ•˜๊ณ 
  • UEnum::GetValueAsString
  • StaticEnum<>()
  • Enum Utility ํ•จ์ˆ˜

๊ฐ™์€ ์–ธ๋ฆฌ์–ผ ๋‚ด๋ถ€ ๊ธฐ๋Šฅ๋“ค๊ณผ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ Max๋ฅผ ํ†ตํ•ด:

static_cast<int32>(EEnqueueUnitResult::Max)

ํ˜•ํƒœ๋กœ ์ „์ฒด ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ํŒจํ„ด๋„ ์–ธ๋ฆฌ์–ผ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ€์ผ์ด๋ผ๋Š” ์ ์ด ์ธ์ƒ์ ์ด์—ˆ๋‹ค.


DataTable๊ณผ ์บ์‹ฑ

GetAllRows ๋ฐ˜๋ณต ์‚ฌ์šฉ ์ค„์ด๊ธฐ

์—…๊ทธ๋ ˆ์ด๋“œ Row ๊ฐ™์€ ๊ฒฝ์šฐ
๋งค๋ฒˆ GetAllRows() ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค:

  • ์ดˆ๊ธฐํ™” ์‹œ์  ์บ์‹ฑ
  • TMap ๊ตฌ์„ฑ
  • FindRow ํ™œ์šฉ

ํ˜•ํƒœ๊ฐ€ ๋” ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๊ฒŒ์ž„ ์ค‘ ๋ฐ˜๋ณต ์กฐํšŒ๋Š”
์บ์‹ฑ ๊ตฌ์กฐ๋ฅผ ๋จผ์ € ๊ณ ๋ฏผํ•˜๋Š” ์Šต๊ด€์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


์„ฑ๋Šฅ ๊ด€๋ จ ํ”ผ๋“œ๋ฐฑ

UGameplayStatics ๋‚จ์šฉ ์ฃผ์˜

ํŠนํžˆ:

GetAllActorsOfClass
GetAllActorsWithInterface

๊ฐ™์€ ํ•จ์ˆ˜๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ „์ฒด ์•กํ„ฐ ์ˆœํšŒ๋ฅผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—
Tick์ด๋‚˜ ๋ฐ˜๋ณต ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๊ฐ€๋Šฅํ•˜๋ฉด:

  • Subsystem ์บ์‹ฑ
  • ๋“ฑ๋ก ๊ตฌ์กฐ
  • Iterator ์ œํ•œ

๋ฐฉ์‹์œผ๋กœ ๋ฐ”๊พธ๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


ISM ๊ฐฑ์‹  ๋ฐฉ์‹ ๊ฐœ์„ 

์„ ํƒ ๋ง ๊ฐ™์€ ์›”๋“œ UI ์‹œ์Šคํ…œ์—์„œ:

  • ๋งค๋ฒˆ Clear
  • ๋‹ค์‹œ Add

ํ•˜๋Š” ๊ตฌ์กฐ๋ณด๋‹ค:

  • AddInstance
  • RemoveInstance
  • UpdateInstanceTransform

์ค‘์‹ฌ ๊ตฌ์กฐ๊ฐ€ ๋” ์•ˆ์ •์ ์ด๋ผ๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ InstanceIndex๋ฅผ ๊ตฌ์กฐ์ฒด๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.


๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ๊ตฌ์กฐ ๊ด€๋ จ

HandleStartingNewPlayer ํ†ตํ•ฉ

ํ˜„์žฌ๋Š”:

  • PostLogin
  • HandleSeamlessTravelPlayer

๋ฅผ ๋‚˜๋ˆ ์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,
HandleStartingNewPlayer ๊ธฐ์ค€์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉํ–ฅ์ด ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด๋Š” ์ดˆ๊ธฐํ™” ํƒ€์ด๋ฐ์ด ๊ฐ€์žฅ ์œ„ํ—˜ํ•œ ์˜์—ญ์ด๋ผ๋Š” ๊ฑธ ๋‹ค์‹œ ๋А๊ผˆ๋‹ค.


PlayerState ๋ฐ์ดํ„ฐ ๋ถ„๋ฆฌ

PlayerState๋Š”:

  • ๋ชจ๋‘์—๊ฒŒ ๋ณด์—ฌ์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ
  • Owner๋งŒ ๋ด์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ

๋ฅผ ๋ถ„๋ฆฌํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

ํŠนํžˆ:

DOREPLIFETIME_CONDITION

์„ ํ™œ์šฉํ•˜๋ฉด:

  • OwnerOnly
  • SkipOwner
  • InitialOnly

๊ฐ™์€ ์„ธ๋ถ€ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์ ๋„ ๋‹ค์‹œ ์ •๋ฆฌํ•˜๊ฒŒ ๋๋‹ค.


Subsystem๊ณผ ์—”์ง„ ๊ธฐ๋Šฅ ํ™œ์šฉ

FogManager Subsystemํ™”

FogManager ๊ฐ™์€ ๊ฒฝ์šฐ๋„
์•กํ„ฐ ํ˜•ํƒœ๋ณด๋‹ค:

UTickableWorldSubsystem

ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๋ฉด:

  • Tick ๊ฐ€๋Šฅ
  • ์ ‘๊ทผ ํŽธ์˜์„ฑ ์ฆ๊ฐ€
  • ๊ด€๋ฆฌ ๋‹จ์ˆœํ™”

์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


DeveloperSettings ํ™œ์šฉ

๊ธฐ์กด์—๋Š” ๊ฒฝ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ์ด๋‚˜:

ConstructorHelpers::FClassFinder

๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ,
UDeveloperSettings ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ๊ฐ€ ๋” ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด:

GetDefault<UTWGameSettings>()

ํ˜•ํƒœ๋กœ ์–ธ์ œ๋“  ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ณ ,
SoftPtr ๊ธฐ๋ฐ˜ ๊ด€๋ฆฌ๋„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค๊ณ  ํ•˜์…จ๋‹ค.


UI์™€ ์—”์ง„ ๊ธฐ๋Šฅ ํ™œ์šฉ

MVVM ํ”Œ๋Ÿฌ๊ทธ์ธ ํ™œ์šฉ

MVMM์„ ์ง์ ‘ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ MVMM์˜ ๊ธฐ๋Šฅ์ ์ธ ํ™œ์šฉ๋„๋ฅผ ์ ๊ทน์ ์œผ๋กœ ๋ฐ˜์˜ํ•˜์ง€ ๋ชปํ–ˆ๋˜ ๋ถ€๋ถ„์ด ์กด์žฌํ•ด์„œ
์–ธ๋ฆฌ์–ผ MVVM ํ”Œ๋Ÿฌ๊ทธ์ธ์— ์ผ๋ถ€ ๊ธฐ๋Šฅ ๋ฒ ํƒ€์ง€๋งŒ:

  • ํฌํŠธ๋‚˜์ดํŠธ ๋“ฑ์—์„œ๋„ ์‚ฌ์šฉ
  • ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ ์ง€์›
  • ์ฝœ๋ฐฑ ๊ตฌ์กฐ ์ง€์›

๋“ฑ ์žฅ์ ์ด ์žˆ์–ด์„œ ์ ๊ทน ํ™œ์šฉํ•ด๋ณด๊ณ  ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ ์†Œ์Šค์ฝ”๋“œ ๋ณด๊ณ  ์ˆ˜์ •ํ•ด์„œ ํ™œ์šฉํ•˜๋Š”๊ฒŒ ๊ดœ์ฐฎ์„ ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์…จ๋‹ค..


์—”์ง„ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ์ ๊ทน ํ™œ์šฉ

์ปค์„œ ๋ณ€๊ฒฝ ๊ฐ™์€ ๊ฒƒ๋„ ์ง์ ‘ ๊ตฌํ˜„๋ณด๋‹ค:

SetMouseCursorWidget()

๊ฐ™์€ ์—”์ง„ ๊ธฐ๋Šฅ์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜๋Š” ๊ฒŒ ์ข‹๋‹ค๊ณ  ํ•˜์…จ๋‹ค.

์ด๋ฒˆ ๋ฆฌ๋ทฐ๋ฅผ ํ†ตํ•ด
์—”์ง„์ด ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ํ™œ์šฉํ•ด์„œ ์ž‘์—… ์†Œ์š”๋Ÿ‰์„ ์ค„์ด๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•ด์•ผ๊ฒ ๋‹ค.


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

์ด๋ฒˆ ์ฝ”๋“œ ๋ฆฌ๋ทฐ์—์„œ๋Š” ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„๋ณด๋‹ค
โ€œํ˜‘์—… ๊ธฐ์ค€์—์„œ ์–ผ๋งˆ๋‚˜ ์ฝ๊ธฐ ์ข‹์€ ์ฝ”๋“œ์ธ๊ฐ€โ€์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ์ •๋ง ๋งŽ์ด ๋ฐ›์•˜๋‹ค.

ํŠนํžˆ ์–ธ๋ฆฌ์–ผ ๋ฉ€ํ‹ฐํ”Œ๋ ˆ์ด ํ”„๋กœ์ ํŠธ๋Š”:

  • ๋ผ์ดํ”„์‚ฌ์ดํด
  • ์ดˆ๊ธฐํ™” ์ˆœ์„œ
  • ๋ฆฌํ”Œ๋ฆฌ์ผ€์ด์…˜
  • ์„ฑ๋Šฅ
  • ์ฑ…์ž„ ๋ถ„๋ฆฌ

๊ฐ™์€ ์š”์†Œ๋“ค์ด ๊ณ„์† ์–ฝํžˆ๊ธฐ ๋•Œ๋ฌธ์—,
์ดˆ๋ฐ˜๋ถ€ํ„ฐ ์ฝ”๋“œ ์Šคํƒ€์ผ๊ณผ ๊ตฌ์กฐ๋ฅผ ์˜์‹ํ•˜๋Š” ๊ฒŒ ๊ต‰์žฅํžˆ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฑธ ๋‹ค์‹œ ๋А๊ผˆ๋‹ค.

๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ ์–ด๋„ ํ•œ ์‹œ์Šคํ…œ ์ •๋„๋Š”
โ€œ๊ธฐ๋Šฅ๋„ ์•ˆ์ •์ ์ด๊ณ  ์ฝ”๋“œ๋„ ๊น”๋”ํ•˜๋‹คโ€๋Š” ๋А๋‚Œ์œผ๋กœ ๋๊นŒ์ง€ ๊ด€๋ฆฌํ•ด๋ณด๋Š” ๊ฑธ ๋ชฉํ‘œ๋กœ ํ•ด๋ด์•ผ๊ฒ ๋‹ค.

profile
๊ฐœ๋ฐœํ•ฉ์‹œ๋‹ค!

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