Message passing - kuimoani/defold GitHub Wiki
Message passing
๋ฉ์ธ์ง ์ ๋ฌ์ ์ค๋ธ์ ํธ๊ฐ ์ข ์์ฑ์ ๋ง๋ค์ง ์์ผ๋ฉด์ ํต์ ํ ์ ์๋๋ก ํ๋ Defold์ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด ๋งค๋ด์ผ์ ์ด ๋ฉ์ปค๋์ฆ์ ๋ํด ์์ธํ ์ค๋ช ํ๋ฉฐ ๊ฒ์์ค๋ธ์ ํธ, ์ปดํฌ๋ํธ, ์ปฌ๋ ์ ์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์๋ค๊ณ ๊ฐ์ ํ๊ณ ์ค๋ช ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ์ค๋ธ์ ํธ๋ ์ฝ๋๋ชจ๋, ์ปดํฌ๋ํธ๊ฐ์ ๊ฒฐํฉ(coupling)์ ๊ฐ๋ฅํ ๋์จํ๊ฒ ๋ง๋๋ ๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก ์์ฃผ ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ค๋ฅธ ์ค๋ธ์ ํธ์ ๋ด๋ถ๋์์ ์์กดํ๋ ์ค๋ธ์ ํธ๋ ๋จ๋จํ ๊ฒฐํฉ๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋๋ฉฐ ์ด ๊ฒฐํฉ์ ์ข ์ข ์ฝ๋๋ฅผ ์์ ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค๊ณ ์ถ์ ํ๊ธฐ ๋งค์ฐ ์ด๋ ค์ด ๋ฒ๊ทธ๋ฅผ ๋ฐ์์ํค๊ธฐ๋ ํฉ๋๋ค.
Defold์ Lua ํตํฉ(integration)์ Java, C++, C# ๊ฐ์ด ์์์ ์ฌ์ฉํ ํด๋์ค ๊ตฌ์กฐ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ฏ์ด ๊ฐ์ฒด์งํฅ์ ์ ๊ณตํ์ง๋ ์์ต๋๋ค. ๋์ Defold๋ ์๋์ ๊ฐ์ด ๊ฐ๋จํ๊ณ ๊ฐ๋ ฅํ ๊ฐ์ฒด ์งํฅ ์ค๊ณ๋ก Lua์ ๊ธฐ๋ฅ์ ํ์ฅํฉ๋๋ค:
- ์ค๋ธ์ ํธ๊ฐ ํต์ ์ ์ํ ๋ฉ์ธ์ง ์ ๋ฌ(Message passing)
- ๋ชจ๋ ์ค๋ธ์ ํธ๋ ์์ฒด์ ์ธ ๋ด๋ถ ์ํ์ ์ ์ด ๊ฐ๋ฅํ ์์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ์ง. "self" ์ฐธ์กฐ๋ฅผ ํตํด์ ๊ฐ๋ฅํจ
- ๊ธฐ์กด ์ค๋ธ์ ํธ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ์ ์์ผ๋ฉฐ, ๋ฉ์ธ์ง์ ์ด๋ป๊ฒ ์๋ตํ ์ง๋ ์ฝ๋์ ๋ฐ๋ผ ๋ค๋ฆ. on_message() ํจ์๋ฅผ ํตํด ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ ํน์ ๋ฉ์ธ์ง๋ฅผ ์ฒ๋ฆฌํ๋ ์ฝ๋๊ฐ ์์ผ๋ฉด ์๋ฌด ์ผ๋ ์ผ์ด๋์ง ์์
Addressing and URLs
Defold์ ๋ชจ๋ ์ค๋ธ์ ํธ๋ URL(Uniform Resource Locator)์ ํตํด ๊ณ ์ ํ ์ฃผ์๊ฐ ์ง์ ๋ฉ๋๋ค. ์ด ์ฃผ์๋ ์ปดํ์ผ์์ ์ค์ ๋๋ฉฐ ์ค๋ธ์ ํธ์ ์๋ช ์ด ์ง์๋๋ ๋์ ์ ์ง๋ฉ๋๋ค. ์ฆ ์ค๋ธ์ ํธ์ ์ฃผ์๋ฅผ ์ง์ ํ๋ฉด ์ค๋ธ์ ํธ๊ฐ ์กด์ฌํ๋ ๋์์ ์ ํจํ ์ํ๋ก ์ ์ง๋๋ฏ๋ก ์ ์ฅ๋ ์ค๋ธ์ ํธ์ ์ฐธ์กฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ ๋ํด ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ฑํ ๋, ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์ปฌ๋ ์ ๊ณ์ธต์ ์ถ๊ฐํ๋ฉด ์์ฃผ ์ฌํํ ๊ตฌ์กฐ๋ก ์ต์์ ์ปฌ๋ ์ ๋ฐ๋ก ์๋์ ๊ฒ์ ์ค๋ธ์ ํธ๋ค์ด ๋์ด๋ฉ๋๋ค. ํ์ง๋ง ๋๋ก๋ ์ข ๋ ๋ค์ํ๊ฒ ์ค๋ธ์ ํธ๋ค์ ๊ทธ๋ฃนํ ํ ํ์๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ ๊ฒ์์ด ์๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค:
- ์์ ์บ๋ฆญํฐ์ ์ ์บ๋ฆญํฐ๋ฅผ ํฌํจํ๋ ๋ ๋ฒจ ์ปฌ๋ ์
- ๊ทธ๋ฆฌ๊ณ ์จ-์คํฌ๋ฆฐ(on-screen) ์ธํฐํ์ด์ค
์ฌ๊ธฐ์ ์ด๋ฅผ ์ํ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ๊ฐ ์์ต๋๋ค:

์ด ๊ฒ์์ ๊ตฌ์ฑ์:
- id๊ฐ "main"๊ณผ "level"์ธ ๋ ๊ฐ์ ์ปฌ๋ ์ . "level"์ "main" ์์ ์์
- id๊ฐ "hero"์ "enemy"์ "interface"์ธ ์ธ ๊ฐ์ ๊ฒ์ ์ค๋ธ์ ํธ
- "interface"๋ "main" ์์ ์์
- "hero"์ "enemy"๋ "level" ์์ ์์
- ์์ ์ ๊ฐ ๊ฒ์ ์ค๋ธ์ ํธ๋ ๋ ๊ฐ์ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ์์
- "hero"์ "enemy" ๊ฒ์ ์ค๋ธ์ ํธ๋ "brain"์ด๋ผ๋ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ์ "body"๋ผ๋ ์คํ๋ผ์ดํธ ์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ์์
- "interface" ๊ฒ์ ์ค๋ธ์ ํธ๋ "control"์ด๋ผ๋ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ์ "gui"๋ผ๋ GUI์ปดํฌ๋ํธ๋ฅผ ํฌํจํ๊ณ ์์
- "interface"์ "gui"์ปดํฌ๋ํธ๋ GUI์คํฌ๋ฆฝํธ๊ฐ ์ฒจ๋ถ๋์ด ์์
๊ฒ์ ์ปจํ ์ธ ์ค ์ผ๋ถ๋ ํ๋ก์ ํธ์ ํน์ ํ์ผ์ ์ ์ฅ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ปฌ๋ ์ ์ ํญ์ ํ์ผ์ ์ ์ฅ๋๋ฏ๋ก "main" ์ปฌ๋ ์ ๊ณผ "level"์ปฌ๋ ์ ํ์ผ์ด ์ ์ด๋ ํ ๊ฐ์ฉ์ ํ์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๊ฒ์ ๋ณ๋ก ์ค์ํ์ง ์์ต๋๋ค. ์ค์ํ ๊ฒ์ ํ์ผ์ ์ด๋ฆ๊ณผ ํ๋ก์ ํธ ํด๋์์์ ํ์ผ ์์น๋ ์ ํ ๊ด๋ จ์ด ์๋ค๋ ๊ฒ์ ๊นจ๋ซ๋ ๊ฒ์ด ๋ ์ค์ํฉ๋๋ค. ์ฃผ์ ์ง์ ์ ์ํด ์ค์ํ ๋ ๊ฐ์ง ์ฌํญ์ด ์์ต๋๋ค:
- id๋ฅผ ๋ฌด์์ผ๋ก ์ง์๋๊ฐ
- ์ด๋ค ์ปฌ๋ ์ ์ ๋ฃ์๋๊ฐ
๊ฒ์ ์ค๋ธ์ ํธ ํน์ ์ปฌ๋ ์ ์ ๋ฐฐ์นํ๋ฉด Defold ์๋ํฐ๋ ํ์ฌ ์ปฌ๋ ์ ์์ ๊ณ ์ ํ ์์ด๋๋ฅผ ์๋์ผ๋ก ์ง์ ํฉ๋๋ค. ์ด ์ด๋ฆ์ ์ํ๋ ๋๋ก ์์ ํ ์ ์์ต๋๋ค. ์๋ํฐ๋ id๋ฅผ ์ถ์ ํด์ ์ด๋ฆ์ด ์ถฉ๋ํ์ง ์๋์ง ํ์ธํฉ๋๋ค. ๋ง์ฝ ๊ฐ์ ๋ก ์ด๋ฆ ์ถฉ๋์ ๋๊ฒ ํ๋ฉด Defold ์๋ํฐ๋ ์๋ฌ๋ฅผ ๋ฐ์ํฉ๋๋ค.
๋ชจ๋ ์ฃผ์๋ค์ ๊ฒ์ ์คํ์ค์ ๊ฐ ๋ฉ์ธ์ง ๋ฐ์ ์์ ์์ ์๋ฅผ ๊ณ ์ ํ๊ฒ ์๋ณํ๋ URL๋ก ํํํ ์ ์์ต๋๋ค. URL์ 3๊ฐ์ ์ปดํฌ๋ํธ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ธ ์ ์์ต๋๋ค:
"[socket:][path][#fragment]"
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ด๋ฌํ URL ์ปดํฌ๋ํธ๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ์ง๋ช ํ๋๋ฐ ์ฌ์ฉ๋๊ธด ํ์ง๋ง ์ด ํ์์ ์ผ๋ฐ์ ์ ๋๋ค.
socket
๋ฐ์ ์ ํน์ ์์ ์๊ฐ ์กด์ฌํ๋ "world"๋ฅผ ์๋ณํฉ๋๋ค. ์ด๋ ์ปฌ๋ ์ ํ๋ก์(Collection proxy)๋ฅผ ์ฌ์ฉํ๋๋ฐ ๋งค์ฐ ์ค์ํ๋ฉฐ ๋์ ์ผ๋ก ๋ถ๋ฌ์ด ์ปฌ๋ ์ ์ ์๋ณํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
path
URL์ ์ด ๋ถ๋ถ์ ์ผ๋ฐ์ ์ผ๋ก ํ๊ฒ ๊ฒ์ ์ค๋ธ์ ํธ์ ์ ์ฒด id๋ฅผ ํฌํจํฉ๋๋ค.
fragment
์ง์ ๋ ๊ฒ์ ์ค๋ธ์ ํธ ๋ด์ ํ๊ฒ ์ปดํฌ๋ํธ์ id์ ๋๋ค.
์์์ "hero" ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ์ ๋ํ ์ ์ฒด URL์ ์๋์ ๊ฐ์ต๋๋ค:
main:/level/hero#brain
๊ทธ๋ฆฌ๊ณ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ผ ์ ์์ต๋๋ค:
-- "enemy"์ ์คํฌ๋ฆฝํธ๋ก "hello" ๋ฉ์ธ์ง๋ฅผ ๋ณด๋
msg.post("main:/level/enemy#brain", "hello")
์ ์ ์๋ ์์ ์์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด, Defold๋ ์ฝ์์ฐฝ์ ์๋ฌ๋ฅผ ์ถ๋ ฅํฉ๋๋ค.
ERROR:GAMEOBJECT: Instance '/level/enemy' could not be found when dispatching message 'hello' sent from default:/level/hero#brain
๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์ ์ฒ๋ผ ์ ์ฒด URL์ ์ฌ์ฉํ๋ ๊ฒ์ ๋ถํ์ํ๋ฉฐ ๋๋ฌด ๊ตฌ์ฒด์ ์ ๋๋ค. ๋์ ์ ์ํ ๊ฒ์์ ํตํด ์ด๋ป๊ฒ ๋ฉ์ธ์ง๋ฅผ ์จ์ผ ํ๋์ง์ ๋ํด ์ฝ 3๊ฐ์ง์ ์ผ๋ฐ์ ์ธ ์์ ๋ฅผ ์ดํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค:

Message 1
"knock" ๋ฉ์ธ์ง๊ฐ "hero" ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "enemy" ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก ์ ์ก๋ฉ๋๋ค. ์ด ๋ ์ค๋ธ์ ํธ๊ฐ ์ปฌ๋ ์ ๊ณ์ธต๊ตฌ์กฐ์ ๋์ผํ ์์น์ ์๋ค๋ฉด URL์ socket ๋ถ๋ถ("world", root, main collection ๋ฑ๋ฑ)๋ ๋์ผํ๋ฏ๋ก ์ด ๋ถ๋ถ์ ์๋ตํด์ ์๋์ ๊ฐ์ด ์ธ ์ ์์ต๋๋ค:
-- "hero"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "enemy"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก "knock" ์ ์กํ๊ธฐ
msg.post("/level/enemy#brain", "knock")
URL์ socket๋ถ๋ถ์ ์ง์ ํ์ง ์์ผ๋ฉด, ์ด ๋ฉ์ธ์ง๋ ๋ฐ์ ์๊ฐ ๋์ผํ socket์ ์์ ์์๊ฒ ์ ์ก๋๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. Defold๋ URL์ path ๋ถ๋ถ์์๋ id์ ์ผ๋ถ๋ฅผ ์๋ต ํ ์ ์์ต๋๋ค. "/"๋ก ์์ํ๋ path๋ ์ ๋๊ฒฝ๋ก์ด๋ฉฐ ํญ์ socket(์ผ๋ฐ์ ์ผ๋ก main collection)์ root์์๋ถํฐ ์์๋์ด ์ค๋ธ์ ํธ์ id๊ฐ ๋ํ๋ ๋ ๊น์ง ์์ ํ ๊ณ์ธต์ ์ธ ์ ์ฒด ๊ฒฝ๋ก(path)๋ก ์จ์ผ ํฉ๋๋ค. "hero"์ "enemy"์ id๊ฐ ๊ฐ๊ฐ "/level/hero"์ "/level/enemy" ์ด๊ธฐ ๋๋ฌธ์ "/level"์ ์๋ตํ์ฌ ์๋์ ํน์ ๋ถ๋ถ์ ์ธ id๋ฅผ ์ธ ์ ์์ต๋๋ค:
-- "hero"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "enemy"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก "knock" ์ ์กํ๊ธฐ
msg.post("enemy#brain", "knock")
์๋ถ๋ถ์ "/"๋ฅผ ์ฌ์ฉํ์ฌ "/enemy#brain" ์ฒ๋ผ ์ฐ์ง ์๋๋ก ์ฃผ์ ๋ฐ๋๋๋ค. ๋งจ ์์ "/"๋ฅผ ์ถ๊ฐํ๋ฉด "main" ์ปฌ๋ ์ ์ root์์ "enemy"๋ผ๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์ฐพ์๋ณด๋ ค ํ๊ฒ ์ง๋ง root์ ์ด๋ฐ ์ค๋ธ์ ํธ๋ ์กด์ฌํ์ง ์์ต๋๋ค. ์, ์ด์ ๋ URL์ fragment ๋ถ๋ถ์ ์๋ตํ๋ฉด ๋ฌด์จ์ผ์ด ๋ฐ์ํ ๊น์?
-- "hero"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "enemy"๋ก "knock" ์ ์กํ๊ธฐ
msg.post("enemy", "knock")
์ด๊ฒ์ ์๋ฒฝํ ์ ํจํฉ๋๋ค. ๋ชฉ์ ์ง ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ์๋ตํ๋ฉด ์ด ๋ฉ์ธ์ง๋ ํด๋น ๊ฒ์ ์ค๋ธ์ ํธ์ ์๋ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์๊ฒ ๋ธ๋ก๋์บ์คํธ ๋ฉ๋๋ค. ๋ธ๋ก๋์บ์คํ ์ ์ฑ๋ฅ์ ๋จ์ด๋จ๋ฆฌ๋ฉฐ ๋ถ๋ช ํ์ฑ์ผ๋ก ์ธํด ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์๋ ์์ผ๋ฏ๋ก ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ๋ช ํํ๊ฒ ์ง์ ํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Message 2
"increase_score" ๋ฉ์ธ์ง๋ "hero" ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "interface" ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก ์ ์ก๋ฉ๋๋ค.
-- "hero"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "interface"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก "increase_score"๋ฅผ ๋ณด๋
msg.post("/interface#controller", "increase_score")
์ ์ผ์ด์ค์์๋ ์๋(relative)๊ฒฝ๋ก์ id๋ฅผ ์ธ ์ ์์ต๋๋ค. "hero"์ ๊ด์ ์์ ๋ณผ ๋ ์ ๋(absolute)์ ์ด๊ณ ์์ ํ full id("../interface" ์ฒ๋ผ ํ์ผ ์์คํ ๊ฐ์ ํ๊ธฐ๋ฒ์ ํ์ฉ๋์ง ์์ผ๋ฏ๋ก)๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ "interface"์ ์คํฌ๋ฆฝํธ ์ชฝ์์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์๋๊ฒฝ๋ก๋ ๊ฐ๋ฅํฉ๋๋ค:
-- "interface"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก๋ถํฐ "hero"์ ์คํฌ๋ฆฝํธ๋ก "increase_score_response"๋ฅผ ๋ณด๋
msg.post("level/hero#brain", "increase_score_response")
๋ค์ ๋งํ์ง๋ง, ์์ชฝ์ "/"๊ฐ ์๋ต๋ ๊ฒ์ ์ฃผ๋ชฉํ์ญ์์ค. ์๋๊ฒฝ๋ก์ id๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ ์์ ์์ ์๋ ์ปฌ๋ ์ ๊ณ์ธต์ ๋ชจ๋ ์์น์์ ํต์ ํ ์ ์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ค๋ธ์ ํธ๋ ์ค๋ธ์ ํธ ๊ณ์ธต์ ์ฌ๋ฌ๋ฒ ์ธ์คํด์คํ ํ๊ฑฐ๋ ๋์ ์ผ๋ก ์คํฐํ ํ์๊ฐ ์์ ๋ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
Message 3
"update_minimap" ๋ฉ์ธ์ง๋ "enemy" ๊ฒ์ ์ค๋ธ์ ํธ๋ก๋ถํฐ "interface" ๊ฒ์์ค๋ธ์ ํธ์ "gui" ์คํฌ๋ฆฝํธ๋ก ์ ์ก๋ฉ๋๋ค.
-- "enemy"์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ์์ "interface"์ GUI ์คํฌ๋ฆฝํธ๋ก "update_minimap"๋ฅผ ์ ์กํจ
msg.post("/interface#gui", "update_minimap")
์ฌ๊ธฐ๋ ์๋๊ฒฝ๋ก๋ก URL์ ์ธ ์ ์๋ ๋ ๋ค๋ฅธ ์ผ์ด์ค์ ๋๋ค. ๋์ "interface" ์ค๋ธ์ ํธ์ full id๋ฅผ ์จ์ ์ด ๋ฉ์ธ์ง๋ฅผ "gui" ์ปดํฌ๋ํธ๋ก ๋ณด๋ด์ผ ํฉ๋๋ค. ์คํฌ๋ฆฝํธ์ GUI์ปดํฌ๋ํธ๋ Lua์คํฌ๋ฆฝํธ์ ๊ด๋ จ๋ ์ ์ผํ ๊ฒ์ ์ค๋ธ์ ํธ ์ปดํฌ๋ํธ์ด๋ฉฐ ์์์ ๋ฉ์ธ์ง์ ๋ฐ์ํ ์ ์์ต๋๋ค. GUI์คํฌ๋ฆฝํธ๋ GUI์ฌ์๋ง ์ถ๊ฐ๋์ด์ผ ํ๋๊ฒ์ ๊ธฐ์ตํ์ธ์. GUI์คํฌ๋ฆฝํธ์ ๋ค๋ฅธ ์คํฌ๋ฆฝํธ๊ฐ์ ๋ฉ์ธ์ง ์ก์์ ์ ๋ค๋ฅธ ์ค๋ธ์ ํธ๊ฐ ์ก์์ ๋ฐฉ์๊ณผ ์์ ํ ๋์ผํ๊ฒ ๋์ํฉ๋๋ค.
Shorthands (์ฝ์นญ)
์ฐ๋ฆฌ๋ ๋ฉ์ธ์ง๋ฅผ ์์ฑํ ๋ URL์์ ๋ถํ์ํ ์ ๋ณด๋ ์๋ตํ๋๊ฒ์ด ์ด๋ป๊ฒ ๊ฐ๋ฅํ์ง ์ดํด๋ดค์ต๋๋ค. ์ถ๊ฐ์ ์ผ๋ก Defold๋ ๋ ๊ฐ์ง ํธ๋ฆฌํ ์ฝ์นญ์ ์ ๊ณตํฉ๋๋ค:
"." ํ์ฌ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ๊ฐ๋ฆฌํค๋ URL ์ฝ์นญ
"#" ํ์ฌ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ๋ฆฌํค๋ URL ์ฝ์นญ
์๋ฅผ ๋ค์ด:
-- ์ด ๊ฒ์์ค๋ธ์ ํธ๊ฐ ์
๋ ฅ ํฌ์ปค์ค๋ฅผ ์ป๋๋ก ํ์
msg.post(".", "acquire_input_focus")
-- ์ด ์คํฌ๋ฆฝํธ๋ก "reset" ๋ฉ์ธ์ง๋ฅผ ๋ณด๋
msg.post("#", "reset")
A concrete example (๊ตฌ์ฒด์ ์ธ ์์ )
๊ฐ๋จํ ์์ ๋ฅผ ์ดํด๋ด ์๋ค. ๋น์ ์ ๊ฒ์์ ์คํฏ(์ฒด๋ ฅ, ์ ์, ๋ณ์ ๋ณด๋์ค ๋ฑ) ๊ฐ์ด ํ๋ฉด์ ๋ณด์ฌ์ผํ ์์๋ค์ด ์๋ HUD๊ฐ ์์ผ๋ฉฐ, ์ด HUD๋ "hud"๋ผ๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ก ์ ์ด๋๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค.

์ฐ๋ฆฌ๋ ์ฒด๋ ฅ์ ์ฆ๊ฐ ์ํฌ ์ ์์ผ๋ฉฐ ์ด ์์ ์ "hud" ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ ์ํํฉ๋๋ค:
msg.post("hud#script", "increase_health")
์ด๋ ๊ฒ ํ๋ฉด id (ํน์ name)์ด "increase_health"์ธ ๋ฉ์ธ์ง๋ฅผ "hud" ์ค๋ธ์ ํธ์ "script"๋ผ๋ ์์ ์ ์ปดํฌ๋ํธ๋ก ๊ฒ์(post)ํ๊ฒ ๋ฉ๋๋ค. Defold๋ ๋ค์๋ฒ ๋ฉ์ธ์ง๊ฐ ๋ฐ์ก(dispatch)๋๋ฉด ๋ฉ์ธ์ง๋ฅผ ๋ฐฐ๋ฌํ๋ฉฐ, ์ด๋ ํ์ฌ ํ๋ ์ ๋ด์์ ๋ฐ์ํฉ๋๋ค.
๋ค์์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ์๋ต ๋ฐ์ผ๋ฉด ๋ฉ์ง ๋ฐฉ์์ผ๋ก ์ ์๊ฐ ์ฆ๊ฐํ๋ ์ฝ๋๋ฅผ ์์ฑํ์ฌ "hud" ๊ฒ์ ์ค๋ธ์ ํธ์ ์ถ๊ฐํฉ๋๋ค.
-- file: hud.script
function on_message(self, message_id, message, sender)
if message_id == hash("increase_health") then
-- ํํธ 1๊ฐ๋ฅผ ์๊น๋ป์ฉํ ์ ๋๋ฉ์ด์
์ผ๋ก HUD์ ์ถ๊ฐํด ๋ณด์.
โฆ
end
end
Message data
msg.post()์ ํจ์ ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
msg.post(receiver, message_id[, message])
์ฐ๋ฆฌ๋ ํธ์์ HUD์ ๋ชจ๋ ์ ๋ณด๋ฅผ ํ๋ฒ์ ์ ํ ํ ์ ์๋ ํ ๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ์ถ๊ฐํด ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๋ฉ์ธ์ง์ ์ด๋ฆ์ "set_stats"๋ก ์ ํ๊ณ ๋ฉ์ธ์ง ํ๋ผ๋ฏธํฐ๋ก ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ฒจ๋ถํฉ๋๋ค:
-- ๋ฉ์ธ์ง๋ก table ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ
msg.post("hud#script", "set_stats", { score = 100, stars = 2, health = 4 })
์ด ํธ์ถ์ ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ์ ํจ๊ป ๋ฉ์ธ์ง ํ๋ผ๋ฏธํฐ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์ด ์ธ์๋ ์ ํ์ ์ด๋ฉฐ ์ค๊ดํธ ์์์ ํค-๊ฐ ์์ผ๋ก ์ด๋ฃจ์ด์ง Lua ํ ์ด๋ธ์ด์ด์ผ ํฉ๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์๋ฃํ์ ๋ฐ์ดํฐ๊ฐ Lua ํ ์ด๋ธ ๋ฉ์ธ์ง์ ํฌํจ๋ ์ ์์ต๋๋ค. ์ซ์ํ, ๋ฌธ์์ดํ, ๋ถ๋ฆฐํ, URL, ํด์ฌ, ์ค์ฒฉ ํ ์ด๋ธ ๋ชจ๋ ์ ๋ฌ ํ ์ ์์ง๋ง ํจ์(function) ํ์ ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
-- Send table data containing a nested table
local invtable = { sword = true, shield = true, bow = true, arrows = 9 }
local msgdata = { score = 100, stars = 2, health = 4, inventory = invtable }
msg.post("hud#script", "set_stats", msgdata)
๋ฉ์ธ์ง ํ๋ผ๋ฏธํฐ ํ ์ด๋ธ์ ํฌ๊ธฐ์๋ ์๊ฒฉํ ์ ํ์ฌํญ์ด ์์ต๋๋ค. ์ด ์ ํ์ 2kb ๊น์ง์ ๋๋ค. ํ์ฌ ํ ์ด๋ธ์ด ์๋ชจํ๋ ์ ํํ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ด์ฆ๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ์์ง๋ง, collectgarbage("count") ๋ฅผ ์ฌ์ฉํ์ฌ ํ ์ด๋ธ์ ๊ฐ์ ์ฝ์ ํ๊ธฐ ์ ํ๋ฅผ ๋ฐ์ ธ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ธก์ ํ ์ ์์ต๋๋ค.
on_message()
on_message() ํจ์๋ 3๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ง๋๋ค. (๊ฒ์ ์ค๋ธ์ ํธ ์์ ์ ์ฐธ์กฐ๋ฅผ ํฌํจํ๋ "self"์๋ ๋ณ๊ฐ๋ก)
message_id
๋ฉ์ธ์ง์ ์ด๋ฆ์ ๋๋ค. ์ด ์ด๋ฆ์ ํด์ฌ(hash)๋ฉ๋๋ค.
message
๋ฉ์ธ์ง์ ๋ฐ์ดํฐ์ ๋๋ค. ์ด๊ฒ์ Lua ํ ์ด๋ธ์ ๋๋ค.
sender
๋ฐ์ ์์ ์ ์ฒด URL์ ๋๋ค.
function on_message(self, message_id, message, sender)
-- message id ์ถ๋ ฅํ๊ธฐ
print(message_id)
-- message data ์ถ๋ ฅํ๊ธฐ (ํ
์ด๋ธ์ด๋ผ pprint๋ฅผ ์ฌ์ฉํ์ง!)
pprint(message)
-- sender ์ถ๋ ฅํ๊ธฐ
print(sender)
end
์ ์ฝ๋๊ฐ ์คํ๋๋ฉด ์ฝ์์ฐฝ์ ์๋ ๋ด์ฉ์ด ์ถ๋ ฅ๋ฉ๋๋ค:
DEBUG:SCRIPT: hash: [set_stats]
DEBUG:SCRIPT:
{
health = 4,
stars = 2,
score = 100,
}
DEBUG:SCRIPT: url: [main:/game_controller#script]
๋ค์์ "hud" ๊ฒ์ ์ค๋ธ์ ํธ๊ฐ ์ด๋ค ๋ฐฉ์์ผ๋ก "set_stats"๋ฅผ ๊ฐ๋จํ ๊ตฌํํ๋์ง ๋ณด์ฌ์ฃผ๋ ์์ ์ ๋๋ค:
function init(self)
-- ํํธ10๊ฐ ๋ณ10๊ฐ๋ก GUI ๋
ธ๋๋ฅผ ๋ณต์ ํจ
self.heart_nodes = {}
self.star_nodes = {}
local heart_node = gui.get_node("heart")
local star_node = gui.get_node("star")
-- ์ฝ๊ฒ ์ต์ธ์ค ํ ์ ์๊ฒ ๋ชจ๋ ๋
ธ๋๋ฅผ ํ
์ด๋ธ์ ์ ์ฅํจ
table.insert(self.heart_nodes, heart_node)
-- ๋
ธ๋๊ฐ ๋นํ์ฑํ ๋ ์ฑ๋ก ์์ํจ
gui.set_enabled(heart_node, false)
for i = 1, 9 do
local clone = gui.clone(heart_node)
local pos = gui.get_position(heart_node)
pos.x = pos.x + i * 32
gui.set_position(clone, pos)
table.insert(self.heart_nodes, clone)
gui.set_enabled(clone, false)
end
table.insert(self.star_nodes, star_node)
gui.set_enabled(star_node, false)
for i = 1, 9 do
local clone = gui.clone(star_node)
local pos = gui.get_position(star_node)
pos.x = pos.x + i * 32
gui.set_position(clone, pos)
table.insert(self.star_nodes, clone)
gui.set_enabled(clone, false)
end
end
function on_message(self, message_id, message, sender)
if message_id == hash("set_stats") then
-- ์ ์ GUI๋
ธ๋๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ
gui.set_text(gui.get_node("score"), message.score)
-- ํํธ ๋
ธ๋์ ์๋งํผ ํ์ฑํ
for i = 1, message.health do
gui.set_enabled(self.heart_nodes[i], true)
end
-- ๋ณ ๋
ธ๋์ ์๋งํผ ํ์ฑํ
for i = 1, message.stars do
gui.set_enabled(self.star_nodes[i], true)
end
end
end
Child-parent vs. collection-object hierarchies (๋ถ๋ชจ-์์ ๊ณ์ธต๊ตฌ์กฐ์ ์ปฌ๋ ์ -์ค๋ธ์ ํธ ๊ณ์ธต๊ตฌ์กฐ ๋น๊ตํ๊ธฐ)
์ฐ๋ฆฌ๋ ๊ฒฝ๋ก(path)๋ฅผ ํตํ ์ค๋ธ์ ํธ ์ฃผ์ ์ง์ ์ด Defold์์ ์ ์ (static)์ด๋ผ๋ ๊ฒ์ ์์์ผ๋ฉฐ ์ด๋ ๊ฒ์ ๋ก์ง์ ์ฝ๋ฉํ ๋ ํญ์ ์ค๋ธ์ ํธ id์ ๋ฌด๊ฒฐ์ฑ์ ์ ๋ขฐํด๋ ๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ค๋ธ์ ํธ๊ฐ์ ๋ถ๋ชจ-์์ ๊ณ์ธต๊ตฌ์กฐ๋ ์ค๋ธ์ ํธ๊ฐ ์ด๋ป๊ฒ ๋ณํ(transformations)์ ๋ฐ์ํ๋์ง ์ํฅ์ ์ฃผ๋ ๋์ ์ธ ๊ด๊ณ(dynamic relation)์ ๋๋ค. ์ค๋ธ์ ํธ์ ์ ์ฉ๋๋ ๋ชจ๋ ๋ณํ์ ์ด ์ค๋ธ์ ํธ์ ์์๋ค์๊ฒ๋ ์ ์ฉ๋ฉ๋๋ค. "set_parent" ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ผ๋ก ๋ฐํ์์ ์ค๋ธ์ ํธ ๋ถ๋ชจ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
local parent = go.get_id("tree")
msg.post(".", "set_parent", { parent_id = parent })
๋ถ๋ชจ-์์ ๊ณ์ธต๊ตฌ์กฐ๋ ์๋ํฐ์์ ์ค์ ํ ์๋ ์์ผ๋ฉฐ ์ฌ์ ํ ๋์ ์ธ (dynamic) ์ํ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ํํธ๊ฐ ๋ฌ๋ฆฐ ๋๋ฌด๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค. ์ด๋ "tree" ์ค๋ธ์ ํธ์ ๋ช ๊ฐ์ "heart" ์ค๋ธ์ ํธ๋ก ๊ตฌ์ฑ๋์ด ์์ต๋๋ค. ๋ํ ๋๋ฌด๊ฐ ์ด์๊ฐ๋๋ฐ ํ์ํ "pot"๋ ์์ต๋๋ค. ์ฐ์ ์ด ์ค๋ธ์ ํธ๋ค์ ๋ถ๋ชจ์ ์์๊ด๊ณ๋ก ๋ง๋ค๊ธฐ ์ํด "hearttree"๋ผ๊ณ ๋ถ๋ฆฌ์ฐ๋ ์ปฌ๋ ์ ์ ์ค๋ธ์ ํธ๋ค์ ๋ฐฐ์นํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋์ "heart" ์ค๋ธ์ ํธ๋ฅผ "tree" ์ค๋ธ์ ํธ์ ๋๋๊ทธ ํ์ฌ ๊ฐ๋จํ ์์๊ฐ์ฒด๋ก ๋ง๋ค ์ ์์ต๋๋ค.

๋๋ฌด์ ํํธ ์์๋ค์ ๋ง๋ฌ์ผ๋ก์จ, ๋ง์น ๋๋ฌด ์ค๋ธ์ ํธ์ ์ผ๋ถ๋ถ์ธ ๊ฒ ์ฒ๋ผ ๋๋ฌด์ ์ฃผ๋ ๋ชจ๋ ๋ณํ์ด ํํธ๋ค์๊ฒ ์ํฅ์ ์ฃผ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋๋ฌด๋ฅผ ์๋ค๋ก ์์ง์ด๊ฒ ์ ๋๋ฉ์ด์ ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ํํธ๋ค๋ ๋ฐ๋ผ์ ์์ง์ด๊ฒ ๋ฉ๋๋ค.
"hearttree" ์ปฌ๋ ์ ๋ด์ ํํธ ์ค๋ธ์ ํธ์ ๋ํ ๊ฒฝ๋ก๋ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ๋์ ์ธ ๋ถ๋ชจ-์์ ๊ด๊ณ์ ์ํด ์ํฅ์ ๋ฐ์ง ์์ต๋๋ค.
/hearttree/heart1 ("/hearttree/tree/heart1"๊ฐ ์๋) /hearttree/heart2 /hearttree/heart3 /hearttree/heart4
๋ถ๋ชจ-์์ ๊ด๊ณ๋ ์ปฌ๋ ์ ๊ณ์ธต๊ตฌ์กฐ ๋ด์ ์ค๋ธ์ ํธ ์ฃผ์์ ๋ณ๊ฐ์ ๋๋ค. ๋ฐ๋ผ์, ๋ถ๋ชจ-์์ ๊ด๊ณ๋ ๊ฒฐ์ฝ ์ค๋ธ์ ํธ์ URL์ ๋ฐ์๋์ง ์์ต๋๋ค.
Advanced topics
Constructing URLs
๋๋ฌผ๊ธด ํ์ง๋ง ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก URL ์ค๋ธ์ ํธ๋ฅผ ๋ง๋ค์ด์ผํ ๊ฒฝ์ฐ๊ฐ ์์ ์๋ ์์ต๋๋ค. ์ด๋ด ๋ ์๋์ ๊ฐ์ด ํ์ธ์:
local my_url = msg.url()
my_url.socket = "main" -- ์ ํจํ ์ด๋ฆ์ผ๋ก ์ง์ ํ๊ธฐ
my_url.path = hash("/hearttree/tree") -- ๋ฌธ์์ด์ด๋ ํด์ฌ๋ก ์ง์ ํ๊ธฐ
my_url.fragment = "script" -- ๋ฌธ์์ด์ด๋ ํด์ฌ๋ก ์ง์ ํ๊ธฐ
msg.post(my_url, "grow")
URL ๋ฐ ํด๋น ์ปดํฌ๋ํธ๋ค์ ์กฐ์ฌํด๋ณด๋ฉด:
print(my_url) --> url: [main:/hearttree/tree#script]
print(my_url.socket) --> 786443 (internal numeric value)
print(my_url.path) --> hash: [/hearttree/tree]
print(my_url.fragment) --> hash: [script]
System sockets
Defold๋ ์์ง์ ํน์ ์๋ธ ์์คํ ๊ณผ ํต์ ํ๊ธฐ ์ํด URL์ socket ๋ถ๋ถ์ ํ์ฉํฉ๋๋ค:
- @physics:
- @render:
- @system:
path๋ fragment ๋ถ๋ถ์ ํ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ์๋ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋์ผ๋ก์จ ์์คํ ํ๋กํ์ผ๋ฌ๋ฅผ ํ ๊ธํ ์ ์์ต๋๋ค.
msg.post("@system:", "toggle_profile")
Collection Proxies
Defold๊ฐ ์์๋๋ฉด ๊ฒ์ ํ๋ก์ ํธ ์ ํ ์ฐฝ์ "bootstrap" ์๋์ "main_collection" ํญ๋ชฉ์ ์ง์ ๋ ์ปฌ๋ ์ ์ ์๋์ผ๋ก ๋ก๋ํ๊ณ ์ด๊ธฐํ ํฉ๋๋ค.
๋ณ๋์ ์ปฌ๋ ์ ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒ์ ๋ ๋ฒจ์ ์ ์งํด์ผ ํ๋ ๋ฑ, ์๋ก ๋ค๋ฅธ ์ปฌ๋ ์ ์ ๋์ ์ผ๋ก ๋ถ๋ฌ์์ผํ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์์ต๋๋ค. Defold๋ ๋์ ์ผ๋ก ๋ก๋๋๋ ์ปฌ๋ ์ ์ ์ํด ์ปฌ๋ ์ ํ๋ก์(Collection Proxy) ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฐ๋ฆฌ๊ฐ ์ปฌ๋ ์ ํ๋ก์ ์ค๋ธ์ ํธ๋ฅผ ์ถ๊ฐํ๊ณ "level"์ด๋ผ๊ณ ๋ช ๋ช ๋ ๋ช๋ช ์ปฌ๋ ์ ์ ๋์ฒดํ๋ ๊ฒ์ผ๋ก ์ ํ ํ๋ค๋ฉด, ์ด ํ๋ก์์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ผ๋ก ์ปฌ๋ ์ ์ ๋ก๋ํ ์ ์์ต๋๋ค.

msg.post("/loader#levelproxy", "load")
์ปฌ๋ ์ ์ด ๋ก๋๋๋ฉด ๋ฉ์ธ์ง๋ฅผ ๋๋ ค๋ฐ๊ณ ์ด๊ธฐํ ์์ ๋ฐ ๋ค๋ฅธ ์ต์์ ์ปฌ๋ ์ ์ผ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค.
function on_message(self, message_id, message, sender)
if message_id == hash("proxy_loaded") then
-- ์ปฌ๋ ์
์ด ๋ก๋๋์๊ณ ํ์ฑํ๋ฅผ ํด๋ณด์
msg.post(sender, "enable")
-- ๋ก๋๋ ์ปฌ๋ ์
์ ์๋ฌด๋์๊ฒ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ณด์
msg.post("level:/gamemaster#script", "wake_up")
end
end
์ด์ ๊ฐ์ด ์ต์์ ์ปฌ๋ ์ ๊ฐ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด, URL์ socket ํ๋๋ฅผ ์ฌ์ฉํ์ฌ ํ๊ฒ ์ค๋ธ์ ํธ๊ฐ ์์ฃผํ๋ ์ปฌ๋ ์ ์ ์ง์ ํด์ผ ํฉ๋๋ค.
์์ธํ ์ค๋ช ์ Collection proxy ๋ฌธ์์์ ์ฐพ์ ์ ์์ต๋๋ค.
Message chains
๊ฒ์๋ ๋ฉ์ธ์ง๋ค์ด ๋์คํจ์น๋๊ณ ์์ ์์ on_message()๊ฐ ํธ์ถ๋๋ฉด, ์๋ต ์ฝ๋๋ฅผ ๋ด์ ๋ ์ ๋ฉ์ธ์ง๋ฅผ ๊ฒ์ํ์ฌ ์ฃผ๊ฑฐ๋ ๋ฐ๊ฑฐ๋ ํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ๋ฐฉ์์ ๋๋ค. ๋น์ ์ ์์ง์ด ๋์คํจ์น ํด์ผํ๋ ๊ธด ๋ฉ์ธ์ง ์ฒด์ธ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์ธ์ ๋ฐ์ํ ๊น์?
์งง๊ฒ ๋๋ตํ์๋ฉด ์ด ๋์คํจ์น๋ ์ฆ์ ๋ฐ์ํฉ๋๋ค. ๊ฒ์์์ง์ ๋ฉ์ธ์ง๋ค์ ์ฒ๋ฆฌํ๋ ์์ ์ ์์ํ๊ณ ๋น์ ์ด ์ ๋ฉ์ธ์ง๋ฅผ ๊ฒ์ํ์ฌ ํ๋ฅผ ๊ณ์ ์ฑ์ฐ๋๋ผ๋ ๋ฉ์ธ์ง ํ๊ฐ ๋น์์ง ๋๊น์ง ๊ณ์ ์ฒ๋ฆฌํฉ๋๋ค.
๊ทธ๋ฌ๋ ๊ฒ์์์ง์ด ๋ฉ์ธ์งํ๋ฅผ ๋น์ธ ์ ์๋ ํ์๋ ์ ํ์ด ์์ต๋๋ค. ์ด๋ ๊ธด ๋ฉ์ธ์ง ์ฒด์ธ์ ํ ํ๋ ์ ๋ด์์ ํจ๊ณผ์ ์ผ๋ก ์ ํํฉ๋๋ค. ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ update() ์ฌ์ด์ ์์ง์ด ์ฒ๋ฆฌํ ์ ์๋ ๋์คํจ์น ์๊ฐ ์ผ๋ง๋ ๋๋์ง ์ฝ๊ฒ ํ ์คํธ ํ ์ ์์ต๋๋ค.
function init(self)
-- ์ค๋ธ์ ํธ ์ด๊ธฐํ ๋์ ๊ธด ๋ฉ์ธ์ง ์ฒด์ธ์ ์์ํด ๋ณผ๊น๋
-- ๊ทธ๋ฆฌ๊ณ update()๋ง๋ค ์ซ์๋ฅผ ์ฆ๊ฐํ์
print("INIT")
msg.post("#", "msg")
self.updates = 0
self.count = 0
end
function update(self, dt)
if self.updates < 5 then
self.updates = self.updates + 1
print("UPDATE " .. self.updates)
print(self.count .. " ํ ๋์คํจ์น ๋จ.")
self.count = 0
end
end
function on_message(self, message_id, message, sender)
if message_id == hash("msg") then
self.count = self.count + 1
msg.post("#", "msg")
end
end
์ด ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ฉด ์๋ ์ฒ๋ผ ์ถ๋ ฅ ๋ฉ๋๋ค:
DEBUG:SCRIPT: INIT
INFO:ENGINE: Defold Engine 1.2.36 (5b5af21)
DEBUG:SCRIPT: UPDATE 1
DEBUG:SCRIPT: 10 ํ ๋์คํจ์น ๋จ.
DEBUG:SCRIPT: UPDATE 2
DEBUG:SCRIPT: 75 ํ ๋์คํจ์น ๋จ.
DEBUG:SCRIPT: UPDATE 3
DEBUG:SCRIPT: 75 ํ ๋์คํจ์น ๋จ.
DEBUG:SCRIPT: UPDATE 4
DEBUG:SCRIPT: 75 ํ ๋์คํจ์น ๋จ.
DEBUG:SCRIPT: UPDATE 5
DEBUG:SCRIPT: 75 ํ ๋์คํจ์น ๋จ.
์ด ๋ฒ์ ์ Defold ์์ง์ init()๊ณผ ์ฒซ update() ํธ์ถ ์ฌ์ด์ 10ํ์ ๋ฉ์ธ์ง ํ ๋์คํจ์น๊ฐ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๋งค update() ๋ง๋ค 75ํ์ ๋ฉ์ธ์ง๊ฐ ์ํ๋์์ต๋๋ค.