GUI overview - kuimoani/defold GitHub Wiki

GUI

Defold๋Š” ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ตฌ์„ฑ๊ณผ ๊ตฌํ˜„์„ ์œ„ํ•ด ๋งž์ถคํ˜• ์ปค์Šคํ…€ GUI ์—๋””ํ„ฐ์™€ ๊ฐ•๋ ฅํ•œ ์Šคํฌ๋ฆฝํŒ… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋งค๋‰ด์–ผ์€ ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

Defold์˜ ๊ทธ๋ž˜ํ”ฝ ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค(graphical user interface)๋Š” ์ปฌ๋ ‰์…˜์— ๋ฐฐ์น˜๋œ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์— ์ฒจ๋ถ€ํ•˜๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ์ด ์ปดํฌ๋„ŒํŠธ๋Š” ์•„๋ž˜์˜ ํ”„๋กœํผํ‹ฐ๋“ค์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค์˜ ํ•ด์ƒ๋„(resolution)์™€ ์ข…ํšก๋น„(aspect ratio)๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋งํ•˜๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๊ฐ•๋ ฅํ•œ ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ
  • gui ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ๋…ผ๋ฆฌ ๋™์ž‘(logic behavior)์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฒŒ์ž„์˜ ํ”Œ๋ ˆ์ด ํ™”๋ฉด๊ณผ๋Š” ๋ณ„๋„๋กœ ์ปจํ…์ธ  ์œ„์ชฝ(on top)์—์„œ ๋ Œ๋”๋ง๋จ
  • ์นด๋ฉ”๋ผ ๋ทฐ๊ฐ€ ๋…๋ฆฝ์ ์ธ ํ™”๋ฉด ๊ณต๊ฐ„์˜ ์ขŒํ‘œ ์‹œ์Šคํ…œ(screen-space coordinate system)์— ๋งž์ถฐ ๋ Œ๋”๋ง๋˜๋ฉฐ, ์นด๋ฉ”๋ผ๋ฅผ ์›€์ง์ด๋”๋ผ๋„ GUI ์š”์†Œ๋Š” ํ™”๋ฉด์— ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ

GUI๋Š” ์ปฌ๋ ‰์…˜์˜ ์ขŒํ‘œ๊ณ„์— ์†ํ•˜์ง€ ์•Š๊ณ , ๊ฒŒ์ž„ ๋ทฐ์™€๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— GUI๋ฅผ ์ปฌ๋ ‰์…˜ ์—๋””ํ„ฐ์—์„œ ํŠน์ • ์œ„์น˜์— ๋ฐฐ์น˜ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์‹œ๊ฐ์  ํ‘œํ˜„(visual representation)์„ ๊ฐ€์ง€์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ GUI ์ปดํฌ๋„ŒํŠธ๋Š” ์ปฌ๋ ‰์…˜์— ์œ„์น˜ํ•œ ๊ฒŒ์ž„์˜ค๋ธŒ์ ํŠธ์— ์ƒ์ฃผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊ฟ”๋„ GUI์—๋Š” ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ๋™์ž‘์€ ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ํ™”๋ฉด์˜ ํŠน์ • ์ง€์ ์— HUD ํ•ญ๋ชฉ๊ณผ ๋ฉ”๋‰ด๊ฐ€ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ฒŒ์ž„ ๋ทฐ์˜ ์ƒ์œ„(top)์— ๋ณ„๋„์˜ ์‹œ๊ฐ์  ํ‘œํ˜„์ธ "๋ ˆ์ด์–ด(layer)"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ •๋ ฌ(arrangement)ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์ง ํ•ฉ๋‹ˆ๋‹ค.

Nodes

GUI ์ปดํฌ๋„ŒํŠธ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์•„๋ž˜ ํ•ญ๋ชฉ์— ํ•ด๋‹นํ•˜๋Š” ์‹œ๊ฐ์  ์˜ค๋ธŒ์ ํŠธ์ž…๋‹ˆ๋‹ค.

  • Box node, ์‚ฌ๊ฐํ˜•์— ์ƒ‰์ƒ์ด๋‚˜ ํ…์Šค์ณ๋กœ ์ฑ„์›Œ์ง
  • Text node, ์ž์„ธํ•œ ๊ฒƒ์€ Text nodes ๋ฌธ์„œ ์ฐธ๊ณ 
  • Pie node, ์ž์„ธํ•œ ๊ฒƒ์€ Pie nodes ๋ฌธ์„œ ์ฐธ๊ณ 
  • Template node, ์ž์„ธํ•œ ๊ฒƒ์€ Template nodes ๋ฌธ์„œ ์ฐธ๊ณ 
  • Spine node, ์ž์„ธํ•œ ๊ฒƒ์€ Spine nodes ๋ฌธ์„œ ์ฐธ๊ณ 

๋…ธ๋“œ๋Š” ๋‹จ์ˆœํ•˜๊ณ  ์–ด๋– ํ•œ ๋กœ์ง๋„ ํฌํ•จํ•˜๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—๋””ํ„ฐ์ƒ์—์„œ๋‚˜ ๋Ÿฐํƒ€์ž„์‹œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•˜์—ฌ ์ด๋™(translate or move)ํ•˜๊ฑฐ๋‚˜ ๋ถ€-๋ชจ ๊ด€๊ณ„๋ฅผ ์ •๋ ฌ(order)์‹œํ‚ฌ ์ˆ˜๋Š” ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๋กœ GUI ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์—๊ฒŒ ์ง์ ‘์ ์œผ๋กœ ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ณ (์•„๋ž˜ Property animation ์ฐธ๊ณ ) ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Box node์˜ ํ”Œ๋ฆฝ๋ถ(flipbook) ์• ๋‹ˆ๋ฉ”์ด์…˜ ๊ทธ๋ฆฌ๊ณ  Spine node์˜ ๋ณธ(bone) ์• ๋‹ˆ๋ฉ”์ด์…˜).

"Nodes" ํด๋”์—์„œ ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ "Add Box", "Add Text", "Add Pie", "Add Template", "Add Spine Node" ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Add nodes

์ƒ๋‹จ์˜ GUI ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค "I" ์™€ "O"๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ box๋‚˜ text ๋…ธ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ์น˜๋œ ๋…ธ๋“œ๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์›€์ง์ด๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ปฌ๋ ‰์…˜ ์—๋””ํ„ฐ์ƒ์—์„œ ์ด๋™ํ•˜๊ณ  ํšŒ์ „์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Node properties

๊ฐ ๋…ธ๋“œ์—๋Š” ์ด๋“ค์˜ ์™ธํ˜•(appearance)์„ ์ œ์–ดํ•˜๋Š” ๋งŽ์€ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Position, Rotation, Scale, Size (์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ๊ฐ€๋Šฅ)
  • Color, Outline, Shadow (์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ ๊ฐ€๋Šฅ)
  • Blend mode
  • Adjust mode, Pivot, Xanchor, Yanchor
  • Font, Text, Line-break (text node ์ „์šฉ)
  • Index, Layer, Parent
  • Clipping (box node์™€ pie node ์ „์šฉ) (์ž์„ธํ•œ ๊ฒƒ์€ Clipping ์ฐธ๊ณ )

์ด๋“ค ํ”„๋กœํผํ‹ฐ๋Š” ์—๋””ํ„ฐ์˜ ํ”„๋กœํผํ‹ฐ ํƒญ์—์„œ ์ˆ˜์ •(์ธ๋ฑ์Šค(index) ์„ค์ •๊ณผ ๋ถ€๋ชจ๊ด€๊ณ„(parenting) ์„ค์ •์€ ์•ˆ๋จ)ํ•˜๊ฑฐ๋‚˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ˆ˜์ •(GUI API ์ฐธ๊ณ )ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋“ค ๊ฐ ํ”„๋กœํผํ‹ฐ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ Property animation ์ฐธ๊ณ )

Textures and flip book animations

GUI ์ธํ„ฐํŽ˜์ด์Šค ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€๋ถ„์œผ๋กœ ํ…์Šค์ณ ์•„ํ‹€๋ผ์Šค๋‚˜ ํƒ€์ผ ์†Œ์Šค์˜ ์ด๋ฏธ์ง€๋‚˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € ์ด๋ฏธ์ง€ ๋ฆฌ์†Œ์Šค(์•„ํ‹€๋ผ์Šค ํ˜น์€ ํƒ€์ผ ์†Œ์Šค)๊ฐ€ ์ถ”๊ฐ€ํ•˜๋ฉด ์ด ๋ฆฌ์†Œ์Šค์— ํฌํ•จ๋œ ๋ชจ๋“  ์ด๋ฏธ์ง€์™€ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ GUI ๋…ธ๋“œ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ๋‹จ์˜ "GUI" ๋ฉ”๋‰ด๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํ‚ค๋ณด๋“œ ๋‹จ์ถ•ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ "Textures" ํด๋”์— ๋งˆ์šฐ์Šค ์˜ค๋ฅธ์ชฝ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์„œ ํ…์Šค์ณ๋ฅผ ์ถ”๊ฐ€ํ•ด ๋ณด์„ธ์š”.

GUI์— ์ถ”๊ฐ€๋œ ํ…์Šค์ณ๋Š” box๋‚˜ pie ๋…ธ๋“œ์— ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Textures

์„ ํƒ๋œ ํ…์Šค์ณ ์• ๋‹ˆ๋ฉ”์ด์…˜(ํ˜น์€ ์‹ฑ๊ธ€ ํ”„๋ ˆ์ž„ ์ด๋ฏธ์ง€)์€ GUI ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ๊ทธ๋ ค์ง€๋ฉด ์ž๋™์ ์œผ๋กœ ์žฌ์ƒ๋ฉ๋‹ˆ๋‹ค.

box ๋…ธ๋“œ์˜ ์ƒ‰์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์ƒ‰์กฐ๋ฅผ ์กฐ์ •(tint)ํ•ฉ๋‹ˆ๋‹ค. ์ƒ‰์กฐ(tint color)๋Š” ์ด๋ฏธ์ง€ ๋ฐ์ดํ„ฐ์— ๊ณฑํ•ด์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ์ฆ‰ ํฐ์ƒ‰(๊ธฐ๋ณธ๊ฐ’)์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ์ƒ‰์กฐ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Tinted texture

Box ๋…ธ๋“œ๋Š” ํ…์Šค์ณ๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ์•ŒํŒŒ๊ฐ’์ด 0์ด๊ฑฐ๋‚˜ ์‚ฌ์ด์ฆˆ๊ฐ€ 0,0,0์ด์–ด๋„ ํ•ญ์ƒ ๋ Œ๋”๋ง ๋ฉ๋‹ˆ๋‹ค. Box ๋…ธ๋“œ๋Š” ํ…์Šค์ณ๋ฅผ ํ•ญ์ƒ ํ• ๋‹นํ•ด ๋‘๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋นˆ(empty) ๋…ธ๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ํ…์Šค์ณ๋ฅผ ํ• ๋‹นํ•ด ๋‘” ์ฑ„ ์‚ฌ์ด์ฆˆ๋ฅผ 0,0,0 ์œผ๋กœ ์„ค์ •ํ•˜์‹ญ์‹œ์˜ค.

Slice-9 texturing

๋งŽ์€ GUI์™€ HUD๋Š” ํฌ๊ธฐ์™€ ๊ด€๋ จํ•œ ๋ฏผ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจ๋„๊ณผ ๋‹ค์ด์–ผ๋กœ๊ทธ๋Š” ํฌํ•จ๋œ ์ปจํ…์ธ ์˜ ํฌ๊ธฐ์— ๋งž๊ฒŒ ๋ฆฌ์‚ฌ์ด์ฆˆํ•  ํ•„์š”๊ฐ€ ์ข…์ข… ์žˆ๋Š”๋ฐ, ํ…์Šค์ณ๋ฅผ ์Šค์ผ€์ผ๋œ ๋…ธ๋“œ์— ๋ฐ˜์˜ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฒ„ํŠผ์— ์ž‘์„ฑํ•  ํ…์ŠคํŠธ์˜ ๊ธธ์ด ๋งŒํผ ๋„“์ด๊ฐ€ ๊ณ ์ •๋œ ํฐ ๋ฒ„ํŠผ์„ ์‚ฌ์šฉํ•˜๋ ค ํ•œ๋‹ค๊ณ  ์นฉ์‹œ๋‹ค. Box ๋…ธ๋“œ๋ฅผ ๋งŒ๋“ค์–ด ํ…์Šค์ณ๋ฅผ ๋ฐ˜์˜ํ•˜๊ณ  ์Šค์ผ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

GUI bad scaling

Defold๋Š” ์ด ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด slice-9 texturing ์ด๋ผ๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋…ธ๋“œ์˜ ์Šค์ผ€์ผ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ๋…ธ๋“œ ํ…์Šค์ณ ์ผ๋ถ€๋ถ„์˜ ์‚ฌ์ด์ฆˆ๋ฅผ ์œ ์ง€ํ•ด ์ค๋‹ˆ๋‹ค. ์ด๋ฅผ ๋…ธ๋“œ์— ๋ฐ˜์˜ํ•˜๋ฉด ๋ฒ„ํŠผ ํ…์Šค์ณ๋Š” ์กฐ๊ฐ๋‚˜๊ฒŒ ๋˜๊ณ  ๋ฒ„ํŠผ ๋…ธ๋“œ์˜ ๊ฐ€๋กœ ์‚ฌ์ด์ฆˆ๋ฅผ ๋ณ€๊ฒฝํ•ด๋„ ์–‘ ๋์˜ ๋ถ€๋ถ„์€ ์Šค์ผ€์ผ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Sliced scaling

๋”ฐ๋ผ์„œ ์ด ๊ฐ„๋‹จํ•œ ํ…Œํฌ๋‹‰์„ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋– ํ•œ ๋„“์ด์˜ ๋ฒ„ํŠผ๋„ ์˜ˆ์˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. box ๋…ธ๋“œ์˜ Slice9 ํ”„๋กœํผํ‹ฐ๋Š” ํ…์Šค์ณ๋ฅผ ์–ด๋–ป๊ฒŒ ์ž˜๋ผ๋‚ผ(slice) ๊ฒƒ์ธ์ง€๋ฅผ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค.

Slice 9 properties

Slice9๋Š” ๋…ธ๋“œ๊ฐ€ ๋ฆฌ์‚ฌ์ด์ง• ๋  ๋•Œ ๊ณ ์ •ํ•  ๋งˆ์ง„ ๋„“์ด(margin width)๋ฅผ ์ง€์ •ํ•˜๋Š” ํ”ฝ์…€๋‹จ์œ„์˜ 4๊ฐœ ์ˆซ์ž๋กœ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ์„œ๋ฆฌ ๋ถ€๋ถ„(corner segments)์€ ์Šค์ผ€์ผ ๋˜์ง€ ์•Š๊ณ  ์ด๋™๋งŒ ๋˜๋ฉฐ, ๊ฐ€์žฅ์ž๋ฆฌ ๋ถ€๋ถ„(edge segments)์€ ํ•˜๋‚˜์˜ ์ถ•(axis)์„ ๋”ฐ๋ผ ์Šค์ผ€์ผ ๋˜๊ณ , ์ค‘์•™ ๋ถ€๋ถ„(center segment)์€ ๊ฐ€๋กœ์„ธ๋กœ ๋‘˜ ๋‹ค ์Šค์ผ€์ผ ๋ฉ๋‹ˆ๋‹ค. ์ด ๋งˆ์ง„๊ฐ’์€ ์™ผ์ชฝ ๋ถ€ํ„ฐ ์‹œ๊ณ„ ๋ฐฉํ–ฅ์œผ๋กœ ์„ค์ • ๋ฉ๋‹ˆ๋‹ค.

Slice 9 property sections

๋ Œ๋”๋Ÿฌ์—์„œ ๋ฐ‰๋งต(mipmap)์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹ ๋•Œ๋ฌธ์—, ํ…์Šค์ณ ์„ธ๊ทธ๋จผํŠธ(texture segments)์˜ ์Šค์ผ€์ผ๋ง์€ ๋•Œ๋กœ ์ด์ƒํ•˜๊ฒŒ ๋ณด์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์›๋ž˜์˜ ํ…์Šค์ณ ์‚ฌ์ด์ฆˆ๋ณด๋‹ค ์ž‘๊ฒŒ ์„ธ๊ทธ๋จผํŠธ์˜ ์Šค์ผ€์ผ์„ ์ค„์ด๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒํ•˜๋ฏ€๋กœ ๋ Œ๋”๋Ÿฌ๋Š” ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์œ„ํ•œ ๋‚ฎ์€ ํ•ด์ƒ๋„์˜ ๋ฐ‰๋งต์„ ์„ ํƒํ•˜์—ฌ ์ด์ƒํ˜„์ƒ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

Slice 9 mipmapping

์ด ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์›๋ณธ ํ…์Šค์ณ(source texture)์—์„œ ์Šค์ผ€์ผ ํ•  ์˜์—ญ(segment)์„ ๋” ์ด์ƒ ์Šค์ผ€์ผ ๋‹ค์šด์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ณ  ์˜ค๋กœ์ง€ ์Šค์ผ€์ผ ์—…๋งŒ ๊ฐ€๋Šฅํ•˜๊ฒŒ๋” ์ถฉ๋ถ„ํžˆ ์ž‘๊ฒŒ ๋งŒ๋“ค๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ…์Šค์ณ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ƒ๋‹จ์ด๋‚˜ ํ•˜๋‹จ ๊ฐ€์žฅ์ž๋ฆฌ ์˜์—ญ(edge segment)์„ 1ํ”ฝ์…€๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿด ๊ฒฝ์šฐ ํ…์Šค์ณ ํ•„ํ„ฐ๋ง์œผ๋กœ ์ธํ•ด ์›์น˜ ์•Š๋Š” ํ˜„์ƒ์ด ๋‚˜ํƒ€๋‚  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ์ž๋ฆฌ(edge)๋ฅผ ์ข€ ๋” ๋Š˜๋ฆฌ๋ฉด ์ธ์ ‘ํ•œ ํ”ฝ์…€๊ฐ’(neighbor pixels)์œผ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์ค‘๋‹จํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ๋‚˜์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Index: rendering order

๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ "Nodes" ํด๋”์— ๋‚˜์—ด๋œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ๋งจ์œ„์— ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ ์ฒซ ๋ฒˆ์งธ๋กœ ๊ทธ๋ ค์ง€๋ฏ€๋กœ ๋‹ค๋ฅธ ๋…ธ๋“œ์˜ ๋’ท์ชฝ(behind)์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์˜ ๋งจ ์•„๋ž˜์— ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋งจ ๋งˆ์ง€๋ง‰์— ๊ทธ๋ ค์ง€๋ฏ€๋กœ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์˜ ๋งจ ์•ž(front)์— ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ๋ชฉ๋ก์— ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋“œ๋ž˜๊ทธํ•ด์„œ ์ด๋“ค์˜ ์ธ๋ฑ์Šค ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋…ธ๋“œ ์ˆœ์„œ๋ฅผ ๊ทธ๋ฃนํ™” ํ•˜๊ณ  ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ ์ฐธ๊ณ )

๋งŒ์•ฝ node์˜ Z ๊ฐ’์„ ์„ค์ •ํ•ด๋„ ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ(draw order)๋Š” ๋ฐ”๋€Œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ์—์„œ Z ๊ฐ’์€ ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค.

Parent-child hierarchies

๋…ธ๋“œ๋ฅผ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๋“œ๋ž˜๊ทธํ•ด์„œ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ถ€๋ชจ๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ๋Š” ๋ถ€๋ชจ์— ๋ฐ˜์˜๋˜๊ณ  ๋ถ€๋ชจ ํ”ผ๋ฒ—(parent pivot: ์•„๋ž˜ ์ฐธ๊ณ )์— ์ƒ๋Œ€์ ์ธ ํŠธ๋žœ์Šคํผ(transform: ์œ„์น˜, ํšŒ์ „, ์Šค์ผ€์ผ ๋ณ€๊ฒฝ)์„ ์ƒ์†ํ•ฉ๋‹ˆ๋‹ค. ์ž์‹ ๋…ธ๋“œ๋“ค์€ ๋ถ€๋ชจ ์ดํ›„์— ๊ทธ๋ ค์ง€๋ฏ€๋กœ ๋ถ€๋ชจ ๋…ธ๋“œ์˜ ์•ž์ชฝ์— ๋‚˜ํƒ€๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ถ€๋ชจ์™€ ์ž์‹๋…ธ๋“œ์˜ ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ๋…ธ๋“œ์˜ ๋ Œ๋”๋ง์„ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์•„๋ž˜ "Batch Rendering" ์ฐธ๊ณ )

Layers

๋ ˆ์ด์–ด(layer)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋…ธ๋“œ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์„ ์ข€ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด๋ฅผ ๋…ธ๋“œ์— ๋ฐ˜์˜ํ•˜๋ฉด ๋ ˆ์ด์–ด์˜ ์ผ๋ถ€๋กœ์„œ ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋ ˆ์ด์–ด ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๋Š” ์ผ๋ฐ˜์ ์ธ ๋…ธ๋“œ์˜ ์ˆœ์„œ๋ณด๋‹ค ์šฐ์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Layers

์ด ์˜ˆ์ œ์—์„œ "box2" ์˜ค๋ Œ์ง€์ƒ‰ box ๋…ธ๋“œ๋Š” "front" ๋ ˆ์ด์–ด์˜ ์ผ๋ถ€์ด๋ฉฐ ๋ ˆ์ด์–ด ์ˆœ์„œ์— ๋”ฐ๋ผ์„œ ๋งจ ๋งˆ์ง€๋ง‰์— ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ "front" ๋ ˆ์ด์–ด์˜ ๋ชจ๋“  ๋…ธ๋“œ๋Š” ๋ ˆ์ด์–ด์— ์†ํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ๋“ค๊ณผ "back" ๋ ˆ์ด์–ด์˜ ๋…ธ๋“œ๋“ค์„ ๋’ค๋กœ ํ•œ ์ฑ„ ์ตœ์ƒ์œ„์— ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

"box1"๊ณผ "box3" ๋‘˜ ๋‹ค "back" ๋ ˆ์ด์–ด๋กœ ์…‹ํŒ…๋˜์–ด ์žˆ์„ ๊ฒฝ์šฐ, ์ด ๋ ˆ์ด์–ด ์•ˆ์—์„œ์˜ ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๋Š” ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ์— ๋ฐฐ์น˜๋œ ๋…ธ๋“œ์˜ ์ธ๋ฑ์Šค์— ์˜ํ•ด์„œ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค. "box1"์ด "box3" ์œ„์— ์žˆ์œผ๋ฏ€๋กœ "box3"์˜ ๋’ท์ชฝ์œผ๋กœ ๋จผ์ € ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

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

Batch rendering

GUI๋ฅผ ๊ฐ€๋Šฅํ•œ ํšจ์œจ์ ์œผ๋กœ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด์„œ, ์—”์ง„์ด GUI ๋…ธ๋“œ๋“ค์„ ์ผ๊ด„์ ์œผ๋กœ ๋ชจ์•„์„œ ๊ทธ๋ฆฌ๋Š”, ์ฆ‰ ์—”์ง„์ด ๋งŒ๋“œ๋Š” ๋“œ๋กœ์šฐ์ฝœ(drawcalls)์˜ ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋…ธ๋“œ๋“ค์˜ ๊ทธ๋ฃน์ด ์•„๋ž˜์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•˜๋ฉด ๋‹จ์ผ ๋ฐฐ์น˜(single batch) ๋‚ด์—์„œ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ชจ๋‘ box ๋…ธ๋“œ ๋ฟ์ด๋ผ๋ฉด, ํ…์Šค์ณ๋ฅผ ๊ฐ™์€ ์•„ํ‹€๋ผ์Šค์—์„œ ์‚ฌ์šฉ ํ•ด์•ผํ•จ
  2. ๋…ธ๋“œ๋“ค์€ ๊ฐ™์€ ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ(blend mode)๋กœ ๋ Œ๋”๋ง ํ•ด์•ผ ํ•จ
  3. text ๋…ธ๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ๋ผ๋ฉด, ๋™์ผํ•œ ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•จ
  4. ์ˆœ์„œ๋Œ€๋กœ ๋ Œ๋”๋ง ๋˜์–ด์•ผ ํ•จ. ์ฆ‰ ๋…ธ๋“œ ๋ฆฌ์ŠคํŠธ์—์„œ ํ•˜์œ„ ๊ณ„์ธต์— ํ•จ๊ป˜ ํฌํ•จ๋˜๊ฑฐ๋‚˜ ๊ฐ™์€ ๋ ˆ์ด์–ด์— ์†ํ•ด์•ผ ํ•จ (์ž์„ธํ•œ๊ฒƒ์€ ์•„๋ž˜ ์˜ˆ์ œ ์ฐธ๊ณ )
  5. ๊ฒŒ๋‹ค๊ฐ€, clipping ๋…ธ๋“œ๋Š” ํ•ญ์ƒ ์ผ๊ด„์ฒ˜๋ฆฌ(batch)๋ฅผ ์ค‘๋‹จํ•˜๊ณ  ๊ฐ ์Šคํ…์‹ค ๋ฒ”์œ„(stencil scope) ๋˜ํ•œ ์ผ๊ด„์ฒ˜๋ฆฌ(batch)๋ฅผ ์ค‘๋‹จํ•จ.

๊ณ„์ธต๊ตฌ์กฐ(hierarchies)์—์„œ ๋…ธ๋“œ๋“ค์„ ์ •๋ ฌ ํ•˜๋Š” ๊ธฐ๋Šฅ์€ ๊ฐ•๋ ฅํ•˜๋ฉฐ, ๋…ธ๋“œ์˜ ๋ณต์žกํ•œ ๊ณ„์ธต์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๊ทธ๋ฃนํ™” ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์ธต๊ตฌ์กฐ(hierarchies)๋Š” ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฐ์น˜ ๋ Œ๋”๋ง(batch rendering)์„ ์ค‘๋‹จํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ด…์‹œ๋‹ค.

Batch hierarchy

์—ฌ๊ธฐ์„œ๋Š” ๋…ธ๋“œ 3๊ฐœ์”ฉ 2๊ฐœ์˜ ๋ฒ„ํŠผ์ด ์žˆ์œผ๋ฉฐ ๊ทธ๋ฆผ์ž์šฉ ํ…์Šค์ณ๊ฐ€ ์žˆ๋Š” box ๋…ธ๋“œ์™€ ์Œ์˜(shaded) ๋ฒ„ํŠผ ํ…์Šค์ณ๋ฅผ ์‚ฌ์šฉํ•œ box๋…ธ๋“œ, ๋ฒ„ํŠผ์˜ ํ…์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•œ text ๋…ธ๋“œ๋กœ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋“ค ๋…ธ๋“œ๋ฅผ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅํ•œ ๊ณ„์ธต์— ๋„ฃ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ๊ทธ๋ž˜ํ”ฝ์€ "alpha" ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ๋กœ ๊ทธ๋ ค์ง€๊ณ , ๊ทธ๋ฆผ์ž๋Š” "mutliply" ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ๋กœ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์ด ๋…ธ๋“œ์˜ ๋ชฉ๋ก์„ ํ†ต๊ณผํ•  ๋•Œ, ๊ฐ ๊ฐœ๋ณ„ ๋…ธ๋“œ๋ฅผ ์œ„ํ•ด ๊ฐœ๋ณ„์ ์ธ ๋ฐฐ์น˜(batch)๋ฅผ ์„ค์ •ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋™์ผํ•œ ์•„ํ‹€๋ผ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋…ธ๋“œ๋“ค์ด ์ด ๋ชฉ๋ก์„ ํ†ต๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋ฆผ์ž ๋…ธ๋“œ๋Š” ๋ฒ„ํŠผ๊ณผ ๋‹ค๋ฅธ ํ˜ผํ•ฉ ๋ชจ๋“œ(blend mode)๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐฐ์น˜(batch)๋Š” ๊ฐ ๋…ธ๋“œ์—์„œ ๋Š์–ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋“ค ๋‘ ๋ฒ„ํŠผ์—๊ฒŒ๋Š” ๋ชจ๋‘ 6๊ฐœ์˜ ๊ฐœ๋ณ„ ๋ฐฐ์น˜(batch)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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

  1. Shadow
  2. Button
  3. Text

๋…ธ๋“œ๋ฅผ ํ•ด๋‹น ๋ ˆ์ด์–ด์— ํ• ๋‹นํ•˜๊ณ  Layers ๋ชฉ๋ก์—์„œ ๋ ˆ์ด์–ด๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ๋ Œ๋”๋ง ์ˆœ์„œ๋กœ ๋ฐฐ์น˜๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

Batch layers

๋ ˆ์ด์–ด ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ๊ฐ€ ์ผ๋ฐ˜์ ์ธ ๋…ธ๋“œ ์ˆœ์„œ๋ณด๋‹ค ์šฐ์„ ํ•˜๋ฏ€๋กœ ๋…ธ๋“œ๋“ค์€ ์•„๋ž˜ ์ˆœ์„œ๋Œ€๋กœ ๊ทธ๋ ค์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. play_block_shadow
  2. quit_block_shadow
  3. play_block
  4. quit_block
  5. play
  6. quit

์•„ํ‹€๋ผ์Šค ๋…ธ๋“œ, ๋ธ”๋ Œ๋“œ ๋ชจ๋“œ, ํฐํŠธ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋…ธ๋“œ๋Š” ์„œ๋กœ ์ธ์ ‘ํ•ด ์žˆ์œผ๋ฉฐ ๋ Œ๋”๋ง ํŒŒ์ดํ”„๋ผ์ธ์€ ์ด๋“ค ๋…ธ๋“œ๋ฅผ 6๊ฐœ ๋Œ€์‹  3๊ฐœ์˜ ๋ฐฐ์น˜(batch)๋กœ ์ผ๊ด„์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•ฝ 50%์˜ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด์ œ, ์˜ˆ์ œ์˜ ์Šค์ผ€์ผ์„ ๋” ๋„“ํ˜€์„œ GUI๋ฅผ 10๊ฐœ์˜ ๋ฒ„ํŠผ์œผ๋กœ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ด…์‹œ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ ์ ˆํ•œ ๋ ˆ์ด์–ด๋ฅผ ๊ฐ ์ƒˆ๋กœ์šด ๋…ธ๋“œ์— ํ• ๋‹นํ•œ๋‹ค๋ฉด, ์—”์ง„์€ 30๊ฐœ์˜ ๋“œ๋กœ์šฐ ์ฝœ์ด ์•„๋‹ˆ๋ผ ์—ฌ์ „ํžˆ 3๊ฐœ์˜ ๋ฐฐ์น˜(batch) ์•ˆ์—์„œ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Script

Lua ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด GUI์˜ ๋กœ์ง์„ ์ œ์–ดํ•˜๊ณ  ๋…ธ๋“œ์— ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GUI ์Šคํฌ๋ฆฝํŠธ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์Šคํฌ๋ฆฝํŠธ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ํŒŒ์ผ๋กœ ์ €์žฅ๋˜๊ณ  "gui" ๋ชจ๋“ˆ์˜ ํ•จ์ˆ˜์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ์—์„œ GUI ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  Outline ์ฐฝ์—์„œ ์ตœ์ƒ์œ„(root) GUI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ ํƒํ•ด์„œ Properties ์ฐฝ์—์„œ Script ํ•ญ๋ชฉ์— ์ƒ์„ฑํ•œ GUI ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

Script

์ด ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์Šคํฌ๋ฆฝํŠธ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

function init(self)
end

function final(self)
end

function update(self, dt)
end

function on_message(self, message_id, message, sender)
end

function on_input(self, action_id, action)
end

function on_reload(self)
end

GUI ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฒŒ์ž„ ์˜ค๋ธŒ์ ํŠธ ์ฒ˜๋Ÿผ ์ž…๋ ฅ(input)๊ณผ ๋ฉ”์„ธ์ง€(message)๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. URL์˜ fragment ๋ถ€๋ถ„์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •ํ•˜์—ฌ GUI์ปดํฌ๋„ŒํŠธ์— ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

local msgdata = { score = 4711, stars = 3, health = 6 }
msg.post("hud#gui", "set_stats", msgdata)

Handling different resolutions and aspect ratios

GUI ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฒŒ์ž„ ์ปจํ…์ธ ์˜ ์•ž(top)์—์„œ ๋ณ„๋„๋กœ ๋ Œ๋”๋ง ๋˜๋ฉฐ, ๊ฒŒ์ž„ ๊ฐœ๋ฐœ์ž๋“ค์ด ํ•ด์ƒ๋„(resolutions)์™€ ์ข…ํšก๋น„(aspect ratios)๊ฐ€ ๋‹ค๋ฅธ ํ™”๋ฉด์˜ ์žฅ์น˜๋ฅผ ์‰ฝ๊ฒŒ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Defold ๊ฒŒ์ž„ ํ”„๋กœ์ ํŠธ๋Š” "game project" ์…‹ํŒ…์—์„œ ๋ชฉํ‘œ ํ•ด์ƒ๋„(target resolution)๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์žฅ์น˜์˜ ํ•ด์ƒ๋„์™€ ์ข…ํšก๋น„ ํ™”๋ฉด์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋ชฉํ‘œ ํ™”๋ฉด์— ๋งž์ถ”๊ธฐ ์œ„ํ•ด ์—…์Šค์ผ€์ผ(upscale)์ด๋‚˜ ๋‹ค์šด์Šค์ผ€์ผ(downscale)์ด ํ•„์š”ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

Defold๋Š” GUI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฒŒ์ž„ ์ปจํ…์ธ ์™€ ๋‹ค๋ฅด๊ฒŒ ์Šค์ผ€์ผ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ํ•ด์ƒ๋„์™€ ์ข…ํšก๋น„์— ๊ด€๊ณ„ ์—†์ด ์œ ์ € ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•œ ๋ ˆ์ด์•„์›ƒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

GUI๋ฅผ ์‚ฌ์šฉํ•ด ๊ฒŒ์ž„ ์•ฑ์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ„๋‹จํ•œ ์‹คํ—˜์„ ํ•ด ๋ณด๋„๋ก ํ•ฉ์‹œ๋‹ค. ํ™”๋ฉด ์‚ฌ์ด์ฆˆ๋ฅผ 1024x1024 ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜•์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฐฐ๊ฒฝ ์ด๋ฏธ์ง€ ์œ„์— ๋ ˆ๋ฒจ ๋ฉ”๋‰ด๋ฅผ GUI ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์—์„œ ์ด๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ณด์ผ๊นŒ์š”?

Square

์ด์ œ ์ด ์•ฑ์„ iPad์—์„œ ์‹คํ–‰ํ•˜๋ฉด(์ข…ํšก๋น„๊ฐ€ 4:3์ด๊ณ  ํ™”๋ฉด ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฆ„) ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณด์ด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

iPad square

์šฐ๋ฆฌ๋Š” iPad์—์„œ ๊ฒŒ์ž„์ด ํ™”๋ฉด์— ์ฑ„์›Œ์ง€๋„๋ก ๋Š˜์–ด๋‚œ(stretche) ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐฐ๊ฒฝ์˜ ๋ฌธ์–ด ์ด๋ฏธ์ง€๋Š” ๋ณ€ํ˜•๋˜์—ˆ์ง€๋งŒ GUI ์ปดํฌ๋„ŒํŠธ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. text ๋…ธ๋“œ๋Š” ์˜ฌ๋ฐ”๋ฅธ ์ข…ํšก๋น„๋กœ ๋ Œ๋”๋ง ๋˜์–ด ํ™”๋ฉด ์ค‘์•™์˜ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‹คํ–‰์ค‘์ธ Defold ๊ฒŒ์ž„์˜ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•ด์„œ ํ•ด์ƒ๋„์™€ ์ข…ํšก๋น„๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด์ƒ๋„์™€ ์ข…ํšก๋น„๊ฐ€ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ ๊ฒŒ์ž„์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์œˆ๋„์šฐ ์ฐฝ์„ ๋Š˜๋ฆฌ๊ณ  ์ค„์ด๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์œˆ๋„์šฐ ์ฐฝ ํฌ๊ธฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ์œ ์ €์ธํ„ฐํŽ˜์ด์Šค ๋ ˆ์ด์•„์›ƒ์„ ์ œ์–ดํ•˜๋Š” ์กฐ์ •(adjustment)๊ณผ ์•ต์ปค(anchor) ๊ทœ์น™์— ๋”ฐ๋ผ GUI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ฑฐ๋‚˜ ์žฌ๋ฐฐ์น˜ํ•˜๋Š” ๋™์ž‘์ด ํŠธ๋ฆฌ๊ฑฐ๋ฉ๋‹ˆ๋‹ค.

Adjust mode

์œˆ๋„์šฐ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด ํ•ด์ƒ๋„์™€ ์ข…ํšก๋น„๋„ ๋ณ€๊ฒฝ๋˜๋ฉด, ๋ชจ๋“  ๋…ธ๋“œ๋“ค์€ Adjust Mode ํ”„๋กœํผํ‹ฐ ์„ค์ •์— ๋”ฐ๋ผ ๋ชจ์–‘์ด ๋ณ€๊ฒฝ(resharped) ๋˜๊ณ  ์กฐ์ •(adjusted) ๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœํผํ‹ฐ๋Š” ์•„๋ž˜ 3๊ฐœ์˜ ์…‹ํŒ…์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. Fit(๋งž์ถค). ๊ธฐ๋ณธ๊ฐ’. ์ด ๋…ธ๋“œ๋Š” ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค์˜ ๋„“์ด๋‚˜ ๋†’์ด ์ค‘ ์ž‘์€ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ๊ท ์ผํ•œ ๋น„์œจ๋กœ ๋ฆฌ์‚ฌ์ด์ง•ํ•จ.
  2. Zoom(์คŒ). ์ด ๋…ธ๋“œ๋Š” ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค์˜ ๋„“์ด๋‚˜ ๋†’์ด ์ค‘ ํฐ ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ๊ท ์ผํ•œ ๋น„์œจ๋กœ ๋ฆฌ์‚ฌ์ด์ง•ํ•จ.
  3. Stretch(๋Š˜์ด๊ธฐ). ์ด ๋…ธ๋“œ๋Š” ํ™”๋ฉด ํฌ๊ธฐ์— ๋น„๋ก€ํ•˜์—ฌ ๋ชจ์–‘์ด ๋ฐ”๋€œ.

๋ช‡ ๊ฐœ์˜ ๋…ธ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด GUI ์ปดํฌ๋„ŒํŠธ๋ฅผ ํฌํ•จํ•œ ์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด adjust mode์— ๋Œ€ํ•ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ฐธ๊ณ ์šฉ์œผ๋กœ ๋ฐฐ๊ฒฝ์— ๋ชจ๋ˆˆ ํ…์Šค์ณ(grid texture)๋ฅผ ๊ฐ€์ง„ box ๋…ธ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  Adjust Mode๋ฅผ "Stretch"๋กœ ์…‹ํŒ…ํ•จ
  • Defold ๋กœ๊ณ  ํ…์Šค์ณ๋ฅผ ์‚ฌ์šฉํ•œ 256x256 ํ”ฝ์…€ box ๋…ธ๋“œ ์„ธ ๊ฐœ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ  Adjust Mode๋ฅผ ๊ฐ๊ฐ "Fit", "Zoom", "Stretch"๋กœ ์…‹ํŒ…ํ•จ

Adjust mode

์ด์ œ ์œˆ๋„์šฐ ์‚ฌ์ด์ฆˆ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ box ๋…ธ๋“œ๋“ค์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ๋Š”์ง€ ๋ด…์‹œ๋‹ค.

Resized window

"Stretch" ๋…ธ๋“œ๋Š” ์ƒˆ๋กœ์šด ๋ชจ์–‘์— ๋”ฐ๋ผ ๋ณ€๊ฒฝ๋˜์ง€๋งŒ "Fit"๊ณผ "Zoom" ๋…ธ๋“œ๋Š” ์ข…ํšก๋น„๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. "Fit" ๋…ธ๋“œ๋Š” ๋ชจ์–‘์ด ๋ณ€ํ˜•๋œ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค(๋ชจ๋ˆˆ ์‚ฌ๊ฐํ˜• ์•ˆ์—์„œ)์˜ ์•ˆ์ชฝ์—์„œ ๋น„์œจ์„ ์œ ์ง€ํ•˜๊ณ  "Zoom" ๋…ธ๋“œ๋Š” ๋ชจ์–‘์ด ๋ณ€๊ฒฝ๋œ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค๋ฅผ ๋ฎ์–ด๋ฒ„๋ฆฌ๋ฉฐ ๋น„์œจ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Text ๋…ธ๋“œ๋„ ๋˜‘๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค. adjust mode๋Š” ํ…์ŠคํŠธ์˜ ๋ชจ์–‘์„ ์ œ์–ดํ•˜๋Š” ์ˆจ๊ฒจ์ง„ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

Anchors

์•ต์ปค๋Š” ์ฐฝ ํฌ๊ธฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค ๋‚ด์—์„œ ์ œ์–ดํ•ฉ๋‹ˆ๋‹ค. ์ƒˆ ๋…ธ๋“œ๋Š” ์•ต์ปค๊ฐ€ ์—†๋Š” ์ƒํƒœ๋กœ ๋งŒ๋“ค์–ด์ง€๋ฏ€๋กœ ํ™”๋ฉด์˜ ์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

Node repositioning without anchors

์ƒ์„ฑ๋œ ๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • GUI ์ปดํฌ๋„ŒํŠธ์˜ ์ขŒํ‘œ๊ณ„๋Š” ์ฐฝ ์‚ฌ์ด์ฆˆ์˜ ์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ๊ท ๋“ฑํ•˜๊ฒŒ ์Šค์ผ€์ผ ๋จ.
  • ๋…ธ๋“œ๋Š” ์Šค์ผ€์ผ๋œ ์ขŒํ‘œ๊ณ„์—์„œ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•จ

์ฆ‰ ์•ต์ปค๊ฐ€ ์—†๋Š” ๋…ธ๋“œ๋“ค์€ ํ™”๋ฉด์˜ ์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ์ƒ๋Œ€๊ฑฐ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์œˆ๋„์šฐ๊ฐ€ ์ขŒ์šฐ๋กœ ๋Š˜์–ด๋‚œ๋‹ค๋ฉด, ์ถ”๊ฐ€ ๋„“์ด๋Š” GUI์˜ ์–‘ ์ธก๋ฉด์— ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

No anchor size up

๋˜ํ•œ, ์œˆ๋„์šฐ๊ฐ€ ์ถ•์†Œ(shrunk)๋˜์–ด ์ƒ๋Œ€์ ์œผ๋กœ ์ข์•„์ง„๋‹ค๋ฉด, ์ถ”๊ฐ€ ๋†’์ด๋Š” GUI์˜ ์œ„ ์•„๋ž˜๋กœ ๊ท ๋“ฑํ•˜๊ฒŒ ๋ถ„๋ฐฐ๋ฉ๋‹ˆ๋‹ค.

No anchor size down

Node repositioning with anchors

Xanchor์™€ Yanchor ํ”„๋กœํผํ‹ฐ๋ฅผ ์…‹ํŒ…ํ•˜๋ฉด ๋ฐ”์šด๋”ฉ ๋ฐ•์Šค์˜ ๊ฐ€์žฅ ์ž๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋…ธ๋“œ์˜ ์œ„์น˜๋ฅผ ์ž ๊ธˆ(lock) ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Xanchor๋ฅผ "Left"๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ๋“œ์˜ ์ˆ˜ํ‰ ์œ„์น˜๊ฐ€ box์˜ ์™ผ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.
  • Xanchor๋ฅผ "Right"๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ๋“œ์˜ ์ˆ˜ํ‰ ์œ„์น˜๊ฐ€ box์˜ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.
  • Yanchor๋ฅผ "Top"์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ๋“œ์˜ ์ˆ˜์ง ์œ„์น˜๊ฐ€ box์˜ ์œ—์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.
  • Yanchor๋ฅผ "Bottom"์œผ๋กœ ์„ค์ •ํ•˜๋ฉด ๋…ธ๋“œ์˜ ์ˆ˜์ง ์œ„์น˜๊ฐ€ box์˜ ์•„๋ž˜์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ๋กœ ๊ณ ์ •๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Xanchor ํ”„๋กœํผํ‹ฐ๋ฅผ "Right"๋กœ ์„ค์ •ํ•˜๊ณ  Yanchor ํ”„๋กœํผํ‹ฐ๋ฅผ "Top"์œผ๋กœ ์„ค์ •ํ•˜๋ฉด, ๋…ธ๋“œ๋Š” box์˜ ์˜ค๋ฅธ์ชฝ ์œ„ ๋ชจ์„œ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์œ„์น˜๋ฅผ ์œ ์ง€ํ•˜๋ฉฐ ์˜ค๋ฅธ์ชฝ ๊ฐ€์žฅ์ž๋ฆฌ์™€ ์ƒ๋‹จ ๊ฐ€์žฅ์ž๋ฆฌ๊นŒ์ง€์™€์˜ ๊ฑฐ๋ฆฌ๋„ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. "Pivot" ์€ ๊ธฐ๋ณธ๊ฐ’ "Center"๋กœ ์ค‘์‹ฌ์ ์„ ์œ ์ง€ํ•˜๋ฉฐ, ๋ชจ์„œ๋ฆฌ๋กœ ์•ต์ปค๋ฅผ ์ง€์ •ํ•˜๋ ค๋ฉด Pivot ๊ฐ’์„ ์ ์ ˆํžˆ ์กฐ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

Anchor top right

์ด ์˜ˆ์ œ๋Š” "Top"๊ณผ "Right"๋กœ ์•ต์ปค๊ฐ€ ์ง€์ •๋œ ๋…ธ๋“œ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. "Fit"์ด ์กฐ์ •๋˜๊ณ  Pivot์„ "North East"๋กœ ์„ค์ •ํ•˜๋ฉด ์œˆ๋„์šฐ ์ฐฝ์ด ๋Š˜์–ด๋‚  ๋•Œ ๋…ธ๋“œ๋Š” ๋ณ€ํ˜•๋  ๋ฐ•์Šค(ํŒŒ๋ž€์ƒ‰ ์ ์„  ์‚ฌ๊ฐํ˜•) ๋‚ด์—์„œ ์•ต์ปค๊ฐ€ ์ง€์ •๋˜์–ด ๋งž์ถฐ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Pivot

๊ฐ ๋…ธ๋“œ๋Š” GUI ์ขŒํ‘œ๊ณ„ ๋‚ด์—์„œ ์œ„์น˜(position), ์Šค์ผ€์ผ(scale), ํšŒ์ „(rotation) ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” position ์†์„ฑ์œผ๋กœ ๋ฐฐ์น˜๋˜๋ฉฐ pivot์— ์„ค์ •๋œ ์ขŒํ‘œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํšŒ์ „ํ•ฉ๋‹ˆ๋‹ค. text๋…ธ๋“œ๋Š” pivot ์„ค์ •์— ๋”ฐ๋ผ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๊ธฐ๋ณธ ์œ„์น˜์™€ ํšŒ์ „์€ Pivot ํ”„๋กœํผํ‹ฐ๊ฐ€ "Center"๋กœ ์„ค์ •๋˜์–ด ๋…ธ๋“œ์˜ ์ค‘์•™์„ ๊ธฐ์ค€์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ์˜ pivot์€ ์•„๋ž˜ ์„ค์ • ์ค‘ ํ•˜๋‚˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • Center
  • North, South, East, West
  • North West, North East, South West, South East

๋‹ค์Œ ๊ทธ๋ฆผ์€ ๊ฐ pivot ์„ค์ •์˜ ์œ„์น˜๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

Pivot points

๋…ธ๋“œ์˜ pivot์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋…ธ๋“œ๋Š” ์ƒˆ pivot์— ์ฃผ์–ด์ง„ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Text ๋…ธ๋“œ๋Š” "Center"์ผ ๊ฒฝ์šฐ ์ค‘์•™ ์ •๋ ฌ๋˜๋ฉฐ "West"์ผ ๊ฒฝ์šฐ ์™ผ์ชฝ ์ •๋ ฌ, "East"์ผ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ์ •๋ ฌ๋ฉ๋‹ˆ๋‹ค.

GUI scripts

GUI๋…ธ๋“œ์—๋Š” ๋กœ์ง ์ž์ฒด๋Š” ์—†์ง€๋งŒ GUI ์ปดํฌ๋„ŒํŠธ์— ์—ฐ๊ฒฐ๋œ GUI ์Šคํฌ๋ฆฝํŠธ์—์„œ ๋…ธ๋“œ๋ฅผ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋…ธ๋“œ์˜ id๋ฅผ ์‚ฌ์šฉํ•ด ์ฐธ์กฐํ•˜๊ณ  ์ด ์ฐธ์กฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋ณ€์ˆ˜์— ์ €์žฅ๋˜์–ด ๋…ธ๋“œ๋ฅผ ๋‹ค๋ฃจ๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

-- "magic" text ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•จ
local magicnode = gui.get_node("magic")
-- ๋…ธ๋“œ๋ฅผ ์˜ค๋ Œ์ง€์ƒ‰์œผ๋กœ ๋ฐ”๊ฟˆ
local orange = vmath.vector4(1.0, 0.3, 0.0, 1.0)
gui.set_color(magicnode, orange)

gui.get_node() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋…ธ๋“œ์˜ ์ฐธ์กฐ๋ฅผ ํš๋“ํ•˜๊ณ  GUI ๋ชจ๋“ˆ์˜ ์œ„์น˜, ํฌ๊ธฐ, ๋ชจ์–‘, ๊ทธ๋ฆฌ๊ธฐ ์ˆœ์„œ, ๋ถ€๋ชจ ๊ด€๊ณ„ ๋ณ€๊ฒฝ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ ํ•จ์ˆ˜๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ์˜ ํ”„๋กœํผํ‹ฐ๋“ค์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

Node id:s

๊ฐ ๋…ธ๋“œ๋Š” ์œ ๋‹ˆํฌํ•œ id๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. box ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๊ธฐ๋ณธ id๋กœ "box"๊ฐ€ ์„ค์ •๋˜๋ฉฐ, text ๋…ธ๋“œ๋Š” "text"๋ฅผ ๊ธฐ๋ณธ id๋กœ ์„ค์ •๋˜์ง€๋งŒ ์œ ๋‹ˆํฌํ•œ ์ด๋ฆ„๊ณผ ๋” ๋ช…ํ™•ํ•œ ์„ค๋ช…์„ ์œ„ํ•ด ๋…ธ๋“œ์˜ id๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ Defold์˜ GUI ์—๋””ํ„ฐ์—์„œ ์ค‘๋ณต id๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Dynamically created nodes

๋Ÿฐํƒ€์ž„์‹œ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

-- 300x300 ์œ„์น˜์— 150x200 ์‚ฌ์ด์ฆˆ๋กœ ํฐ์ƒ‰ box ๋…ธ๋“œ ์ƒ์„ฑํ•˜๊ธฐ
local new_position = vmath.vector3(300, 300, 0)
local new_size = vmath.vector3(150, 200, 0)
local new_boxnode = gui.new_box_node(new_position, new_size)
-- ๋™์ผํ•œ ์œ„์น˜์— text ๋…ธ๋“œ ์ถ”๊ฐ€ํ•˜๊ธฐ
local new_textnode = gui.new_text_node(new_position, "Hello!")

์ƒ์„ฑ๋œ ๋…ธ๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- text๋…ธ๋“œ๋ฅผ 10๋„ ํšŒ์ „ํ•˜๊ธฐ(z์ถ• ๊ธฐ์ค€)
gui.set_rotation(new_textnode, vmath.vector3(0, 0, 10))

์ด ์ฝ”๋“œ๋ฅผ GUI ์Šคํฌ๋ฆฝํŠธ์˜ init() ํ•จ์ˆ˜์— ๋„ฃ์–ด ์‹คํ–‰ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์ด ๋ฉ๋‹ˆ๋‹ค.

Script create node

๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ƒˆ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

-- magic text ๋…ธ๋“œ ๋ณต์ œํ•˜๊ธฐ
local magicnode = gui.get_node("magic")
local magic2 = gui.clone(magicnode)
-- ์ƒˆ ๋…ธ๋“œ๋ฅผ ์›๋ณธ ์œ„์น˜์˜ ์˜ค๋ฅธ์ชฝ ์ƒ๋‹จ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ
gui.set_position(magic2, vmath.vector3(300, 300, 0))

Dynamic node IDs

๋™์ ์œผ๋กœ ๋…ธ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด id๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜๋„์ ์œผ๋กœ ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. gui.new_box_node(), gui.new_text_node(), gui.new_pie_node(), gui.clone() ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ ˆํผ๋Ÿฐ์Šค๋Š” ๋…ธ๋“œ์— ์•ก์„ธ์Šค ํ•˜๊ธฐ์œ„ํ•œ ์œ ์ผํ•œ ๊ฐ’์ด๋ฏ€๋กœ ์ฐธ์กฐ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ด ๊ฐ’์„ ๊ผญ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

-- text ๋…ธ๋“œ ์ถ”๊ฐ€
local new_textnode = gui.new_text_node(vmath.vector3(100, 100, 0), "Hello!")
-- "new_textnode"๋Š” ๋…ธ๋“œ์˜ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ
-- ์ด ๋…ธ๋“œ๋Š” id๊ฐ€ ์—†์ง€๋งŒ ์ด๋ฏธ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ gui.get_node()๋กœ ํ˜ธ์ถœํ•  ํ•„์š”๊ฐ€ ์—†์Œ

Property animation

๋…ธ๋“œ ํ”„๋กœํผํ‹ฐ์˜ ๋ช‡๋ช‡์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœํผํ‹ฐ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด gui.animate() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•„๋ž˜ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ๋ฉ๋‹ˆ๋‹ค.

gui.animate(node, property, to, easing, duration [,delay] [,complete_function] [,playback])

์ด ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช…์€ go.animate() ์ฐธ๊ณ 

"property" ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ƒ์ˆ˜๊ฐ’(gui.PROP_POSITION ๋“ฑ๋“ฑ)์ด ์ฃผ์–ด์ง€์ง€๋งŒ ํ”„๋กœํผํ‹ฐ ๊ฐ€์ด๋“œ์˜ ์„ค์ •(Properties ์ฐธ๊ณ )๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ณตํ•ฉ์ ์ธ ํ”„๋กœํผํ‹ฐ ๊ฐ’์˜ ํŠน์ •ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํ•˜๋ ค๋ฉด ์ด ๋ฐฉ๋ฒ•์ด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, "color" ํ”„๋กœํผํ‹ฐ๋Š” vector4 ๊ฐ’์œผ๋กœ red, green, blue, alpha์˜ RGBA ๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ, ๋ฒกํ„ฐ ์ปดํฌ๋„ŒํŠธ๋Š” "x", "y", "z" ๊ทธ๋ฆฌ๊ณ  "w"๋กœ ์ด๋ฆ„์ด ์ •ํ•ด์ ธ ์žˆ์œผ๋ฉฐ RGBA ์ˆœ์„œ๋Œ€๋กœ "w"๋Š” alpha ๊ฐ’์— ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ์•ŒํŒŒ๊ฐ’์„ ํŽ˜์ด๋“œ์—…/๋‹ค์šด(fade up/down) ํ•˜๋ ค๋ฉด ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function fadeup(self, node)
        gui.animate(node, "color.w", 1.0, gui.EASING_LINEAR,
0.3, 0, fadedown, gui.PLAYBACK_ONCE_FORWARD)
end

function fadedown(self, node)
        gui.animate(node, "color.w", 0.0, gui.EASING_LINEAR,
0.3, 0, fadeup, gui.PLAYBACK_ONCE_FORWARD)
end

์ด์ œ fadeup() ์ด๋‚˜ fadedown() ์„ ํ˜ธ์ถœํ•˜์—ฌ ๋…ธ๋“œ์˜ ์•ŒํŒŒ๊ฐ’์„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. "complete_function" ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์™„๋ฃŒ๋  ๋•Œ ํ˜ธ์ถœ๋˜๊ฒŒ ํ•ด์„œ ํŽ˜์ด๋“œ ์—…๊ณผ ํŽ˜์ด๋“œ ๋‹ค์šด์„ ๋Š์ž„์—†์ด ์ง€์†๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Render script

๊ธฐ๋ณธ ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ฒŒ์ž„ ์ปจํ…์ธ ์˜ ๋ชจ๋“  ๋ Œ๋”๋ง์„ ๋‹ค๋ฃจ๋Š” ๋ฃจ์•„ ์Šคํฌ๋ฆฝํŠธ๋กœ ๋˜์–ด ์žˆ์œผ๋ฉฐ(์ž์„ธํ•œ ๋‚ด์šฉ์€ Rendering ๋ฌธ์„œ ์ฐธ๊ณ ), ๊ฒŒ์ž„์˜ ์ƒ์œ„์—์„œ GUI ๋…ธ๋“œ๋“ค์„ ๋ Œ๋”๋ง ํ•˜๋„๋ก ๋ณ„๋„ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

...
render.set_view(vmath.matrix4())
render.set_projection(vmath.matrix4_orthographic(0,
render.get_window_width(), 0,
render.get_window_height(), -1, 1))
render.draw(self.gui_pred)
render.draw(self.text_pred)
...

์ด ๋ทฐ๋Š” ์ผ๋ฐ˜ ๋‹จ์œ„ ํ–‰๋ ฌ(normal identity matrix)์ด๋ฉฐ ์ง๊ต(orthographic)๋กœ ํˆฌ์˜(projection)๋ฉ๋‹ˆ๋‹ค. "builtins/render" ํด๋”์—์„œ "default.render_script" ์™€ "default.render" ํŒŒ์ผ์„ ๋ณต์‚ฌํ•˜๊ณ  project settings(Project settings ์ฐธ๊ณ )์—์„œ "bootstrap" ์„น์…˜์˜ ๋ Œ๋”๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ปค์Šคํ„ฐ๋งˆ์ด์ง• ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋ชจ๋“  GUI ์ปดํฌ๋„ŒํŠธ๋ฅผ 3D "camera" ๋ทฐ์™€ ์›๊ทผ ํˆฌ์˜(perspective projection)์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

-- ๋ทฐ๋ฅผ 3D ํฌ์ง€์…˜ ์นด๋ฉ”๋ผ๋กœ ์„ค์ •ํ•˜๊ธฐ
local w = render.get_window_width() * 0.5
local h = render.get_window_height() * 0.5
local view = vmath.matrix4_look_at(vmath.vector3(w-25, h-10, 70),
vmath.vector3(w, h, -250),
vmath.vector3(0, 1.0, 0))
render.set_view(view)
-- ์›๊ทผ ํˆฌ์˜์‹œํ‚ค๊ธฐ(Perspective projection)
render.set_projection(vmath.matrix4_perspective(2.5, 4/3, 0.1, 1000))

render.draw(self.gui_pred)
render.draw(self.text_pred)

์ด๊ฒƒ์€ ๋ Œ๋”๋ง๋˜๋Š” ๋ชจ๋“  GUI ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์œ„์—์„œ ๋งŒ๋“  ๋ ˆ๋ฒจ ๋ฉ”๋‰ด์— ์ˆ˜์ •๋œ ๋ Œ๋” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ ์šฉํ•˜๋ฉด ์•„๋ž˜ ์ฒ˜๋Ÿผ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.

Render script

โš ๏ธ **GitHub.com Fallback** โš ๏ธ