C계열 언어와 유니티를 익힌 사람을 기준으로 작성했습니다.
로블록스 스크립팅에 사용하는 유용한 탭은 상단바의 보기
탭에서 선택해 열 수 있다.
탭의 종류는 다음과 같다.
탭을 오픈한 후 상단바의 모델
탭에서 스크립트를 오픈한다.
print
는 '출력'창에 원하는 문자열 및 숫자를 출력해주는 스크립트이다.
print
는 다음과 같이 사용할 수 있다.
print("Hello world!")
print("한국어")
print(1234567890)
스크립트를 작성한 후 상단의 실행
버튼이 아니라 실행
버튼 아래 화살표를 통해 나오는 Run
버튼을 눌러 스크립트를 테스트한다.
Run
버튼은 플레이어 스폰을 시키지 않는 실행 버튼이다. 주로 스크립트 테스트에 사용된다.
만약 스크립트에 오류가 있는 채로 Run
을 수행할 시 다음과 같이 오류 메세지가 출력된다. 붉은 오류 메세지를 출력하여 오류가 발생한 스크립트 부분으로 이동할 수 있다.
탐색기(Explorer)는 맵 위에 존재하는 모델들, 그 모델들의 파트들, 맵 상으로 선택할 수 없는 스크립트, 라이트 등을 모두 포함하여 탐색 및 정리를 할 수 있게 해주는 창이다.
탐색기 안에서 하나하나 보여지는 물건들을 개체(Object)라고 한다.
스크립트에 대한 부모와 자식 개체는 탐색창에서 다음과 같이 표현된다.
스크립트에서 부모와 자식 개체는 다음과 같이 접근할 수 있다.
// script는 스크립트 개체 자기 자신을 의미한다.
// 부모 개체에 대한 접근은 Parent라는 고유 예약어를 사용한다.
print(script.Parent)
// 자식 개체는 해당 개체의 이름을 통해 접근한다.
print(script.Child)
// 이와 같이 부모-다른 자식 접근을 수행할 수 있다.
print(script.Parent.Camera)
부모자식 접근을 제외하고 다음과 같이 지정된 개체에는 직접 접근할 수 있다.
print(workspace) // 워크스페이스 접근
print(game) // 게임(최상단) 접근
print(game.Workspace) // 게임에 속한 워크스페이스 접근
print(game.Players) // 게임에 속한 플레이어 접근
print(game.Lighting.Sky) // 게임에 속한 라이팅의 스카이 접근
이름으로 개체를 찾을 때 스크립트로 찾는 개체가 다른 개체랑 겹치면 안된다.
즉 동일한 부모를 가진 개체들은 모두 다른 이름을 가져야 한다.
또한 다음과 같은 이름을 가진 자식들은 접근할 때 대괄호[" "]
를 이용해 이름을 작성해야 한다.
print(game.MaterialService["CarPaint_A"])
어떤 개체를 선택했을 때 속성 창에 그 개체의 속성(Properties)들이 나타난다.
스크립트상에서 속성에 접근하기 위해서는 개체의 부모자식에 접근하듯이 해당 속성의 이름을 그대로 작성해주면 된다.
// 해당 스크립트가 부착된 개체의 투명도를 0으로 변경
script.Parent.Transparency = 0
// 해당 스크립트가 부착된 개체의 이름을 "LFDoor"로 변경
script.Parent.Name = "LFDoor"
속성의 값을 변경할 때에는 그 속성에 알맞는 값 형식만을 사용해야 한다.
다음과 같이 속성창에 체크박스로 표시되는 속성값은 boolean이다.
boolean형식은 true와 false 형식을 갖고 있다. 스크립트 상에서 다음과 같이 변경이 가능하다.
script.Parent.Anchored = true
script.Parent.Anchored = false
다음과 같이 속성창에 드롭다운 메뉴가 표시되는 속성값은 enum이다.
enum형식은 스크립트 상에서 다음과 같이 변경이 가능하다.
// enum 형식의 이름을 직접 문자열로 입력
script.Parent.Material = "Brick"
// enum 형식 모음집을 통해 변경
script.Parent.Material = Enum.Material.Brick
디벨로퍼 허브에서 클래스, 속성 등에 대한 api를 검색하고 조사할 수 있다.
다음과 같이 스크립트의 부모를 변경할 수 있다.
script.Parent = workspace
커맨드 바는 스크립트 한 줄을 run
없이 즉시 실행하고 싶을 때 사용한다.
다만 탐색 시작지점을 workspace
로 해야 한다.
개체의 색은 다음과 같이 변경할 수 있다.
Lua스크립트의 사칙연산 기호는 각각 +
, -
, *
, /
이다.
Lua스크립트의 제곱 및 나머지 기호는 각각 ^
, %
이다.
Lua스크립트는 다른 언어와 마찬가지로 괄호 우선 연산을 지원한다.
print((2 + 2) * 2 / 2 - 2)
print(2 ^ 2)
print(21 % 4)
Lua스크립트의 등호 종류는 다음과 같다
==
: 동일 여부~=
: 비동일 여부<
, >
: 작다, 크다<=
, >=
: 작거나 같다, 크거나 같다print(2 + 2 * 2 == 6) // true 출력
print(2 + 2 * 2 == 7) // false 출력
Lua스크립트의 조건문 기본은 다음과 같다.
if (조건식) then
실행문
end
...
조건식이 true일 때에 실행문이 실행되고 false일 때에는 실행문이 실행되지 않는다.
nil 또한 조건문에서는 false로 판단한다.
어떠한 식에 반대되는 결과를 출력시키고 싶으면 not
을 사용하면 된다.
print(not true) // false 출력
Lua 조건문의 조건식을 반전시키고 싶으면 not
을 사용하면 된다.
not
은 사칙연산 및 비교식보다 계산 우선순위가 위이므로 조건식을 괄호로 감싸지 않으면 계산식에 오류가 생길 수 있다.
if not (조건식) then
실행문
end
...
Lua 조건문에 추가적인 조건을 설정하고 싶으면 다음과 같이 수행할 수 있다.
조건문의 흐름은 C언어 계열과 동일하다.
if (조건식1) then
실행문1
elseif (조건식2) then
실행문2
else
실행문3
end
...
Lua에서 '값이 없음'을 nil
로 표현한다. C언어의 null
과 동일한 개념이다.
Lua에서 조건문 등에 조건을 중첩할 때 C언어와 마찬가지로 and
, or
을 사용할 수 있다.
and
: ~하고or
: ~하거나if (조건문1) and (조건문2) then
(실행문)
end
if (조건문1) or (조건문2) then
(실행문)
end
(위쪽일수록 먼저 계산됨)
(같은 층에 있으면 우선순위 같은 거)
^
not, #, -(음수)
*, /, %
+, -
..
~=, ==, 부등호
and
or
로블록스는 모든 오브젝트의 크기를 직육면체 형태의 파트로 정한다.
구, 실린더 등의 비 직육면체 오브젝트도 크기는 직육면체 형태의 파트로 정해진다.
파트의 방향은 다음과 같이 정해진다.
파트의 자료형은 Vector3이며 파트의 크기는 Vector3형식으로 설정할 수 있다.
workspace.Part.Size = Vector3.new(4, 1, 2) * 2
workspace.Part.Size = workspace.Part.Size * 2
workspace.Part.Size = workspace.Part.Size + Vector3.new(4, 1, 2)
어떠한 조건이 맞을 때까지 수행하는 반복문을 사용하고 싶을 때 repeat
반복문을 사용한다.
repeat
(실행문)
until (조건문)
실행문 문단에 wait()
함수를 넣으면 조건이 맞을 때까지 가만히 기다리는 반복문이 된다.
혹은 다음과 같이 특정 조건에 맞게끔 값을 변경하는 실행문을 추가할 수 있다.
repeat
workspace.PrimaryPart.Size = workspace.PrimaryPart.Size + Vector3.new(0, 1, 0)
until workspace.PrimaryPart.Size.Y >= 10
벡터3는 다음과 같이 소수부 또한 포함할 수 있다.
Vector3.new(1.1, 0.3, 3.7)
while조건문은 어떠한 조건이 false가 될 때까지 실행하는 조건문이다.
while (조건문) do
(실행문)
end
조건문이 항상 true일 시 과부화가 될 수 있으므로 wait()
함수를 실행문 맨 위 혹은 조건문으로 설정하여 부하를 줄인다.
while wait() do
(실행문)
end
Lua도 C언어 계열처럼 변수 선언, 할당 및 접근 작업을 수행할 수 있다.
// 변수 선언 이전
workspace.PrimaryPart.Size = Vector3.new(0, 1, 0)
// 변수 선언
model = workspace.PrimaryPart
vecSize = Vector3.new(0, 1, 0)
// 변수 선언 이후
model.Size = vecSize
변수 이름으로 사용할 수 없는 이름 종류는 다음과 같다.
Lua는 C언어 계열과 다르게 변수의 자료형을 중간에 임의로 변경할 수 있다.
다만 되도록 하나의 변수에는 하나의 자료형만 넣도록 하자.
vecSize = Vector3.new(0, 1, 0)
// 변수 다시 선언
vecSize = 0.5
변수 앞에 local
이 붙으면 그 변수는 선언하는 변수가 존재하는 구역에서만 사용할 수 있다.
local var1 = 1 // 스크립트 내에서 사용
if (조건식1) then
local var2 = 1 // 조건문 안에서만 사용
(실행문1)
end
while (조건식2) do
local var3 = 1 // 반복문 안에서만 사용
end
구문 밖에 선언된 로컬 변수와 안에 선언된 로컬 변수는 이름이 같아도 서로 다른 변수 취급된다.
local var = 1 // 스크립트 내에서 사용
if (조건식1) then
local var = 3 // 조건문 안에서만 사용
print(var) // 3 출력
end
print(var) // 1 출력
for반복문으로 반복 횟수를 지정할 수 있다.
// i가 1에서 시작해 7이 될 때까지 1씩 증가하는 반복문
for i=1, 7, 1 do
print(i, "번째 반복입니다")
end
// i가 20에서 시작해 0이 될 때까지 2씩 감소하는 반복문
for i=20, 0, -2 do
print(i, "번째 반복입니다")
end
위의 예시에서 i는 반복문 안에서만 사용되는 로컬 변수이다
파트 위치 변수값의 자료형 또한 Vector3이다.
로블록스 세상의 중심 위치는 Vector3(0, 0, 0)이다.
로블록스에서 스크립트를 이용해 파트를 생성하는 방법은 다음과 같다.
Instance.new("파트 클래스 이름", 부모 파트)
생성한 파트는 유니티와 비슷하게 local변수에 할당하여 스크립트에서 임의로 조절할 수 있다.
// 랜덤 색의 구체 파트를 (0, 1, 0)위치에 생성하는 함수
local part = Instance.new("Part", workspace)
part.Position = Vector3.new(0, 1, 0)
part.Shape = Enum.PartType.Ball
part.TopSurface = Enum.SurfaceType.Smooth
part.BottomSurface = Enum.SurfaceType.Smooth
part.BrickColor = BrickColor.Random()
파트는 Destroy()
함수로 삭제할 수 있다.
// 삭제할 파트 변수에 할당
local part = workspace.Model1.Part2
part:Destroy()
파트에는 파트의 상태변화 혹은 작업 수행을 하게 해주는 함수가 존재한다.
함수는 파트 뒤에 콜론(:)을 붙여 선언할 수 있다.
part:GetMass() // 파트의 질량을 구하는 함수
sound:Play() // 사운드를 플레이하는 함수
내장함수는 스크립트 내부에 저장되어 있는 함수로, 파트의 선언이 없어도 사용할 수 없다.
print()
wait()
로블록스의 서버 스토리지(ServerStorage)는 로블록스 내 저장공간으로, 스토리지 내에서는 스크립트가 작동되지 않는다.
따라서 추후에 스폰/작동되는 파트와 스크립트들은 서버 스토리지에 저장해둔 후 오브젝트 클론을 통해 복사해와 사용할 수 있다.
서버 스토리지 내의 'Part'라는 이름의 파트를 워크스페이스로 복사해오려면 다음과 같이 작성하면 된다.
local part = game.ServerStorage.Part
local clone = part:Clone()
clone.Parent = workspace // 워크스페이스로 옮기지 않으면 계속 ServerStorage에 존재
Lua에서 함수는 다음과 같이 작성한다. 함수명 또한 변수명의 작명 규칙을 따른다.
function 함수명()
end
"start cloning part"를 프린트한 후 2초 후에 파트를 클론하는 스크립트는 다음과 같이 작성할 수 있다.
local function ClonePart()
local part = game.ServerStorage.Part
local clone = part:Clone()
clone.Parent = workspace
end
print("start cloning part")
wait(2)
ClonePart()
Lua는 위에서부터 아래로 스크립트를 읽으므로 함수는 무조건 위에 선언해 주어야 한다.
또한 함수에도 변수와 마찬가지로 local을 붙일 수 있으며, local을 붙이는 것이 더 효율적이다.
Lua의 함수는 다음과 같이 매개변수를 받을 수 있다.
매개변수는 함수 안에서만 사용할 수 있는 로컬 변수이다.
또한 return을 이용해 결과값을 반환할 수도 있다.
// part를 클론한 후 location의 자식으로 만들어 반환하는 함수
local function ClonePart(part, location)
local clone = part:Clone()
clone.Parent = location
return clone
end
local clone = ClonePart(game.ServerStorage.Part, workspace)
clone.BrickColor = BrickColor.Random()