Lua in Defold - kuimoani/defold GitHub Wiki
Lua in Defold
๋ํด๋ ์์ง์ ์คํฌ๋ฆฝํ ์ ์ํ Lua ์ธ์ด๊ฐ ๋ด์ฅ๋์ด ์์ต๋๋ค. Lua๋ ๊ฐ๋ ฅํ๊ณ , ๋น ๋ฅด๋ฉฐ ๊ฐ๋ณ๊ณ ์ฝ๊ฒ ์๋ฒ ๋ ๋๋ ๋์ ์ธ์ด์ ๋๋ค. ์ด๊ฒ์ ๋น๋์ค ๊ฒ์ ์คํฌ๋ฆฝํ ์ธ์ด๋ก ๋๋ฆฌ ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. Lua ํ๋ก๊ทธ๋จ์ ๊ฐ๋จํ ์ ์ฐจ์ ์ธ ๋ฐฉ์์ผ๋ก ์คํ๋ฉ๋๋ค. ์ด ์ธ์ด๋ ๋์ ์ผ๋ก ํ์ดํ๋๋ฉฐ ๋ฐ์ดํธ์ฝ๋ ์ธํฐํ๋ฆฌํฐ์ ์ํด ์คํ๋ฉ๋๋ค. ์ฆ๊ฐํ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ๋ ์์ต๋๋ค.
์ด ๋งค๋ด์ผ์ Defold์์ Lua๋ก ์์ ํ ๋ ๋ฌด์์ด ํ์ํ์ง ๊ณ ๋ คํ๋ฉฐ Lua ํ๋ก๊ทธ๋๋ฐ์ ๊ธฐ๋ณธ์ ๋น ๋ฅด๊ฒ ์๊ฐํ ๊ฒ์ ๋๋ค. ๋ง์ฝ ๋น์ ์ด ํ์ด์ฌ, ํ, ๋ฃจ๋น, ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ๋ค๋ฅธ ๋์ ์ธ์ด์ ๊ฒฝํ์ด ์๋ค๋ฉด, ๋น์ ์ ์ข ๋ ๋นจ๋ฆฌ ์ดํดํ ์๋ ์์ต๋๋ค. ๋น์ ์ด ๋ง์ฝ ํ๋ก๊ทธ๋๋ฐ์ ์์ ํ ์ฒ์ ์์ํ๋ค๋ฉด ์ด์ฌ์๋ฅผ ์ํ Lua ์ฑ ์ด ํ์ํ ์๋ ์์ต๋๋ค. ์ ํ์ง๋ ๋ง์ด ์์ต๋๋ค.
Lua versions
์ฐ๋ฆฌ๋ Defold๊ฐ ๋ชจ๋ ํ๋ซํผ์์ ๊ฐ์ ๋์์ ํ๋๋ฐ ์ด์ ์ ๋ง์ถ๊ณ ์์ต๋๋ค. ํ์ง๋ง ํ์ฌ Lua ๋ฒ์ ๊ฐ์ ์ฝ๊ฐ์ ๋ถ์ผ์น๊ฐ ์์ต๋๋ค. HTML5์ iOS 64 ๋นํธ ํ๋ซํผ์ ๊ฒฝ์ฐ ์ฐ๋ฆฌ๋ Lua 5.1์ ์ฌ์ฉํ์ง๋ง ๋ค๋ฅธ ํ๋ซํผ์์๋ LuaJIT์ ์ฌ์ฉํฉ๋๋ค. LuaJIT์ 5.1 ๊ธฐ๋ฐ์ด๊ธด ํ์ง๋ง ๋ช๊ฐ์ง ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ด ๋ ์ถ๊ฐ๋์์ต๋๋ค.
**๊ฒ์์ด ๋ชจ๋ ํ๋ซํผ์์ ๋์ผํ๊ฒ ์๋ํ๋๋ก ํ๋ ค๋ฉด Lua 5.1์ ๋ง์ถฐ ๊ฐ๋ฐํ๋๊ฒ์ด ์ข์ต๋๋ค. **
Lua books and resources
- Programming in Lua (first edition) Later editions are available in print.
- Lua 5.1 reference manual
- Beginning Lua Programming (Wrox, 2007)
- Game Development with Lua (Charles River Media, 2005)
Syntax
ํ๋ก๊ทธ๋จ ๋ฌธ๋ฒ์ ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ฝ์ ์ ์์ต๋๋ค. ๋ช ๋ น๋ฌธ์ ๊ฐ ๋ผ์ธ๋ง๋ค ํ๋์ฉ ์ฐ์ฌ์ง๋ฉฐ ๋ช ๋ น๋ฌธ์ ๋์ ํ์ํ ํ์๊ฐ ์์ต๋๋ค. ์ ํ์ ์ผ๋ก ์ธ๋ฏธ์ฝ๋ก ;์ผ๋ก ๋ช ๋ น๋ฌธ์ ๊ตฌ๋ถํ ์ ์์ต๋๋ค. ์ฝ๋๋ธ๋ก์ ํค์๋๋ก ๊ตฌ๋ถ๋๋ฉฐ end ํค์๋๋ก ๋์ ๊ตฌ๋ถํฉ๋๋ค. ์ฃผ์์ ๋ธ๋ก์ด๋ ๊ฐ ์ค์ ๋์ ์ธ ์ ์์ต๋๋ค.
--[[
์ด๋ ๊ฒ ์ฌ๋ฌ์ค๋ก ์ฃผ์์
์ธ ์ ์์ต๋๋ค.
--]]
a = 10
b = 20 ; c = 30 -- ํ ์ค์์ ๋ช
๋ น์ด ๋ ๊ฐ ์ฐ๊ธฐ
if my_variable == 3 then
call_some_function(true) -- ํ ์ค ์ฃผ์ ์ฐ๊ธฐ
else
call_another_function(false)
end
Variables and data types
Lua๋ ๋์ ์ผ๋ก ์๋ฃํ์ด ์ ํด์ง๋๋ฐ ์ค์ ๊ฐ์ ์๋ฃํ์ด ์์ง๋ง ๋ณ์๋ ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฆ ๋ค๋ฅธ ์ ์ ํ์ ์ธ์ด์ ๋ฌ๋ฆฌ ์ํ๋๋๋ก ๋ณ์์ ์๋ฌด ๊ฐ์ด๋ ํ ๋นํ ์ ์์ต๋๋ค. Lua์๋ 8๊ฐ์ง ๊ธฐ๋ณธ ์๋ฃํ์ด ์์ต๋๋ค.
nil
์ด ์๋ฃํ์ nil๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ํ ๋น๋์ง ์์ ๋ณ์์ ๊ฐ์ด ์๋ฏธ์๋ ๊ฐ์ด ์์์ ๋ํ๋ ๋๋ค.
print(my_var) -- "my_var"๋ณ์์ ์์ง ๊ฐ์ด ์ง์ ๋์ง ์์๋ค๋ฉด "nil"์ด ์ถ๋ ฅ๋ฉ๋๋ค.
boolean
๋ถ๋ฆฐ์ true๋ false๊ฐ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. false๋ nil์ธ ์กฐ๊ฑด์ false๊ฐ์ด ๋๋ฉฐ, ๋ค๋ฅธ ๋ชจ๋ ๊ฐ์ true๊ฐ ๋ฉ๋๋ค.
flag = true
if flag then
print("flag๋ true์ด๋ค.")
else
print("flag๋ false์ด๋ค.")
end
if my_var then
print("my_var๋ nil๋ false๋ ์๋๋ค!")
end
if not my_var then
print("my_var๋ nil์ด๊ฑฐ๋ false์ด๋ค!")
end
number
์ซ์ํ์ ๋ด๋ถ์ ์ผ๋ก 64๋นํธ ์ ์(integer) ๋๋ 64๋นํธ ๋ถ๋ ์์ซ์ (float)์ผ๋ก ํ์๋ฉ๋๋ค. Lua๋ ํ์์ ๋ฐ๋ผ ์๋์ ์ผ๋ก ์ด๋ฌํ ํํ์ ๋ณํํ๋ฏ๋ก ์ผ๋ฐ์ ์ผ๋ก ๊ฑฑ์ ํ ํ์๊ฐ ์์ต๋๋ค.
print(10) --> prints '10'
print(10.0) --> '10'
print(10.000000000001) --> '10.000000000001'
a = 5 -- integer
b = 7/3 -- float
print(a - b) --> '2.6666666666667'
string
๋ฌธ์์ด์ ๋๋ฌธ์(\0)๋ฅผ ํฌํจํ๋ 8๋นํธ๊ฐ์ ๊ฐ์ง๋ ๋ถ๋ณ์ ๋ฐ์ดํธ ์ํ์ค(immutable sequences of bytes)์ ๋๋ค. Lua๋ ๋ฌธ์์ด์ ๋ด์ฉ์ ๋ํด ์๋ฌด๋ฐ ์ถ์ ์ ํ์ง ์์ผ๋ฏ๋ก ์ด๋ ํ ๋ฐ์ดํฐ๋ ์ ์ฅํ ์ ์์ต๋๋ค. ๋ฌธ์์ด์ ์ ์๋ ์๋ฐ์ดํ(")๋ ์ฑ๊ธ๋ฐ์ดํ(')๋ก ์ธ ์ ์์ต๋๋ค. Lua๋ ๋ฐํ์์ ์ซ์์ ๋ฌธ์์ด์ ๋ณํํฉ๋๋ค. ๋ฌธ์์ด์ .. ์ฐ์ฐ์์ ์ํด ๋ฌธ์์ด ๋ผ๋ฆฌ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
๋ฌธ์์ด์ C์ธ์ด ์คํ์ผ์ ์ด์ค์ผ์ดํ ์ํ์ค๋ฅผ ๋ฐ๋ฆ ๋๋ค :
| \a | bell |
| \b | back space |
| \f | form feed |
| \n | newline |
| \r | carriage return |
| \t | horizontal tab |
| \v | vertical tab |
| \\ | backslash |
| " | double quote |
| ' | single quote |
| \[ | left square bracket |
| \] | right square bracket |
| \ddd | 10์ง์๋ฅผ ํ์ํ๋ฉฐ ์ฌ๊ธฐ์ ddd๋ ์ต๋ 3์๋ฆฌ๋ก ํ์๋ฉ๋๋ค. |
my_string = "hello"
another_string = 'world'
print(my_string .. another_string) --> "helloworld"
print("10.2" + 1) --> 11.2
print(my_string + 1) -- ์๋ฌ, "hello"๋ฅผ ์ซ์๋ก ๋ณํํ ์ ์์
print(my_string .. 1) --> "hello1"
print("one\nstring") --> one
--> string
print("\097bc") --> "abc"
multi_line_string = [[
์ฌ๋ฌ์ค๋ก ๊ตฌ์ฑ๋ ๋ฌธ์์ด์
๋๋ค. ์ด๊ฒ์ ๋ชจ๋ ๋ฌธ์์ด
๋ณ์์ ์ ์ฅ๋๋ฉฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
]]
function
ํจ์๋ Lua์์ ์ต์์ ๊ฐ์ ๋๋ค. ์ฆ ํจ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ๊ฐ์ ๋ฐํ ํ ์ ์์ต๋๋ค. ํจ์์ ํ ๋น๋ ๋ณ์๋ ํจ์์ ๋ํ ์ฐธ์กฐ(reference)๋ฅผ ํฌํจํฉ๋๋ค. ๋ณ์๋ฅผ ์ต๋ช ํจ์์ ํ ๋น ํ ์ ์์ง๋ง Lua๋ ํธ์์ (function name(param1, param2) โฆ? end) ์ ๊ฐ์ ๋ฌธ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
-- 'my_plus'์ ํจ์๋ฅผ ํ ๋นํ๊ธฐ
my_plus = function(p, q)
return p + q
end
print(my_plus(4, 5)) --> 9
-- ๋ณ์ 'my_mult'์ ํจ์๋ฅผ ํ ๋นํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ
function my_mult(p, q)
return p * q
end
print(my_mult(4, 5)) --> 20
-- ํจ์๋ฅผ 'func' ๋งค๊ฐ๋ณ์๋ก ๊ฐ์ ธ์ด
function operate(func, p, q)
return func(p, q) -- 'p'์ 'q' ๋งค๊ฐ๋ณ์๋ฅผ ์ ๊ณต๋ ํจ์๋ก ํธ์ถ
end
print(operate(my_plus, 4, 5)) --> 9
print(operate(my_mult, 4, 5)) --> 20
-- adder ํจ์๋ฅผ ์์ฑํ๊ณ ๋ฐํํจ
function create_adder(n)
return function(a)
return a + n
end
end
adder = create_adder(2)
print(adder(3)) --> 5
print(adder(10)) --> 12
table
ํ ์ด๋ธ์ Lua์ ์ ์ผํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ํ์ ์ ๋๋ค. ์ด๊ฒ์ ๋ฆฌ์คํธ, ๋ฐฐ์ด, ์ํ์ค, ์ฌ๋ณผํ ์ด๋ธ, ์ธํธ, ๋ ์ฝ๋, ๊ทธ๋ํ, ํธ๋ฆฌ ๋ฑ์ ํํํ๋๋ฐ ์ฌ์ฉ๋๋ ๊ด๊ณํ ๋ฐฐ์ด ๊ฐ์ฒด(associative array object)์ ๋๋ค. ํ ์ด๋ธ์ ํญ์ ์ต๋ช ์ด๋ฉฐ ํ ์ด๋ธ์ ํ ๋นํ๋ ๋ณ์๋ ํ ์ด๋ธ ์์ฒด๊ฐ์ ํฌํจํ ์ ์์ง๋ง ์ฐธ์กฐ๊ฐ์ ํฌํจ ํ ์ ์์ต๋๋ค. ํ ์ด๋ธ์ ์ํ์ค๋ก(์์๋๋ก) ์ด๊ธฐํ ํ ๋, ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค ๋ฒํธ๋ 0์ด ์๋๋ผ 1์ ๋๋ค.
-- ํ
์ด๋ธ์ ์ํ์ค๋ก ์ด๊ธฐํ
weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
print(weekdays[1]) --> "Sunday"
print(weekdays[5]) --> "Thursday"
-- ์ํ์ค ๊ฐ์ ์ฌ์ฉํ์ฌ ํ
์ด๋ธ์ ๋ ์ฝ๋๋ก ์ด๊ธฐํ
moons = { Earth = { "Moon" }, Uranus = { "Puck", "Miranda", "Ariel", "Umbriel", "Titania", "Oberon" } }
print(moons.Uranus[3]) --> "Ariel"
-- ํ
์ด๋ธ์ ๋น ์์ฑ์{} ๋ก ๋ง๋ค๊ธฐ
a = 1
t = {}
t[1] = "first"
t[a + 1] = "second"
t.x = 1 -- same as t["x"] = 1
-- ํ
์ด๋ธ์ ํค, ๊ฐ์ ์์ผ๋ก ๋ฐ๋ณตํ๊ธฐ
for key, value in pairs(t) do
print(key, value)
end
--> 1 first
--> 2 second
--> x 1
u = t -- u๋ ์ด์ t์ ๊ฐ์ ํ
์ด๋ธ์ ์ฐธ์กฐํจ
u[1] = "changed"
for key, value in pairs(t) do -- ์ฌ์ ํ t๋ก ๋ฐ๋ณต์ค!
print(key, value)
end
--> 1 changed
--> 2 second
--> x 1
userdata
์ ์ ๋ฐ์ดํฐ๋ ์์์ C ๋ฐ์ดํฐ๋ฅผ Lua ๋ณ์์ ์ ์ฅ ํ ์ ์๋๋ก ์ ๊ณต๋๊ณ ์์ต๋๋ค. Defold๋ Hash๊ฐ(hash), URL ๊ฐ์ฒด(url), ์ํ ๊ฐ์ฒด(vertor3, vector4, matrix4, quaternion), ๊ฒ์ ๊ฐ์ฒด, GUI๋ ธ๋(node), ๋ ๋ ์์ ์(predicate), ๋ ๋ ํ๊ฒ (render_target), ๋ ๋ ์์ ๋ฒํผ(constant_buffer)์ ์ ์ฅํ๋๋ฐ ์ ์ ๋ฐ์ดํฐ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
thread
์ค๋ ๋๋ ๋ ๋ฆฝ์ ์ธ ์คํ ์ค๋ ๋๋ฅผ ๋ํ๋ด๋ฉฐ ์ฝ๋ฃจํด(coroutines)์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ์์ธํ ๊ฒ์ ์๋๋ฅผ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
Operators
Arithmetic operators(์ฐ์ ์ฐ์ฐ์)
์ํ ์ฐ์ฐ์ +, -, *, /, ๋จํญ- (๋ถ์ ), ์ง์ ^
a = -1
print(a * 2 + 3 / 4^5) --> -1.9970703125
Relational/comparison operators(๊ด๊ณ/๋น๊ต ์ฐ์ฐ์)
< (~๋ณด๋ค ์์), > (~๋ณด๋ค ํฐ), <= (~๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์), >= (~๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์), == (๊ฐ์), ~= (๊ฐ์ง ์์). ์ด ์ฐ์ฐ์๋ค์ ํญ์ true๋ false๋ฅผ ๋ฐํํฉ๋๋ค. ์๋ก ๋ค๋ฅธ ์๋ฃํ์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ง์ฝ ์๋ฃํ์ด ๊ฐ์ ๊ฒฝ์ฐ, ์๋ฃํ์ ๋ง๊ฒ ๋น๊ต๋ฉ๋๋ค. Lua๋ ํ ์ด๋ธ, ์ ์ ๋ฐ์ดํฐ, ํจ์๋ ์ฐธ์กฐ(reference)์ ์ํด ๋น๊ตํฉ๋๋ค. ๊ฐ์ ์ค๋ธ์ ํธ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ง ๋ ๊ฐ์ด ๊ฐ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
a = 5
b = 6
if a <= b then
print("a๋ b๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.")
end
๋ ผ๋ฆฌ ์ฐ์ฐ์: and, or, not. and์ฐ์ฐ์๋ false์ผ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํํฉ๋๋ค. or์ฐ์ฐ์๋ false๊ฐ ์๋ ๊ฒฝ์ฐ ์ฒซ๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด ๋๋ฒ์งธ ์ธ์๋ฅผ ๋ฐํํฉ๋๋ค.
print(true or false) --> true
print(true and false) --> false
print(not false) --> true
if a == 5 and b == 6 then
print("a๋ 5์ด๊ณ b๋ 6์ด๋ค.")
end
Concatenation (์ฐ๊ฒฐ)
๋ฌธ์์ด์ ..์ฐ์ฐ์๋ก ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์ซ์ํ์ ์ฐ๊ฒฐํ๋ฉด ๋ฌธ์์ด๋ก ๋ณํ๋ฉ๋๋ค.
print("donkey" .. "kong") --> "donkeykong"
print(1 .. 2) --> "12"
Length
๋จํญ ๊ธธ์ด ์ฐ์ฐ์์ธ #์ ๋ฌธ์์ด์ ๊ธธ์ด๋ฅผ ๋ฐ์ดํธ ์๋ก ๊ณ์ฐํฉ๋๋ค. ํ ์ด๋ธ์ ๊ธธ์ด๋ ์ํ์ค์ ๊ฐฏ์๋ก ๊ณ์ฐ๋๋ฉฐ, ์ธ๋ฑ์ค ๋ฒํธ๋ 0์ด ์๋๋ผ 1๋ถํฐ ์์ธ๋ฉ๋๋ค. ์ฃผ์: ๋ง์ฝ ๋ง์ง๋ง ์ํ์ค๊ฐ nil๊ฐ์ด๋ผ๋ฉด ์ ํ ์ํ์ค์ ์ธ๋ฑ์ค๊ฐ ๊ธธ์ด๊ฐ ๋ฉ๋๋ค.
s = "donkey"
print(#s) --> 6
t = { "a", "b", "c", "d" }
print(#t) --> 4
u = { a = 1, b = 2, c = 3 }
print(#u) --> 0
v = { "a", "b", nil }
print(#v) --> 2
Flow control (ํ๋ฆ์ ์ด)
Lua๋ ์ผ๋ฐ์ ์ธ ํ๋ฆ์ ์ด๋ฅผ ์ ๊ณตํฉ๋๋ค.
if then else
์กฐ๊ฑด์ ํ ์คํธํ ๋, ์กฐ๊ฑด์ด true์ด๋ฉด then๊ตฌ๋ฌธ์ ์คํํ๊ณ , ๊ทธ๋ ์ง ์์ผ๋ฉด (์ ํ์ ์ผ๋ก) else๊ตฌ๋ฌธ์ ์คํํฉ๋๋ค. if๋ฌธ์ ์ค์ฒฉํ๋ ๋์ elseif ๊ตฌ๋ฌธ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๊ฒ์ Lua๊ฐ ๊ฐ์ง๊ณ ์์ง ์์ switch๋ฌธ์ ๋์ฒดํฉ๋๋ค.
a = 5
b = 4
if a < b then
print("a๋ b๋ณด๋ค ์์ต๋๋ค.")
end
if a == '1' then
print("a๋ 1์ด๋ค.")
elseif a == '2' then
print("a๋ 2์ด๋ค.")
elseif a == '3' then
print("a๋ 3์ด๋ค.")
else
print("์ด๊ฒ ๋ญ์ง ๋ชจ๋ฅด๊ฒ ์ด...")
end
while
์กฐ๊ฑด์ด true์ผ ๋์ ๊ตฌ๊ฐ์ ๋ฐ๋ณต ์คํํฉ๋๋ค.
weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
-- Print each weekday
i = 1
while weekdays[i] do
print(weekdays[i])
i = i + 1
end
repeat until
์กฐ๊ฑด์ด true์ผ๋๊น์ง ๊ตฌ๊ฐ์ด ๋ฐ๋ณต๋ฉ๋๋ค. ์ด ์กฐ๊ฑด์ ๊ตฌ๊ฐ ๋ค์ ๊ณ์ฐ๋๋ฏ๋ก ์ ์ด๋ ํ ๋ฒ์ ์คํ ๋ฉ๋๋ค.
weekdays = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"}
-- Print each weekday
i = 0
repeat
i = i + 1
print(weekdays[i])
until weekdays[i] == "Saturday"
for
Lua๋ for๋ฐ๋ณต๋ฌธ์ ์ํด numeric๊ณผ generic ๋ฐฉ์์ด ์์ต๋๋ค. numeric์ 2๋ 3 ๊ฐ์ ์ซ์๊ฐ์ ์ทจํ๋ ๋ฐ๋ฉด, generic์ iterator ํจ์์ ์ํด ๋ชจ๋ ๊ฐ๋ค์ ๋ฐ๋ณต์ํํ๋ฉฐ ๋ฐํํฉ๋๋ค.
-- 1์์ 10๊น์ง ์ซ์ ์ถ๋ ฅํ๊ธฐ
for i = 1, 10 do
print(i)
end
-- 1์์ 10๊น์ง 2์ฉ ๊ฑด๋๋ฐ๋ฉฐ ์ซ์ ์ถ๋ ฅํ๊ธฐ
for i = 1, 10, 2 do
print(i)
end
-- 10์์ 1๊น์ง ์ถ๋ ฅํ๊ธฐ
for i=10, 1, -1 do
print(i)
end
t = { "a", "b", "c", "d" }
-- ์ํ์ค๋ฅผ ๋ฐ๋ณตํ๋ฉฐ ๊ฐ ์ถ๋ ฅํ๊ธฐ
for i, v in ipairs(t) do
print(v)
end
break and return
break๊ตฌ๋ฌธ์ for, while, repeat๊ฐ์ ๋ฐ๋ณต๋ฌธ ๋ธ๋ก ์์์ ๋น ์ ธ๋์ฌ ๋ ์ฌ์ฉ๋ฉ๋๋ค. return๊ตฌ๋ฌธ์ ํจ์๊ฐ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์คํ์ ๋๋ด์ผ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค. break์ return์ ๋ธ๋ก์์ ๋ง์ง๋ง ๋ช ๋ น์ด๋ก ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
a = 1
while true do
a = a + 1
if a >= 100 then
break
end
end
function my_add(a, b)
return a + b
end
print(my_add(10, 12)) --> 22
Locals, globals and lexical scoping
๋ชจ๋ ๋ณ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก global ๋ณ์์ด๋ฉฐ Lua ๋ฐํ์ ์ปจํ ์คํธ์ ๋ชจ๋ ๊ณณ์์ ์ ๊ทผ ํ ์ ์์ต๋๋ค. ์๋๋ฉด ๋ช ํํ๊ฒ ํ์ฌ ๋ฒ์์์๋ง ์ ๊ทผ ํ ์ ์๊ฒ local ๋ณ์๋ฅผ ์ ์ธ ํ ์๋ ์์ต๋๋ค.
Lua๋ ์์ค ํ์ผ์ ๋ฐ๋ผ ๋ถ๋ฆฌ๋ ์์ญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ ํ์ผ์์ ์ต์์ ๋ ๋ฒจ์ local๋ณ์ ์ ์ธ์ Lua ์คํฌ๋ฆฝํธ ํ์ผ์ local ๋ณ์์์ ์๋ฏธํฉ๋๋ค. ๊ฐ ํจ์๋ ๋๋ค๋ฅธ ์ค์ฒฉ ์์ญ์ ์์ฑํ๋ฉฐ ๊ฐ ์ ์ด ๊ตฌ์กฐ ๋ธ๋ก์ ์ถ๊ฐ์ ์ธ ์์ญ์ ์์ฑํฉ๋๋ค. do์ end ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ช ํํ ๋ณ๋ ์์ญ์ ๋ง๋ค ์๋ ์์ต๋๋ค. Lua๋ ์ธ์ด์ ์ธ ์์ญ(lexical scope)๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ ์ด๋ ๋๋ฌ์ธ์ธ ์์ญ์ผ๋ก๋ถํฐ local๋ณ์์ ๋ชจ๋ ์ ๊ทผ์ ํ ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. local๋ณ์๋ ์ฌ์ฉํ๊ธฐ ์ ์ ์ ์ธ๋ถํฐ ํด์ผํจ์ ์์๋๊ธฐ ๋ฐ๋๋๋ค.
function my_func(a, b)
-- 'a'์ 'b'๋ ์ด ํจ์์ local๋ณ์์ด๋ฉฐ ์ด ์์ญ ์์์ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
do
local x = 1
end
print(x) --> nil. 'x'๋ do-end๊ตฌ๋ฌธ ์์์ ์ ์ธ๋์์ผ๋ฏ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
print(foo) --> nil. 'foo'๋ 'my_func'์ดํ์ ์ ์ธ๋์์ต๋๋ค.
print(foo_global) --> "value 2"
end
local foo = "value 1"
foo_global = "value 2"
print(foo) --> "value 1". 'foo'๋ ์ ์ธ ์ดํ์ด๊ณ ์ต์์ ์์ญ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ๊ฐ๋ฅํฉ๋๋ค.
์คํฌ๋ฆฝํธ ํ์ผ์์ localํจ์๋ฅผ ์ ์ธํ๋ ๊ฒ์(์ผ๋ฐ์ ์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค.) ์ฝ๋์ ์์๋ฅผ ์ฃผ์๊น๊ฒ ์ดํด๋ณผ ํ์๊ฐ ์์ต๋๋ค. ์๋ก ํธ์ถ๋๋ ํจ์๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ ๋ฐฉ์ ์ธ(forward declarations)์ด ํ์ํ ์๋ ์์ต๋๋ค.
local func2 -- 'func2'๋ฅผ ์ ๋ฐฉ์ ์ธํจ
local function func1(a)
print("func1")
func2(a)
end
function func2(a) -- or func2 = function(a)
print("func2")
if a < 10 then
func1(a + 1)
end
end
function init(self)
func1(1)
end
๋ง์ฝ ๋ค๋ฅธ ํจ์์ ๋๋ฌ์ธ์ธ ํจ์๋ฅผ ๋ง๋ ๋ค๋ฉด, ์์ชฝ ํจ์ ์ญ์ local ๋ณ์๋ค์ ๋ชจ๋ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค. ์ด ๋ฐฉ์์ ๋ค์ํ ์์ฑ์๋ฅผ ๋ง๋๋๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
function create_counter(x)
-- 'x'๋ 'create_counter'ํจ์์ ๋ก์ปฌ๋ณ์์
๋๋ค.
return function()
x = x + 1
return x
end
end
count1 = create_counter(10)
count2 = create_counter(20)
print(count1()) --> 11
print(count2()) --> 21
print(count1()) --> 12
Variable shadowing
๊ฐ์ ์ด๋ฆ์ผ๋ก ์ฌ์ ์ธ๋ ๋ณ์๋ ๊ทธ๋ฆผ์ํจ๊ณผ๊ฐ ๋ฐ์ํ๊ฒ ๋์ด ์ฌ์ค์ ๋ฉ๋๋ค.
my_global = "global"
print(my_global) -->"global"
local v = "local"
print(v) --> "local"
local function test(v)
print(v)
end
function init(self)
v = "apple"
print(v) --> "apple"
test("banana") --> "banana"
end
Coroutines
ํจ์๋ ์ฒ์๋ถํฐ ๋๊น์ง ์คํ๋๋ฉฐ ์ค๊ฐ์ ๋ฉ์ถ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ฝ๋ฃจํด์ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ผ๋ก ๊ทธ๊ฒ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ง์ฝ ๊ฒ์ ์ค๋ธ์ ํธ์ y์ขํ๋ฅผ ํน์ ํ ์์น๋ก ์ด๋์ํค๋ฉฐ ํ๋ ์๋ง๋ค ์ ๋๋ฉ์ด์ ํจ๊ณผ๋ฅผ ์ค์ผ ํ๋ค๊ณ ์๊ฐํด๋ด ์๋ค. ์๋์์ ๋ณด๋ ๊ฒ ์ฒ๋ผ update() ํจ์๋ฅผ ํ์ฉํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐ ํ ์ ์์ง๋ง ์ฝ๋ฃจํด์ ์ฌ์ฉํ์ฌ ์ฌ์ด ๋ฐฉ๋ฒ์ผ๋ก ๋ ํ์ฅ ํ ์๋ ์์ต๋๋ค. ๋ชจ๋ ์ํ๊ฐ์ ์ฝ๋ฃจํด ์์ ์ ์ฅ๋ฉ๋๋ค.
์ฝ๋ฃจํด์์ yield๊ฐ ํธ์ถ๋ ๋ ์ ์ด๊ถ์ด ํธ์ถ์์๊ฒ ๋ฐํ๋์ง๋ง ์คํ ์ง์ ์ด ๊ธฐ์ต๋์ด ๋์ค์ ๊ณ์ ์คํ๋๊ฒ ๋ฉ๋๋ค.
-- ์ด๊ฒ์ด ๋ฐ๋ก ์ฐ๋ฆฌ์ ์ฝ๋ฃจํด!
local function sequence(self)
coroutine.yield(120)
coroutine.yield(320)
coroutine.yield(510)
coroutine.yield(240)
return 440 -- ๋ง์ง๋ง ๊ฐ์ ๋ฐํํ๋ค.
end
function init(self)
self.co = coroutine.create(sequence) -- ์ฝ๋ฃจํด์ ์์ฑํ์ฌ 'self.co'๋ฅผ ์ค๋ ๋ ์ค๋ธ์ ํธ๋ก ๋ง๋ ๋ค.
go.set_position(vmath.vector3(100, 0, 0)) -- ์์น ์ด๊ธฐํํ๊ธฐ
end
function update(self, dt)
local status, y_pos = coroutine.resume(self.co, self) -- ์ฝ๋ฃจํด์ ์ฌ์คํํ๋ค.
if status then
-- ์ฝ๋ฃจํด์ด ์์ง ์ด์ ์๋ค๋ฉด yield๊ฐ ์ ์์น๊ฐ์ ๋ฐํํ ๊ฒ์ด๋ค.
go.set_position(vmath.vector3(100, y_pos, 0))
end
end
Defold scripts
Defold ์๋ํฐ๋ Lua ์คํฌ๋ฆฝํ ์ ์ํด ๋ฌธ๋ฒ ์ปฌ๋ฌ๋ง๊ณผ ์๋์์ฑ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค. Defold ํจ์ ์ด๋ฆ์ ์์ฑ์ํค๊ธฐ ์ํด Ctrl+Space๋ฅผ ๋๋ฅด๋ฉด ์ ๋ ฅ์ค์ธ ํจ์๋ช ์ ์๋ง์ ํจ์ ๋ชฉ๋ก์ ๋ณด์ฌ์ค๋๋ค.

Defold์ Lua ์คํฌ๋ฆฝํธ๋ 3๊ฐ์ง ํ์์ผ๋ก ๊ตฌ๋ถ๋๋ฉฐ, ๊ฐ๊ฐ ๋ค๋ฅธ Defold ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Logic scripts
ํ์ฅ์๋ .script ์ด๋ฉฐ ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ์ ์ํด ์คํ๋ฉ๋๋ค. ๋ก์ง ์คํฌ๋ฆฝํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์ ์ดํ๊ฑฐ๋ ๋ ๋ฒจ์ ๋ก๋ฉํ์ฌ ๊ฒ์ ๊ท์น ๋ฑ๊ณผ ์ฎ๋ ๋ก์ง์ ๊ตฌํํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ก์ง ์คํฌ๋ฆฝํธ๋ GUI๋ Render ํจ์๋ฅผ ์ ์ธํ ๋ชจ๋ Defold ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ์ ๊ทผ ํ ์ ์์ต๋๋ค.
GUI scripts
ํ์ฅ์๋ .guiscript ์ด๋ฉฐ GUI์ปดํฌ๋ํธ์ ์ํด ์คํ๋๊ณ ์ผ๋ฐ์ ์ผ๋ก HUD๋ ๋ฉ๋ด ๊ฐ์ GUI์์๋ค์ ํ์ํ๋๋ฐ ์๊ตฌ๋๋ ๋ก์ง์ ํฌํจํ๊ณ ์์ต๋๋ค. GUI์คํฌ๋ฆฝํธ๋ GUI๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ์ ๊ทผ ํ ์ ์์ต๋๋ค.
Render scripts
ํ์ฅ์๋ .renderscript ์ด๋ฉฐ ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ์ํด ์คํ๋๊ณ ๊ฐ ํ๋ ์๋ง๋ค ๊ฒ์์ ๋ชจ๋ ๊ทธ๋ํฝ์ ๋ ๋๋งํ๋๋ฐ ํ์ํ ๋ก์ง์ ํฌํจํ๊ณ ์์ต๋๋ค. ๋ ๋ ์คํฌ๋ฆฝํธ๋ Render ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์์ ์ ๊ทผ ํ ์ ์์ต๋๋ค.
Script execution and callbacks
Defold๋ Lua ์คํฌ๋ฆฝํธ๋ฅผ ์์ง ๋ผ์ดํ์ฌ์ดํด์ ์ผ๋ถ๋ก ์คํํ๋ฉฐ ๋ฏธ๋ฆฌ ์ ์๋ ์ฝ๋ฐฑ ํจ์๋ค์ ๋ ธ์ถํฉ๋๋ค. ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํ๋ฉด ์ด ์คํฌ๋ฆฝํธ๋ ํด๋น ๊ฒ์์ค๋ธ์ ํธ์ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ์ ์ผ๋ถ๊ฐ ๋ฉ๋๋ค. ์ด ์คํฌ๋ฆฝํธ๋ ๋ก๋๋ ๋ ๋ฃจ์ ์ปจํ ์คํธ์ ์ํด ํ๊ฐ๋๊ณ , ์์ง์ ์๋ ํจ์๋ค์ ์คํํ๊ณ ํ์ฌ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ์ ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค. ์ฌ๊ธฐ์ "self" ๋ช ๋ น์ด๋ฅผ ์ด์ฉํ์ฌ ์ปดํฌ๋ํธ ์ธ์คํด์ค ์ํ์ ์ ๊ทผํ ์ ์์ต๋๋ค. "self"๋ Lua์ table๊ณผ ๋น์ทํ userdata ์ค๋ธ์ ํธ์ด์ง๋ง pairs()๋ ipairs()๊ฐ์ ๋ฐ๋ณต๋ฌธ์ผ๋ก ์ ๊ทผํ ์๋ ์์ต๋๋ค.
init(self)
์ปดํฌ๋ํธ๊ฐ ์ด๊ธฐํ ๋ ๋ ํธ์ถ๋ฉ๋๋ค.
function init(self)
-- ํ์ฌ ์ปดํฌ๋ํธ์ ์๋ช
์ฃผ๊ธฐ๋ฅผ ํจ๊ป ํ๋ ๋ณ์๋ค
self.my_var = "something"
self.age = 0
end
final(self)
์ปดํฌ๋ํธ๊ฐ ์ญ์ ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ์คํฐ๋ ๊ฒ์ ์ค๋ธ์ ํธ๊ฐ ์ปดํฌ๋ํธ์ ํจ๊ป ์ญ์ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
function final(self)
if self.my_var == "something" then
-- ์ด๊ฒ์ ๊ฒ ์ญ์ ์ฒ๋ฆฌ
end
end
update(self, dt)
๋งค ํ๋ ์๋ง๋ค ํ๋ฒ์ฉ ํธ์ถ๋ฉ๋๋ค. dt๋ ์ต๊ทผ ํ๋ ์ ์ดํ์ delta time์ ๋๋ค.
function update(self, dt)
self.age = self.age + dt -- ํ๋ฅธ ์๊ฐ๋งํผ age ๊ฐ์ด ์ฆ๊ฐํจ
end
on_message(self, message_id, message, sender)
msg.post()๋ฅผ ์ด์ฉํ์ฌ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ก ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๋ฉด, ๊ฒ์์์ง์ ์์ ์ ์ปดํฌ๋ํธ์ ์ด ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
on_input(self, action_id, action)
์ธํ ์ค์ ํ์ ์ด ์ปดํฌ๋ํธ์์ ์ ๋ ฅ์ด ๊ฐ์ง๋๋ฉด (acquire_input_focus ์ฐธ๊ณ ), ๊ฒ์์์ง์ ์ด ํจ์๋ฅผ ์คํํฉ๋๋ค.
on_reload(self)
์ด ํจ์๋ ์๋ํฐ์์ (Edit โธ Reload Resource) ๋ฉ๋ด๋ฅผ ์คํํ๋ฉด ํซ๋ฆฌ๋ก๋ ๊ธฐ๋ฅ์ ํตํด ์คํฌ๋ฆฝํธ๊ฐ ์ฌ ๋ก๋ฉ๋ ๋ ํธ์ถ๋ฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ๋๋ฒ๊น , ํ ์คํธ, ์ต์ ํ๊ฐ ๋ชฉ์ ์ผ ๋ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋๋ค.
function on_reload(self)
print(self.age) -- ๊ฒ์์ค๋ธ์ ํธ์ age๊ฐ์ ์ถ๋ ฅํ๊ธฐ
end
Reactive logic(๋ฐ์ํ ๋ก์ง)
์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๊ฐ ์๋ ๊ฒ์ ์ค๋ธ์ ํธ๋ ๋ช ๊ฐ์ง ๋ก์ง์ ๊ตฌํํฉ๋๋ค. ์ด ๋ก์ง์ ์ข ์ข ๋ช๊ฐ์ง ์ธ๋ถ ์์ธ์ ์์กดํ๋๋ฐ, ์๋ฅผ ๋ค์ด ์ AI๊ฐ ํน์ ๋ฐ๊ฒฝ ๋ด์ ์๋ ํ๋ ์ด์ด์ ๋ฐ์ ํ๋ค๋์ง ํ๋ ์ด์ด ์ํธ์์ฉ์ผ๋ก ๋ฌธ์ด ์ ๊ธฐ๊ณ ์ด๋ฆฌ๋ ๋ฐ์ ๋ฑ์ด ์์ ์ ์์ต๋๋ค.
update() ํจ์๋ ์ํ๋จธ์ (state machine)์ ์ ์ํ๋ ๋ณตํฉ์ ์ธ ๊ธฐ๋ฅ๋ค์ ๋งค ํ๋ ์ ๋ง๋ค ๊ตฌํํ ์ ์๊ฒ ํด ์ฃผ๋ฉฐ ๋๋๋ก ์ด๊ฒ์ ์ ์ ํ ์ ๊ทผ ๋ฐฉ๋ฒ์ ๋๋ค. ํ์ง๋ง ๋งค๋ฒ update() ๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฑ๋ฅ์ ๋น์ฉ์ด ๋๋ ์ผ์ด๋ฏ๋ก ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด ๋ฐ์ํ ๋ก์ง์ ๊ตฌํํ์ฌ ์ฌ์ฉํ๊ธธ ๊ถ์ฅํฉ๋๋ค. ์๋ต์ ์ํด ๊ฒ์ ์๋์ ๋ชจ๋ ๋ฐ์ดํฐ๋ค์ ๋งค ํ๋ ์๋ง๋ค ์กฐ์ฌํ๋ ๊ฒ ๋ณด๋ค ์๋ต์ ํธ๋ฆฌ๊ฑฐ ํ๋ ํน์ ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋ฐฉ๋ฒ์ด ๋์ฑ ์ฑ๋ฅ์ ๋์์ด ๋ฉ๋๋ค. ๋ ๋์๊ฐ์, ์ด ๋ฐฉ๋ฒ์ ์ข ์ข ๋ก์ง ์ค๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ ํ๋ฏ๋ก ๋ ๊น๋ํ๊ณ ์์ ์ ์ธ ์ค๊ณ ๋ฐ ๊ตฌํ์ ์ด๋์ด ๋ด๊ธฐ๋ ํฉ๋๋ค.
๊ตฌ์ฒด์ ์ธ ์์ ๋ฅผ ๋ด ์๋ค. ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๊ฐ ์์ ๋ ํ 2์ด ํ์ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด๊ณ , ํน์ ์๋ต ๋ฉ์ธ์ง๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ , ํน์ ์๋ต ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ํ 5์ด ํ์ ๋ ๋ค๋ฅธ ๋ฉ์ธ์ง๋ฅผ ๋ณด๋ด์ผ ํ๋ค๊ณ ๊ฐ์ ํด ๋ด ์๋ค. ์๋๋ ์ด๋ฅผ ๋น๋ฐ์ํ ๋ฐฉ์์ผ๋ก ๊ตฌํํ ์์ ์ ๋๋ค.:
function init(self)
-- ์๊ฐ๊ฐ์ ์ถ์ ํ๊ธฐ ์ํ ์นด์ดํฐ ์
ํ
self.counter = 0
-- ์ํ๊ฐ์ ์ถ์ ํ๊ธฐ ์ํด ํ์ํ ๊ฐ
self.state = "first"
end
function update(self, dt)
self.counter = self.counter + dt
if self.counter >= 2.0 and self.state == "first" then
-- 2์ด ํ์ ๋ฉ์ธ์ง ๋ณด๋ด๊ธฐ
msg.post("some_object", "some_message")
end
if self.counter >= 5.0 and self.state == "second" then
-- "response" ๋ฉ์ธ์ง๋ฅผ ๋ฐ์ ํ 5์ด ํ์ ๋ณด๋ด๊ธฐ
msg.post("another_object", "another_message")
-- state๋ฅผ nil๋ก ์
ํ
ํด์ ์ด ๋ธ๋ก์ด ๋ ์คํ๋์ง ์๊ฒ ํจ
self.state = nil
end
end
function on_message(self, message_id, message, sender)
if message_id == hash("response") then
-- โfirstโ์ํ์ ์ฒ๋ฆฌ๋ค์ด ์๋ฃ๋์์ผ๋ฏ๋ก ๋ค์ ์ํ๋ก ๋์ด๊ฐ์
self.state = "second"
-- ์นด์ดํฐ ์ด๊ธฐํ
self.counter = 0
end
end
๊ฝค ๊ฐ๋จํ ์ผ์ด์ค์์๋ ๋ถ๊ตฌํ๊ณ ๋ก์ง์ด ์๋นํ ๊ผฌ์ด๊ฒ ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ฝ๋ฃจํด์ ๋์์ ๋ฐ์ ๋ ๋์ ์ฝ๋๋ฅผ ์งค ์ ์์ต๋๋ค. ๋์ ์ ๋๋ฉ์ด์ ์์ฑ ๊ธฐ๋ฅ์ธ ํ์ด๋ฐ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ๋ฐ์ํ ๋ก์ง์ ๊ตฌํํด์ผ๋ง ํฉ๋๋ค.
-- ํ์ด๋ฐ์ ์ํ Dummy ์์ฑ๊ฐ
go.property("dummy", 0)
function init(self)
-- 2์ด ํ์ send_first() ํธ์ถ
go.animate("#", "dummy", go.PLAYBACK_ONCE_FORWARD, 0,
go.EASING_LINEAR, 2.0, 0, send_first)
end
function send_first()
msg.post("some_object", "some_message")
end
function send_second()
msg.post("another_object", "another_message")
end
function on_message(self, message_id, message, sender)
if message_id == hash("response") then
-- 5์ด ํ์ send_second() ํธ์ถ
go.animate("#", "dummy", go.PLAYBACK_ONCE_FORWARD, 0,
go.EASING_LINEAR, 5.0, 0, send_second)
end
end
์ด ๋ฐฉ์์ ๊น๋ํ๋ฉฐ ๋ ผ๋ฆฌ์ ์ธ ํ๋ฆ์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ฝ์ต๋๋ค. ๋ํ ๋ก์ง์ ๋ฐ๋ผ๊ฐ๊ธฐ ์ด๋ ต๊ณ ๋ฏธ๋ฌํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์๋ ๋ด๋ถ ์ํ ๋ณ์๋ค์ ์ฒ๋ฆฌํ๋๋ฐ์๋ ์ข์ต๋๋ค. ๋ํ update() ํจ์๋ฅผ ์์ ํ ์ ๊ฑฐํ์ฌ ์ด๋น 60ํ์ ์คํฌ๋ฆฝํธ ํธ์ถ์ ์ค์ด๋๋ฐ ๋์์ด ๋ฉ๋๋ค.
Lua contexts in Defold
์ ์ธํ ๋ชจ๋ ๋ณ์๋ค์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ์ญ(global)๋ณ์์ด๋ฏ๋ก Lua ๋ฐํ์ ์ปจํ ์คํธ์ ๋ชจ๋ ๋ถ๋ถ์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. Defold์๋ ์ด ์ปจํ ์คํธ๋ฅผ ์ ์ดํ๋ "game.project"์ shared_state ์ค์ ์ด ์์ต๋๋ค. ์ด ์ต์ ์ ์ค์ ํ๋ฉด ์คํฌ๋ฆฝํธ, GUI์คํฌ๋ฆฝํธ, ๋ ๋์คํฌ๋ฆฝํธ ๋ชจ๋๋ ๊ฐ์ Lua ์ปจํ ์คํธ์์ ์คํ๋๊ณ global๋ณ์๋ค์ ์ด๋์์๋ ์ฌ์ฉ ๊ฐ๋ฅํด ์ง๋๋ค. ์ด ์ต์ ์ ์ค์ ํ์ง ์์ผ๋ฉด ๊ฒ์ ์์ง์ ์คํฌ๋ฆฝํธ๋ค๊ณผ GUI์คํฌ๋ฆฝํธ, ๋ ๋์คํฌ๋ฆฝํธ๋ค์ ๊ฐ๊ฐ์ ์ปจํ ์คํธ์์ ์คํํฉ๋๋ค.

Defold allows you to use the same script file in several separate game object components. Any locally declared variables are shared between components that runs the same script file. Defold๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒ์ ์ค๋ธ์ ํธ ์ปดํฌ๋ํธ์์ ๊ฐ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ๋ก์ปฌ๋ก ์ ์ธ๋ ๋ณ์๋ค์ ๊ฐ์ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํํ๋ ์ปดํฌ๋ํธ๊ฐ์ ๊ณต์ ๋ฉ๋๋ค.
-- 'my_global_value'๋ ์คํฌ๋ฆฝํธ, gui์คํฌ๋ฆฝํธ,๋ ๋์คํฌ๋ฆฝํธ,๋ชจ๋(๋ฃจ์ ํ์ผ)๋ค ๋ชจ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํจ
my_global_value = "global scope"
-- ์ด ๊ฐ์ ์ด ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฌ์ฉํ๋ ๋ชจ๋ ์ปดํฌ๋ํธ ์ธ์คํด์ค๋ค์๊ฒ ๊ณต์ ๋จ
local script_value = "script scope"
function init(self, dt)
-- ์ด ๊ฐ์ ์ด ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ ์ธ์คํด์ค์์ ์ฌ์ฉ ๊ฐ๋ฅํจ
self.foo = "self scope"
-- ์ด ๊ฐ์ ์ ์ธ ์ดํ์ init()ํจ์ ์์์๋ง ์ฌ์ฉ ๊ฐ๋ฅํจ
local local_foo = "local scope"
print(local_foo)
end
function update(self, dt)
print(self.foo)
print(my_global_value)
print(script_value)
print(local_foo) -- local_foo๋ init()ํจ์ ์์์๋ง ์กด์ฌํ๋ฏ๋ก nil์ด ์ถ๋ ฅ๋ ๊ฑฐ์
end
Performance considerations(์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ)
60FPS๋ก ๋งค๋๋ฝ๊ฒ ๋์ํด์ผ๋ง ํ๋ ๊ณ ์ฑ๋ฅ ๊ฒ์์์๋ ์๊ทธ๋งํ ์ค์๋ก ์ ์ ๊ฒฝํ์ ํฌ๊ฒ ์ ์ํฅ์ ๋ผ์น ์๋ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ๋ช๊ฐ์ง ๊ฐ๋จํ ๊ณ ๋ ค์ฌํญ์ ์ดํด๋ณด๊ณ , ๋ฌธ์ ๊ฐ ์์ด ๋ณด์ด๋ ๋ฏํ ๋ช๊ฐ์ง ์ฌํญ๋ ์ดํด๋ณด๋๋ก ํฉ์๋ค.
๊ฐ๋จํ ๊ฒ๋ถํฐ ์์ํด๋ณด์๋ฉด, ๋ถํ์ํ ๋ฐ๋ณต๋ฌธ์ ์ฐ์ง ์๊ณ ๊ฐ๋จํ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ์ข์ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ฐ๋์ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํด์ผ ํ๊ธฐ๋ ํ์ง๋ง ์ด๋์ ๋ ํฐ ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ณตํ๋ ๊ฒฝ์ฐ์ ์ฃผ์ํ ํ์๊ฐ ์์ต๋๋ค. ๋ง์ฝ ์๋ ์์ ๋ฅผ ๊ฐ ํ๋ ์์ด 16๋ฐ๋ฆฌ์ด(60FPS)์ธ ๊ฒ์์์ง, ๋ ๋์คํฌ๋ฆฝํธ, ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ๊ณผ ํจ๊ป ์คํํ๋ค๋ฉด ์ฑ๋ฅ์ ์์ฐฝ ์ก์๋จน๊ฒ ๋์ด ๊ฝค ๊ด์ฐฎ์ ๋ ธํธ๋ถ์์๋ง์ ์ฝ 1๋ฐ๋ฆฌ์ด ๊ฐ๋ ๋ ๊ฑธ๋ฆฌ๊ฒ ๋ ๊ฒ์ ๋๋ค.
local t = os.clock()
local table = {}
for i=1,2000 do
table[i] = vmath.vector3(i, i, i)
end
print((os.clock() - t) * 1000)
-- DEBUG:SCRIPT: 1.18
os.clock()์์ ๋ฐํ ๋ ๊ฐ (ํ๋ก๊ทธ๋จ์ CPU์๊ฐ(์ด))์ ์ฌ์ฉํ์ฌ ์์ฌ์ค๋ฌ์ด ์ฝ๋๋ฅผ ๋ฒค์น ๋งํฌํ์๊ธฐ ๋ฐ๋๋๋ค.
Memory and garbage collection(๋ฉ๋ชจ๋ฆฌ์ ๊ฐ๋น์ง ์ปฌ๋ ์ )
Lua์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋์ ์ผ๋ก ์คํ๋๋ฉฐ Lua๋ฐํ์์ด ํ ๋นํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํฉ๋๋ค. ๋ง์ ๊ฐ๋น์ง๋ฅผ ์์งํ๋ ๊ฒ์ ์๊ฐ์ ๊ฝค ์๋ชจํ๋ ์์ ์ด ๋ ์ ์์ผ๋ฏ๋ก ์ค๋ธ์ ํธ์ ์๋ฅผ ํ์ํ ๋งํผ๋ง ์ ์งํ๋ ๊ฒ์ด ์ข์ต๋๋ค:
- local ๋ณ์๋ ์ค์ค๋ก ํด์ ๋๋ฉฐ ๊ฐ๋น์ง๋ฅผ ์์ฑํ์ง ์์ต๋๋ค. (์:
local v = 42) - ๊ฐ๊ฐ์ ์๋ก์ด ๊ณ ์ ํ ๋ฌธ์์ด์ ์๋ก์ด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํฉ๋๋ค.
local s = "some_string"๋ ์ ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ณs์ ํ ๋นํฉ๋๋ค.local s๋ ๊ฐ๋น์ง๋ฅผ ์์ฑํ์ง๋ ์์ง๋ง ๋ฌธ์์ด ์ค๋ธ์ ํธ๋ ๊ฐ๋น์ง๋ฅผ ์์ฑํฉ๋๋ค. ๋์ผํ ๋ฌธ์์ด์ ์ฌ๋ฌ๋ฒ ์ฌ์ฉํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ๋น์ฉ์ด ์ถ๊ฐ๋์ง ์์ต๋๋ค. { โฆโ }๋ก ํ ์ด๋ธ ์์ฑ์๊ฐ ์คํ๋ ๋๋ง๋ค ์ ํ ์ด๋ธ์ด ์์ฑ๋ฉ๋๋ค.- function ๊ตฌ๋ฌธ์ ์คํํ๋ฉด ํด๋ก์ ์ค๋ธ์ ํธ(closure object)๊ฐ ์์ฑ๋ฉ๋๋ค. (์ฆ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ด ์๋๋ผ
function() ... end๊ตฌ๋ฌธ์ ์คํํจ) function(v, โฆโ) end์ ๊ฐ์ด ์ธ์์ ์๊ฐ ๊ฐ๋ณ์ธ ํจ์(Vararg functions)๋ ํจ์๊ฐ ํธ์ถ๋ ๋๋ง๋ค ์ธ์๊ฐ์ ๋ด๋ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค. (Lua 5.2 ์ด์ ๋ฒ์ ํน์ LuaJIT์ ์ฌ์ฉํ์ง ์์ ๊ฒฝ์ฐ)- ํ์ผ์ ๋ค๋ฃจ๊ฑฐ๋ ๋ฌธ์์ด์ ๋ค๋ฃจ๋ ํจ์๋ค
- Userdata ์ค๋ธ์ ํธ
์๋ก์ด ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ์ง ์๊ณ ์ด๋ฏธ ๋ง๋ค์ด์ง ์ค๋ธ์ ํธ๋ฅผ ์ฌ์ฌ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ง์ด ์์ต๋๋ค. ์๋๋ update() ํจ์์ ๋๋ถ๋ถ์ ๋ํ๋๋ ์ผ๋ฐ์ ์ธ ์ค์์ ๋ํ ์์ ์ ๋๋ค:
-- ์๋ ์ด๊ธฐํ ํ๊ธฐ
self.velocity = vmath.vector3()
์ข ์ข vmath.vector3()๊ฐ ํธ์ถ๋ ๋ ์๋ก์ด ์ค๋ธ์ ํธ๊ฐ ์์ฑ๋๋ค๋ ๊ฒ์ ๊น๋นกํ๊ธฐ ์ฝ์ต๋๋ค. vector3๊ฐ ์ฌ์ฉํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ํ ๋ฒ ์์ ๋ด ์๋ค:
print(collectgarbage("count") * 1024) -- 88634
local v = vmath.vector3()
print(collectgarbage("count") * 1024) -- ์ด 88704. 70๋ฐ์ดํธ๊ฐ ํ ๋น๋จ
collectgarbage()ํจ์ ์ฌ์ด์ ์ฝ 70๋ฐ์ดํธ๊ฐ ์ถ๊ฐ๋์์ง๋ง ์ด๋ ์์ํ vector3 ์ค๋ธ์ ํธ๋ณด๋ค ๋ ๋ง์ด ํ ๋น๋์์ต๋๋ค. collectgarbage()ํจ์์ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ ๋ฌธ์์ด์ ๋ง๋๋๋ฐ ๊ฐ๋น์ง์ ์ฝ 22๋ฐ์ดํธ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค.
print(collectgarbage("count") * 1024) -- 88611
print(collectgarbage("count") * 1024) -- 88633. 22๋ฐ์ดํธ๊ฐ ํ ๋น๋จ
๋ฐ๋ผ์ vector3๋ 70-22=48 byte์ ๋๋ค. ๋ง์ ์์ ์๋์ง๋ง 60FPS์ ๊ฒ์์์ ๋งค ํ๋ ์๋ง๋ค ์์ฑํ๋ค๋ฉด ๊ฐ์๊ธฐ ์ด๋น 2.8kb์ ๊ฐ๋น์ง๊ฐ ์๊ธฐ๊ฒ ๋ฉ๋๋ค. ๋งค ํ๋ ์๋ง๋ค ํ๋์ vector3๋ฅผ ์์ฑํ๋ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ฅผ 360๊ฐ ์ฌ์ฉํ๋ค๋ฉด ์ด๋น 1MB์ฉ ์์ฑ๋๋ ๊ฐ๋น์ง๋ฅผ ๋ง๋๊ฒ ๋ ์๋ ์์ต๋๋ค. ์ด ๊ฐ๋น์ง๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ ์ฆ๊ฐํ๊ฒ ๋์ด Lua ๋ฐํ์์ด ๊ฐ๋น์ง๋ฅผ ์์งํ๊ฒ ๋ ๋, ํนํ ๋ชจ๋ฐ์ผ ํ๋ซํผ์์ ๋งค์ฐ ์์คํ ์๊ฐ๋ค์ ์ก์๋จน์ด ๋ฒ๋ฆด ์ ์์ต๋๋ค.
vector3๊ฐ ์์ฑ๋๋ ๊ฒ์ ํผํ๋ ๋ฐฉ๋ฒ์ ๋์ผํ ์ค๋ธ์ ํธ๋ฅผ ์ ์งํ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, vector3๋ฅผ ์ด๊ธฐํ ํ๊ธฐ ์ํด ์๋์ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
-- ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ self.velocity = vmath.vector3() ๋์ ์
-- ์ด๋ฏธ ์กด์ฌํ๋ vector ๊ฐ์ฒด์ ๊ฐ์ 0์ผ๋ก ์
ํ
ํ์
self.velocity.x = 0
self.velocity.y = 0
self.velocity.z = 0
์๊ฐ์ด ์ค์ํ ์ผ๋ถ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ๋ ๊ธฐ๋ณธ์ ์ธ ๊ฐ๋น์ง ์์ง ๋ฐฉ์์ด ์ต์ ์ ๋ฐฉ๋ฒ์ด ์๋ ์๋ ์์ต๋๋ค. ๋ง์ฝ ๊ฒ์์ด ๋ฒ๋ฒ ์ธ๋ค๋ฉด collectgarbage() ํจ์๋ฅผ ํ์ฉํด Lua์ ๊ฐ๋น์ง ์์ง ๋ฐฉ์์ ์กฐ์ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฎ์ "step" ๊ฐ์ผ๋ก ๋งค ํ๋ ์ ๋ง๋ค ์งง์ ์๊ฐ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์คํ ํ ์ ์์ต๋๋ค. ๊ฒ์์ด๋ ์ฑ์ด ์ผ๋ง๋ ๋ง์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋จน๊ณ ์๋์ง ์๊ธฐ ์ํด ํ์ฌ ๊ฐ๋น์ง์ ์์ ์๋ ๋ฐฉ๋ฒ์ผ๋ก ์ถ๋ ฅํ ์ ์์ต๋๋ค:
print(collectgarbage("count") * 1024)
Best practices
์ผ๋ฐ์ ์ธ ๊ตฌํ ๋ฐ ์ค๊ณ์ ๊ณ ๋ ค์ฌํญ์ ๊ณต์ ๋ ๋์(Behaviors)์ ์ํ ์ฝ๋๋ฅผ ๊ตฌ์กฐํ ํ๋๋ฐ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ๋ฌ๊ฐ์ง ์ ๊ทผ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
Behaviors in a module (๋ชจ๋์์ ๋์์ ์ฌ์ฉํ๊ธฐ)

๋ชจ๋์์์ ์บก์ํ ๋ ๋์์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฒ์ ์ค๋ธ์ ํธ์ ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ(GUI์คํฌ๋ฆฝํธ ํฌํจ) ๊ฐ์ ์ฝ๊ฒ ์ฝ๋๋ฅผ ๊ณต์ ํ ์ ์๊ฒ ํด ์ค๋๋ค. ๋ชจ๋์ ํจ์๋ฅผ ์์ฑํ๋ ๊ฒ์ ์๊ฒฉํ๊ฒ ๊ธฐ๋ฅ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ์ต์ ์ ๋ฐฉ๋ฒ์ ๋๋ค. ์ ์ฅ๋ ์ํ ๋๋ ๋ถ์์ฉ์ด ํ์์ ์ธ ๊ฒฝ์ฐ(๋๋ ๊น๋ํ ์ค๊ณ๋ฅผ ์ด๋๋ ๊ฒฝ์ฐ)๊ฐ ์์ต๋๋ค. ๋ง์ฝ ๋ชจ๋์์ ๋ด๋ถ ์ํ๊ฐ์ ์ ์ฅํด์ผ ํ๋ค๋ฉด ์ปดํฌ๋ํธ๋ค์ Lua์ปจํ ์คํธ๋ฅผ ๊ณต์ ํ๋ค๋ ๊ฒ์ ์์๋๊ธฐ ๋ฐ๋๋๋ค. ์์ธํ ๊ฒ์ ๋ชจ๋์ ๊ดํ ๋ฌธ์๋ฅผ ์ฐธ๊ณ ๋ฐ๋๋๋ค.
๋ํ, ๋ชจ๋ ์ฝ๋๊ฐ ๊ฒ์ ์ค๋ธ์ ํธ์ ๋ด๋ถ๋ฅผ ์ง์ ์์ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋๋ผ๋ ("self"๊ฐ์ ๋ชจ๋ ํจ์์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก) ์ด ๋ฐฉ๋ฒ์ ๋๋ฌด ๊ฐ๋ ฅํ ๊ฒฐํฉ(coupling)์ด ๋๋ฏ๋ก ๊ถ์ฅํ์ง ์์ต๋๋ค.
A helper game object with encapsulated behavior (์บก์ํ๋ ๋์์ ํฌํผ ๊ฒ์์ค๋ธ์ ํธ๋ก ์ฌ์ฉํ๊ธฐ)

Lua ๋ชจ๋์ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์๋ ๊ฒ ์ฒ๋ผ, ์คํฌ๋ฆฝํธ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒ์ ์ค๋ธ์ ํธ์๋ ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ถ๊ฐํ ์ ์์ต๋๋ค. ์ฐจ์ด์ ์ ๊ฒ์ ์ค๋ธ์ ํธ์ ์ถ๊ฐ๋๋ค๋ ๊ฒ๊ณผ ์ด๋ด ๊ฒฝ์ฐ ๋ฉ์ธ์ง ์ ๋ฌ์ ํตํด ์๊ฒฉํ๊ฒ ํต์ ํด์ผ ํ๋ค๋ ์ ์ด ๋ค๋ฆ ๋๋ค.
Grouping game object with helper behavior object inside a collection (๋์์ ์ฒ๋ฆฌํ๋ ํฌํผ ๊ฒ์์ค๋ธ์ ํธ๋ฅผ ์ปฌ๋ ์ ์์ ๊ทธ๋ฃนํํ์ฌ ์ฌ์ฉํ๊ธฐ)

์ด ์ค๊ณ๋ฐฉ๋ฒ์์๋ ๋ฏธ๋ฆฌ ์ ์๋ ์ด๋ฆ์ผ๋ก(์ฌ์ฉ์๊ฐ ์ง์ ๋์ ๊ฒ์ ์ค๋ธ์ ํธ์ ์ด๋ฆ์ ์ผ์น์์ผ์ผํจ) ํน์ go.property() URL์ ํตํด ๋ค๋ฅธ ๋์์ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ์๋์ผ๋ก ์คํํ๋ ๋์ ๊ฒ์ ์ค๋ธ์ ํธ(behavior game object)๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
์ด ๋ฐฉ์์ ์ด์ ์ผ๋ก๋ ๋์ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ๋์ ์ค๋ธ์ ํธ(target object)๊ฐ ํฌํจ๋ ์ปฌ๋ ์ ์ ๊ทธ๋ฅ ๋จ๊ตฌ๊ธฐ๋ง ํ๋ฉด ๋๋ค๋ ๊ฒ์ ๋๋ค. ์ถ๊ฐ ์ฝ๋๊ฐ ํ์ ์์ต๋๋ค.
๋ง์ ์์ ๊ฒ์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํด์ผํ๋ ์ํฉ์์๋ ๋์ ์ค๋ธ์ ํธ๊ฐ ๋ณต์ ๋๊ณ ๊ฐ ์ค๋ธ์ ํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ชจํ๋ฏ๋ก ์ด ์ค๊ณ๋ ๋ฐ๋์ง ํ์ง ์์ต๋๋ค.