๐Ÿ“˜TIL - ์ „ํˆฌ ์„œ๋ธŒ์‹œ์Šคํ…œ ์ ์šฉ ๋ฐ UI ์—ฐ๋™, ์นด์˜ค์Šค ํŒŒ๊ดด ๊ตฌํ˜„

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

Unreal ๊ฐœ๋ฐœ

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

๋ฌธ์ œ

์ด๋ฒˆ ์ „ํˆฌ ์‹œ์Šคํ…œ์„ ์‹ค์ œ ํ”Œ๋ ˆ์ด ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๊นŒ์ง€ ๋ถ™์ด๋Š” ๊ณผ์ •์—์„œ ๋‹จ์ˆœ ๊ธฐ๋Šฅ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ โ€œ์™œ ์ด๋ ‡๊ฒŒ ์•ˆ ๋˜์ง€?โ€ ์‹ถ์€ ์ง€์ ๋“ค์ด ์—ฌ๋Ÿฌ ๊ตฐ๋ฐ์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

๋ฌธ์ œ์ฒด๊ฐ๋œ ์ƒํ™ฉ
HPBar ๊ฐฑ์‹  ์•ˆ๋จ์  ์ฒด๋ ฅ์€ ์ค„์–ด๋“œ๋Š”๋ฐ HP๋ฐ”๋Š” ๊ทธ๋Œ€๋กœ
EnemyRef None์œ„์ ฏ์—์„œ Accessed None ๊ณ„์† ๋ฐœ์ƒ
HP๋ฐ” ์œ„์น˜/ํ‘œํ˜„ ์ด์ƒ๋จธ๋ฆฌ ์œ„์— ๋ถ™์–ด์žˆ์ง€ ์•Š๊ณ  ๋‘ฅ๋‘ฅ ๋– ๋‹ค๋‹˜
ํƒ€์ด๋จธ UI ์ด์ƒ์ „ํˆฌ ์‹œ๊ฐ„์€ ํ๋ฅด๋Š”๋ฐ UI ์ˆซ์ž๋Š” ๊ทธ๋Œ€๋กœ
Chaos ํŒŒ๊ดด ๋ฏธ๋™์ž‘์ ์ด ์ฃฝ์œผ๋ฉด ๊ทธ๋ƒฅ ์‚ฌ๋ผ์ง€๊ณ  ํŒŒํŽธ์ด ์•ˆ ๋‚˜์˜ด

๋ถ„์„


1. HPBar ๊ฐฑ์‹  ๋ฌธ์ œ

์ฒ˜์Œ์—” ๋‹จ์ˆœํžˆ โ€œ๋ฐ”์ธ๋”ฉ์ด ์•ˆ ๋˜๋Š” ๊ฑด๊ฐ€?โ€๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, ์‹ค์ œ๋กœ๋Š” ๊ฐ’ ์ž์ฒด๋ฅผ ์ž˜๋ชป ์ฝ๊ณ  ์žˆ์—ˆ๋‹ค.

๋ฐ๋ฏธ์ง€ ์ ์šฉ
โ†’ AttributeSet Health ๊ฐ์†Œ
โ†’ UI์—์„œ๋Š” ๋ณ€ํ™” ์—†์Œ

์ด๊ฑธ ๋กœ๊ทธ๋กœ ์ฐ์–ด๋ณด๋‹ˆ๊นŒ:

CurrentHealth: 100 / MaxHealth: 100
(๊ณ„์† ๋™์ผ)

์ฆ‰, HP๋Š” ์ค„๊ณ  ์žˆ๋Š”๋ฐ UI๋Š” ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์žˆ์—ˆ๋‹ค.


์›์ธ

  • AttributeSet ๋ฉค๋ฒ„๋ฅผ ์ง์ ‘ ๋“ค๊ณ  ์žˆ์—ˆ์Œ
  • ์‹ค์ œ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ’์€ ASC ๋‚ด๋ถ€ AttributeSet

์ฆ‰ ๊ตฌ์กฐ๊ฐ€ ์ด๋ ‡๊ฒŒ ๊ผฌ์—ฌ ์žˆ์—ˆ์Œ:

ASC ๋‚ด๋ถ€ AttributeSet (์ง„์งœ ๊ฐ’)
        vs
Actor ๋ฉค๋ฒ„ AttributeSet (UI๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ๊ฐ’)

2. EnemyRef None ๋ฌธ์ œ

์ด๊ฑด ๋กœ๊ทธ ๋ณด๊ณ  ๋ฐ”๋กœ ๊ฐ ์žกํ˜”๋‹ค.

Accessed None trying to read EnemyRef

ํ๋ฆ„์„ ๋ณด๋ฉด:

Widget ์ƒ์„ฑ
โ†’ Percent ๋ฐ”์ธ๋”ฉ ๋จผ์ € ์‹คํ–‰
โ†’ EnemyRef ์—†์Œ
โ†’ ํ„ฐ์ง

์ฆ‰ ๋ฌธ์ œ๋Š” ์ฐธ์กฐ ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ โ€œ์„ธํŒ… ํƒ€์ด๋ฐโ€์ด์—ˆ๋‹ค.


3. World Space HPBar ๋ฌธ์ œ

Screen Space์—์„œ๋Š” ๊ดœ์ฐฎ๋˜ ๊ฒŒ
World Space๋กœ ๋ฐ”๊พธ๋‹ˆ๊นŒ ์ด์ƒํ•ด์กŒ๋‹ค.

- ์•ˆ ๋ณด์ž„
- ๋’ค์ง‘ํž˜
- ์œ„์น˜ ์–ด์ƒ‰ํ•จ

์ด๊ฑด UI๊ฐ€ ์•„๋‹ˆ๋ผ 3D ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ


4. ํƒ€์ด๋จธ UI ๋ฌธ์ œ

์ฒ˜์Œ์—” ์ด๋ฒคํŠธ๋กœ๋งŒ ์ฒ˜๋ฆฌํ–ˆ๋Š”๋ฐ ์ด์ƒํ–ˆ๋‹ค.

์ „ํˆฌ ์‹œ์ž‘ โ†’ 5์ดˆ ํ‘œ์‹œ
5์ดˆ ์ง€๋‚˜๋„ โ†’ ๊ณ„์† 5

์ฆ‰ ์ด๋ฒคํŠธ๋Š” ์˜ค๋Š”๋ฐ ์‹œ๊ฐ„์ด ์ค„์–ด๋“œ๋Š” ๊ฑด ๋ฐ˜์˜์ด ์•ˆ ๋จ


5. Chaos ํŒŒ๊ดด ๋ฌธ์ œ

HP 0๋˜๋ฉด:

DestroyActor()
โ†’ ๊ทธ๋ƒฅ ์‚ฌ๋ผ์ง

์›๋ž˜ ๊ธฐ๋Œ€๋Š”:

โ†’ ์™€์žฅ์ฐฝ ๋ถ€์„œ์ง

๊ทผ๋ฐ ์ „ํ˜€ ์•ˆ ์ผ์–ด๋‚จ


ํ•ด๊ฒฐ


1. HPBar ๊ฐฑ์‹  ๊ตฌ์กฐ ์ˆ˜์ •

ํ•ต์‹ฌ์€ ํ•˜๋‚˜์˜€๋‹ค.

ASC ๊ธฐ์ค€์œผ๋กœ ์ฝ์–ด์•ผ ํ•œ๋‹ค

์ˆ˜์ • ๋ฐฉ์‹

const UMyAttributeSet* Attr = AbilitySystemComponent->GetSet<UMyAttributeSet>();

๊ตฌ์กฐ ์ •๋ฆฌ

๊ธฐ์กด (๋ฌธ์ œ)
Actor โ†’ AttributeSet (์ž˜๋ชป๋œ ๊ฐ’)

์ˆ˜์ • (์ •์ƒ)
Actor โ†’ ASC โ†’ AttributeSet (์‹ค์ œ ๊ฐ’)

์ด๊ฑฐ ๋ฐ”๊พธ๋‹ˆ๊นŒ ๋ฐ”๋กœ HP๋ฐ” ์ •์ƒ ๋™์ž‘


2. EnemyRef ํƒ€์ด๋ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ

์ด๊ฑด ๊ตฌ์กฐ๋ณด๋‹ค ํƒ€์ด๋ฐ์ด ๋ฌธ์ œ์˜€๋‹ค.


ํ•ด๊ฒฐ ๋ฐฉ์‹

BeginPlay
โ†’ Delay(0.0)
โ†’ Get User Widget Object
โ†’ Set EnemyRef(Self)

ํ•ต์‹ฌ

๋ฌธ์ œ๋Š” ์ฐธ์กฐ๊ฐ€ ์•„๋‹ˆ๋ผ "์–ธ์ œ ๋„ฃ๋А๋ƒ"

๊ทธ๋ฆฌ๊ณ  UI์ชฝ๋„ ๋ฐฉ์–ด์ฝ”๋“œ ์ถ”๊ฐ€

IsValid(EnemyRef)
โ†’ false๋ฉด ๊ธฐ๋ณธ๊ฐ’

์ด๊ฑฐ ๋„ฃ์œผ๋‹ˆ๊นŒ ์—๋Ÿฌ ์™„์ „ํžˆ ์‚ฌ๋ผ์ง


3. World Space HPBar ์•ˆ์ •ํ™”

์ด๊ฑด UI๊ฐ€ ์•„๋‹ˆ๋ผ ์›”๋“œ ์˜ค๋ธŒ์ ํŠธ์ฒ˜๋Ÿผ ๋‹ค๋ค„์•ผ ํ–ˆ๋‹ค


์ ์šฉ ์„ค์ •

ํ•ญ๋ชฉ๊ฐ’
SpaceWorld
Pivot(0.5, 1.0)
์œ„์น˜๋จธ๋ฆฌ ์œ„
Draw Size์ถฉ๋ถ„ํžˆ ํฌ๊ฒŒ

์ถ”๊ฐ€ ์ฒ˜๋ฆฌ

Tick
โ†’ ์นด๋ฉ”๋ผ ๋ฐฉํ–ฅ์œผ๋กœ ํšŒ์ „

ํ•ต์‹ฌ ํฌ์ธํŠธ

Screen Space = UI
World Space = 3D ์˜ค๋ธŒ์ ํŠธ

์ด ์ฐจ์ด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์ ‘๊ทผํ•ด์•ผ ํ–ˆ๋‹ค.


4. ํƒ€์ด๋จธ UI ๊ฐฑ์‹  ๊ตฌ์กฐ ์ˆ˜์ •

์ด๊ฑด ๊ตฌ์กฐ๋ฅผ ๋‚˜๋ˆ ์•ผ ํ•ด๊ฒฐ๋๋‹ค.


์ž˜๋ชป๋œ ์ ‘๊ทผ

Event๋งŒ ์‚ฌ์šฉ
โ†’ ๊ฐ’ ์•ˆ ์ค„์–ด๋“ฆ

์ˆ˜์ • ๊ตฌ์กฐ

์ด๋ฒคํŠธ + ํƒ€์ด๋จธ ํ˜ผํ•ฉ

์ ์šฉ ํ๋ฆ„

OnCombatTimerUpdated
โ†’ ์ดˆ๊ธฐ๊ฐ’ ์„ธํŒ…

SetTimer (0.1์ดˆ)
โ†’ GetRemainingCombatTime()
โ†’ UI ๊ฐฑ์‹ 

ํ•ต์‹ฌ

์ด๋ฒคํŠธ = ์ƒํƒœ ๋ณ€ํ™”
ํƒ€์ด๋จธ = ์‹œ๊ฐ„ ํ๋ฆ„

5. Chaos ํŒŒ๊ดด ์ ์šฉ

์ด๊ฑด ์™„์ „ํžˆ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๋ฌธ์ œ์˜€๋‹ค.


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

StaticMesh
โ†’ DestroyActor()
โ†’ ๋

์ˆ˜์ • ๊ตฌ์กฐ

GeometryCollection
โ†’ Physics
โ†’ Fracture

์ ์šฉ ๊ณผ์ •

  1. StaticMesh โ†’ GeometryCollection ์ƒ์„ฑ
  2. Enemy Mesh ๊ต์ฒด
  3. Physics ํ™œ์„ฑํ™”
  4. Threshold ๋‚ฎ์ถค

ํŒŒ๊ดด ํ๋ฆ„

HP <= 0
โ†’ Physics ํ™œ์„ฑํ™”
โ†’ Chaos Fracture ๋ฐœ์ƒ

ํ•ต์‹ฌ ํฌ์ธํŠธ

ํ•ญ๋ชฉ์„ค๋ช…
Threshold๋‚ฎ์ถฐ์•ผ ํŒŒ๊ดด๋จ
DestroyActor๋ฐ”๋กœ ํ•˜๋ฉด ์•ˆ ๋จ
Physics์ผœ์•ผ ์›€์ง์ž„
Mesh ํƒ€์ž…GeometryCollection ํ•„์ˆ˜

๊ฒฐ๊ณผ


์ „์ฒด ํ๋ฆ„

[๋ฐ๋ฏธ์ง€ ์ ์šฉ]
        โ†“
[ASC Attribute ๊ฐ์†Œ]
        โ†“
[Subsystem ์ƒํƒœ ์—…๋ฐ์ดํŠธ]
        โ†“
[Event Broadcast]
        โ†“
[UI ๋ฐ˜์˜]
        โ†“
[Enemy ์‚ฌ๋ง]
        โ†“
[Chaos ํŒŒ๊ดด]

๊ธฐ๋Šฅ ์ƒํƒœ

๊ธฐ๋Šฅ์ƒํƒœ
์ „ํˆฌ ์ƒํƒœ ๊ด€๋ฆฌ์™„๋ฃŒ
ํƒ€์ด๋จธ ๋ฆฌ์…‹์™„๋ฃŒ
์ž๋™ ์ข…๋ฃŒ์™„๋ฃŒ
HP๋ฐ” ์ •์ƒ ๊ฐฑ์‹ ์™„๋ฃŒ
EnemyRef ์•ˆ์ •ํ™”์™„๋ฃŒ
World Space UI์™„๋ฃŒ
ํƒ€์ด๋จธ UI ๊ฐฑ์‹ ์™„๋ฃŒ
Chaos ํŒŒ๊ดด์™„๋ฃŒ
์ „ํˆฌ ํ†ต๊ณ„์™„๋ฃŒ

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

์ „ํˆฌ ์‹œ์Šคํ…œ ๊ตฌํ˜„์—์„œ ์ค‘์š”ํ•œ ๊ฑด ๊ธฐ๋Šฅ ์ž์ฒด๋ณด๋‹ค ๋ฐ์ดํ„ฐ ํ๋ฆ„(ASC) โ†’ ์ƒํƒœ(Subsystem) โ†’ ์ด๋ฒคํŠธ(UI) โ†’ ํ‘œํ˜„(Widget/Physics)๋ฅผ ์ •ํ™•ํžˆ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ๊ณ , ๋Œ€๋ถ€๋ถ„ ๋ฌธ์ œ๋Š” ๋กœ์ง์ด ์•„๋‹ˆ๋ผ **์ฐธ์กฐ ํƒ€์ด๋ฐ๊ณผ ์‹œ์Šคํ…œ ์ดํ•ด ๋ถ€์กฑ์—์„œ ๋ฐœ์ƒํ–ˆ๋‹ค.

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

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