로블록스 루아 스크립트 기초

정선호·2024년 4월 1일
0

Roblox-Lua

목록 보기
1/3

강의 재생목록

C계열 언어와 유니티를 익힌 사람을 기준으로 작성했습니다.


01.스크립트 시작하기

스크립트 창 열기

로블록스 스크립팅에 사용하는 유용한 탭은 상단바의 보기탭에서 선택해 열 수 있다.
탭의 종류는 다음과 같다.

  • 탐색기
  • 속성
  • 출력
  • 명령 모음

탭을 오픈한 후 상단바의 모델탭에서 스크립트를 오픈한다.

print는 '출력'창에 원하는 문자열 및 숫자를 출력해주는 스크립트이다.
print는 다음과 같이 사용할 수 있다.

print("Hello world!")
print("한국어")
print(1234567890)

스크립트를 작성한 후 상단의 실행 버튼이 아니라 실행버튼 아래 화살표를 통해 나오는 Run버튼을 눌러 스크립트를 테스트한다.
Run버튼은 플레이어 스폰을 시키지 않는 실행 버튼이다. 주로 스크립트 테스트에 사용된다.

만약 스크립트에 오류가 있는 채로 Run을 수행할 시 다음과 같이 오류 메세지가 출력된다. 붉은 오류 메세지를 출력하여 오류가 발생한 스크립트 부분으로 이동할 수 있다.


02.탐색기, 개체, 부모와 자식

탐색기(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) // 게임에 속한 라이팅의 스카이 접근

03.개체 탐색시 주의사항

이름으로 개체를 찾을 때 스크립트로 찾는 개체가 다른 개체랑 겹치면 안된다.
즉 동일한 부모를 가진 개체들은 모두 다른 이름을 가져야 한다.

또한 다음과 같은 이름을 가진 자식들은 접근할 때 대괄호[" "]를 이용해 이름을 작성해야 한다.

  • 이름이 숫자로 시작하는 경우
  • 이름 중간에 띄어쓰기가 있는 경우
  • 이름이 알파벳을 아닌 다른 언어의 문자(한글, 한자 등)이 포함된 경우
  • 이름에 특수문자(!@#$%^& 등)이 포함된 경우
print(game.MaterialService["CarPaint_A"])

04.속성, 속성의 접근

어떤 개체를 선택했을 때 속성 창에 그 개체의 속성(Properties)들이 나타난다.

스크립트상에서 속성에 접근하기 위해서는 개체의 부모자식에 접근하듯이 해당 속성의 이름을 그대로 작성해주면 된다.

// 해당 스크립트가 부착된 개체의 투명도를 0으로 변경
script.Parent.Transparency = 0
// 해당 스크립트가 부착된 개체의 이름을 "LFDoor"로 변경
script.Parent.Name = "LFDoor"

속성의 값을 변경할 때에는 그 속성에 알맞는 값 형식만을 사용해야 한다.


05.boolean, enum

boolean

다음과 같이 속성창에 체크박스로 표시되는 속성값은 boolean이다.

boolean형식은 true와 false 형식을 갖고 있다. 스크립트 상에서 다음과 같이 변경이 가능하다.

script.Parent.Anchored = true
script.Parent.Anchored = false

enum

다음과 같이 속성창에 드롭다운 메뉴가 표시되는 속성값은 enum이다.

enum형식은 스크립트 상에서 다음과 같이 변경이 가능하다.

// enum 형식의 이름을 직접 문자열로 입력
script.Parent.Material = "Brick"
// enum 형식 모음집을 통해 변경
script.Parent.Material = Enum.Material.Brick

06.디벨로퍼 허브

디벨로퍼 허브

디벨로퍼 허브

디벨로퍼 허브에서 클래스, 속성 등에 대한 api를 검색하고 조사할 수 있다.

추가

다음과 같이 스크립트의 부모를 변경할 수 있다.

script.Parent = workspace

07.커맨드 바, 색 변경

커맨드 바

커맨드 바는 스크립트 한 줄을 run없이 즉시 실행하고 싶을 때 사용한다.
다만 탐색 시작지점을 workspace로 해야 한다.

색 변경

개체의 색은 다음과 같이 변경할 수 있다.

색 변경


08.사칙연산, 제곱, 나머지

Lua스크립트의 사칙연산 기호는 각각 +, -, *, /이다.
Lua스크립트의 제곱 및 나머지 기호는 각각 ^, %이다.

Lua스크립트는 다른 언어와 마찬가지로 괄호 우선 연산을 지원한다.

print((2 + 2) * 2 / 2 - 2)
print(2 ^ 2)
print(21 % 4)

09.숫자 비교하기, 등호

Lua스크립트의 등호 종류는 다음과 같다

  • == : 동일 여부
  • ~= : 비동일 여부
  • <, > : 작다, 크다
  • <=, >= : 작거나 같다, 크거나 같다
print(2 + 2 * 2 == 6) // true 출력
print(2 + 2 * 2 == 7) // false 출력

10.조건문 if-then-end

Lua스크립트의 조건문 기본은 다음과 같다.

if (조건식) then
    실행문
end
...

조건식이 true일 때에 실행문이 실행되고 false일 때에는 실행문이 실행되지 않는다.
nil 또한 조건문에서는 false로 판단한다.


11.조건문 not/else/elseif

not

어떠한 식에 반대되는 결과를 출력시키고 싶으면 not을 사용하면 된다.

print(not true) // false 출력

Lua 조건문의 조건식을 반전시키고 싶으면 not을 사용하면 된다.
not은 사칙연산 및 비교식보다 계산 우선순위가 위이므로 조건식을 괄호로 감싸지 않으면 계산식에 오류가 생길 수 있다.

if not (조건식) then
    실행문
end
...

else/elseif

Lua 조건문에 추가적인 조건을 설정하고 싶으면 다음과 같이 수행할 수 있다.
조건문의 흐름은 C언어 계열과 동일하다.

if (조건식1) then
    실행문1
elseif (조건식2) then
    실행문2
else
    실행문3
end
...

12.nil/and/or, 계산 우선순위

nil

Lua에서 '값이 없음'을 nil로 표현한다. C언어의 null과 동일한 개념이다.

and/or

Lua에서 조건문 등에 조건을 중첩할 때 C언어와 마찬가지로 and, or을 사용할 수 있다.

  • and : ~하고
  • or : ~하거나
if (조건문1) and (조건문2) then
    (실행문)
end

if (조건문1) or (조건문2) then
    (실행문)
end

계산 우선순위

(위쪽일수록 먼저 계산됨)
(같은 층에 있으면 우선순위 같은 거)

^
not, #, -(음수)
*, /, %
+, - 
..
~=, ==, 부등호
and
or

13.파트 크기, Vector3(1)

파트

로블록스는 모든 오브젝트의 크기를 직육면체 형태의 파트로 정한다.
구, 실린더 등의 비 직육면체 오브젝트도 크기는 직육면체 형태의 파트로 정해진다.

파트의 방향은 다음과 같이 정해진다.

Vector3(1)

파트의 자료형은 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)

14.repeat 반복문, Vector3(2)

repeat

어떠한 조건이 맞을 때까지 수행하는 반복문을 사용하고 싶을 때 repeat반복문을 사용한다.

repeat
	(실행문)
until (조건문)

실행문 문단에 wait()함수를 넣으면 조건이 맞을 때까지 가만히 기다리는 반복문이 된다.
혹은 다음과 같이 특정 조건에 맞게끔 값을 변경하는 실행문을 추가할 수 있다.

repeat
	workspace.PrimaryPart.Size = workspace.PrimaryPart.Size + Vector3.new(0, 1, 0)
until workspace.PrimaryPart.Size.Y >= 10

Vector3(2)

벡터3는 다음과 같이 소수부 또한 포함할 수 있다.

Vector3.new(1.1, 0.3, 3.7)

15.while반복문, 무한 반복문

while조건문은 어떠한 조건이 false가 될 때까지 실행하는 조건문이다.

while (조건문) do
(실행문)
end

조건문이 항상 true일 시 과부화가 될 수 있으므로 wait()함수를 실행문 맨 위 혹은 조건문으로 설정하여 부하를 줄인다.

while wait() do
(실행문)
end

16.변수

Lua도 C언어 계열처럼 변수 선언, 할당 및 접근 작업을 수행할 수 있다.

// 변수 선언 이전
workspace.PrimaryPart.Size = Vector3.new(0, 1, 0)

// 변수 선언
model = workspace.PrimaryPart
vecSize = Vector3.new(0, 1, 0)

// 변수 선언 이후
model.Size = vecSize

17.변수 주의사항, local변수

변수 주의사항

변수 이름으로 사용할 수 없는 이름 종류는 다음과 같다.

  • 숫자로 시작하는 이름
  • 중간에 띄어쓰기가 존재하는 이름
  • 이름에 한국어나 특수문자(언더바 제외)가 존재하는 이름
  • 이미 사용중인 이름 혹은 예약어로 이미 존재하는 이름

Lua는 C언어 계열과 다르게 변수의 자료형을 중간에 임의로 변경할 수 있다.
다만 되도록 하나의 변수에는 하나의 자료형만 넣도록 하자.

vecSize = Vector3.new(0, 1, 0)

// 변수 다시 선언
vecSize = 0.5

로컬 변수

변수 앞에 local이 붙으면 그 변수는 선언하는 변수가 존재하는 구역에서만 사용할 수 있다.

  • 스크립트 내에 존재하는 local변수는 해당 스크립트 내에서만 사용한다는 의미
  • 반복문, 조건문 등의 구문 안에 존재하는 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 출력

18.for반복문

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는 반복문 안에서만 사용되는 로컬 변수이다


19.파트 위치, Vector3(3)

파트 위치 변수값의 자료형 또한 Vector3이다.
로블록스 세상의 중심 위치는 Vector3(0, 0, 0)이다.


20.파트 생성

로블록스에서 스크립트를 이용해 파트를 생성하는 방법은 다음과 같다.

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()

21.파트 삭제와 함수

파트 삭제

파트는 Destroy()함수로 삭제할 수 있다.

// 삭제할 파트 변수에 할당
local part = workspace.Model1.Part2
part:Destroy()

함수

파트에는 파트의 상태변화 혹은 작업 수행을 하게 해주는 함수가 존재한다.
함수는 파트 뒤에 콜론(:)을 붙여 선언할 수 있다.

part:GetMass() // 파트의 질량을 구하는 함수
sound:Play() // 사운드를 플레이하는 함수

내장함수는 스크립트 내부에 저장되어 있는 함수로, 파트의 선언이 없어도 사용할 수 없다.

print()
wait()

22.파트 복사, Clone(), ServerStorage

ServerStorage

로블록스의 서버 스토리지(ServerStorage)는 로블록스 내 저장공간으로, 스토리지 내에서는 스크립트가 작동되지 않는다.
따라서 추후에 스폰/작동되는 파트와 스크립트들은 서버 스토리지에 저장해둔 후 오브젝트 클론을 통해 복사해와 사용할 수 있다.

파트 복사

서버 스토리지 내의 'Part'라는 이름의 파트를 워크스페이스로 복사해오려면 다음과 같이 작성하면 된다.

local part = game.ServerStorage.Part
local clone = part:Clone()
clone.Parent = workspace // 워크스페이스로 옮기지 않으면 계속 ServerStorage에 존재

23.함수, function

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을 붙이는 것이 더 효율적이다.


24.함수 매개변수와 반환

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()
profile
학습한 내용을 빠르게 다시 찾기 위한 저장소

0개의 댓글