1. 소개: Roblox 스크립팅의 세계에 오신 것을 환영합니다
Roblox는 단순한 게임 플랫폼을 넘어, 사용자들이 자신만의 독특한 게임 경험을 만들고 공유할 수 있는 창의적인 공간입니다. 스크립팅은 이러한 창의적인 비전을 현실로 만드는 강력한 도구이며, 게임에 생동감을 불어넣고 사용자 상호 작용을 가능하게 합니다. Roblox에서 사용되는 특정 스크립팅 언어는 Luau라고 불립니다. Luau를 배우는 것은 여러분의 아이디어를 실현하고 수많은 다른 플레이어들과 공유할 수 있는 첫걸음이 될 것입니다. Roblox는 방대한 창작자 커뮤니티를 자랑하며, 이는 초보자들이 배우고 성장하며 영감을 얻을 수 있는 훌륭한 환경을 제공합니다.
Roblox Studio를 시작하려면 먼저 다운로드하여 설치해야 합니다 (공식 리소스 링크를 참조하세요). 설치가 완료되면 Roblox Studio 인터페이스에 익숙해지는 것이 중요합니다. 인터페이스는 여러 개의 주요 창으로 구성되어 있습니다. '탐색기' 창은 게임 내 객체들의 계층 구조를 보여줍니다. 이 창을 통해 게임의 모든 요소, 예를 들어 파트, 스크립트, 서비스 등을 찾고 관리할 수 있습니다. '속성' 창은 탐색기에서 선택한 객체의 다양한 속성을 표시하고 수정할 수 있도록 합니다. 색상, 크기, 위치 등 객체의 외형과 동작을 제어하는 데 필수적인 창입니다. '출력' 창은 스크립트에서 생성된 메시지나 오류를 표시하는 곳으로, 코드의 작동 방식을 이해하고 문제를 해결하는 데 매우 중요합니다. print() 함수를 사용하여 스크립트에서 원하는 정보를 출력 창에 표시할 수 있으며, 이는 디버깅 과정에서 핵심적인 역할을 합니다. 마지막으로 '스크립트 편집기'는 실제로 Luau 코드를 작성하는 곳입니다.
Roblox Studio의 3D 세계를 탐색하는 방법을 이해하는 것도 중요합니다. PC에서 Roblox 게임을 플레이할 때 사용하는 것과 유사한 컨트롤을 사용합니다. W, A, S, D 키를 사용하여 카메라를 앞, 왼쪽, 뒤, 오른쪽으로 이동할 수 있습니다. 카메라의 시점을 보다 세밀하게 제어하려면 마우스 오른쪽 버튼을 누른 채로 드래그하여 원하는 방향으로 회전시킬 수 있습니다. 또한 Q 키를 누르면 카메라가 아래로, E 키를 누르면 위로 이동하며, 마우스 휠을 사용하여 확대 및 축소할 수 있습니다. 이러한 기본적인 탐색 방법을 익히면 Studio 환경에서 편안하게 작업할 수 있습니다.
이제 기본적인 파트를 삽입하고 조작하는 방법을 알아보겠습니다. Studio 상단의 '홈' 탭에서 '파트' 버튼을 클릭하면 게임 월드에 새로운 파트가 생성됩니다. 생성된 파트는 기본적으로 회색 블록 형태로 나타납니다. 이 파트를 선택하고 '이동' 도구를 사용하면 원하는 위치로 드래그하여 옮길 수 있습니다. '크기 조정' 도구를 사용하면 파트의 크기를 변경할 수 있으며, '회전' 도구를 사용하면 파트의 방향을 조절할 수 있습니다. 이러한 기본적인 조작을 통해 게임의 물리적 환경을 구축할 수 있습니다.
스크립팅을 시작하기 위한 첫 단계로, 간단한 "Hello, World!" 스크립트를 만들어 보겠습니다. '탐색기' 창에서 'ServerScriptService'를 찾습니다. 이는 기본적인 서버 측 스크립팅을 시작하기에 좋은 위치입니다. 'ServerScriptService' 옆에 있는 더하기(+) 아이콘을 클릭하고 '스크립트'를 선택하여 새로운 스크립트를 생성합니다. 새로 생성된 스크립트에는 기본적으로 print("Hello world!")라는 코드가 한 줄 포함되어 있습니다. 이 코드를 print("Hello, Roblox World!")와 같이 변경해 봅시다. 이제 게임을 실행하고 출력 창을 확인하면 변경된 메시지가 표시되는 것을 확인할 수 있습니다. 이는 스크립트가 성공적으로 실행되었음을 의미하며, 스크립팅을 통해 게임에 원하는 기능을 추가할 수 있다는 것을 보여줍니다. 마지막으로, 작업 내용을 잃지 않도록 자주 저장하는 것이 중요합니다. '파일' 메뉴에서 '다른 이름으로 저장'을 선택하고 원하는 위치에 파일을 저장합니다. 이 간단한 첫 경험은 스크립팅이 실제로 작동하는 방식을 보여주고, 더 복잡한 스크립팅을 배우는 데 필요한 자신감을 불어넣어 줄 것입니다.
2. 기초 다지기: 핵심 Luau 개념 이해
스크립팅의 기본을 이해하는 데 있어 가장 중요한 요소 중 하나는 변수의 개념을 파악하는 것입니다. 변수는 정보를 저장하는 '컨테이너'와 같습니다. 각 변수에는 고유한 이름이 주어지며, 이 이름을 통해 변수에 저장된 값에 접근하고 수정할 수 있습니다. Luau에서 변수를 선언할 때는 local 키워드를 사용합니다. local 키워드는 변수의 유효 범위를 현재 스크립트 내로 제한하여 코드의 안전성과 효율성을 높이는 데 도움을 줍니다. 변수에 값을 할당할 때는 등호(=) 연산자를 사용합니다. 예를 들어, local myNumber = 10은 myNumber라는 이름의 변수에 숫자 10을 저장하는 코드입니다. 변수 이름을 지을 때는 몇 가지 규칙을 따라야 합니다. 일반적으로 camelCase 표기법을 사용하는 것이 권장되며 (예: myVariableName), 변수 이름에 공백을 포함할 수 없고, 숫자로 시작할 수 없으며, Luau에서 이미 사용 중인 예약어를 피해야 합니다. 변수 이름은 코드의 가독성을 높이는 데 중요한 역할을 하므로, 변수에 저장될 정보의 의미를 명확하게 나타내는 이름을 선택하는 것이 좋습니다.
-- 변수 선언 및 값 할당 예시
local playerName = "플레이어1" -- 문자열 변수
local playerScore = 0 -- 숫자 변수
local isGameOver = false -- 부울 변수
print(playerName) -- 출력: 플레이어1
print(playerScore) -- 출력: 0
print(isGameOver) -- 출력: false
Lua
복사
변수는 다양한 형태의 데이터를 저장할 수 있습니다. 이러한 데이터의 종류를 데이터 유형이라고 합니다. 기본적인 데이터 유형으로는 숫자 (정수 및 소수점 숫자) , 문자열 (따옴표로 묶인 텍스트) , 부울 (참 또는 거짓 값) , 그리고 nil (값이 없음을 나타냄) 등이 있습니다. 고급 데이터 유형인 테이블은 나중에 더 자세히 다룰 예정입니다. 문자열을 연결할 때는 .. 연산자를 사용합니다. 예를 들어, "Hello".. " World!"는 "Hello World!"라는 새로운 문자열을 만듭니다. 스크립트에서 이러한 다양한 데이터 유형의 값을 출력 창에 표시하려면 print() 함수를 사용하면 됩니다. 데이터 유형을 이해하는 것은 코드를 작성하고 오류를 해결하는 데 필수적입니다. 예를 들어, 숫자와 문자열은 서로 다른 방식으로 처리해야 하며, 데이터 유형을 잘못 사용하면 예기치 않은 결과가 발생할 수 있습니다.
-- 다양한 데이터 유형 예시
local age = 30 -- 숫자
local message = "안녕하세요!" -- 문자열
local hasKey = true -- 부울
local inventory = {"칼", "물약", "방패"} -- 테이블
local noValue = nil -- nil
print("나이:", age)
print("메시지:", message)
print("키 소지 여부:", hasKey)
print("인벤토리:", inventory[1]) -- 테이블의 첫 번째 요소 출력
print("값 없음:", noValue)
-- 문자열 연결 예시
local firstName = "홍"
local lastName = "길동"
local fullName = firstName.. lastName
print("전체 이름:", fullName) -- 출력: 홍길동
Lua
복사
연산자는 변수와 값을 사용하여 다양한 작업을 수행할 수 있도록 합니다. 산술 연산자 (+, -, *, /, ^, %)는 기본적인 수학적 계산을 수행하는 데 사용됩니다. 예를 들어, 5 + 3은 8을, 10 / 2는 5를 반환합니다. 비교 연산자 (==, ~=, >, <, >=, <=)는 두 값을 비교하고 그 결과를 부울 값 (참 또는 거짓)으로 반환합니다. 예를 들어, 5 == 5는 참을, 5 > 10은 거짓을 반환합니다. 논리 연산자 (and, or, not)는 여러 개의 조건을 결합하거나 조건을 반전시키는 데 사용됩니다. 예를 들어, true and false는 거짓을, not true는 거짓을 반환합니다. 연산자를 통해 스크립트는 데이터를 동적으로 계산하고 비교하여 더욱 복잡한 논리를 구현할 수 있게 됩니다.
-- 산술 연산자 예시
local num1 = 10
local num2 = 5
print("덧셈:", num1 + num2) -- 출력: 15
print("뺄셈:", num1 - num2) -- 출력: 5
print("곱셈:", num1 * num2) -- 출력: 50
print("나눗셈:", num1 / num2) -- 출력: 2
print("거듭제곱:", num1 ^ num2) -- 출력: 100000
print("나머지:", num1 % num2) -- 출력: 0
-- 비교 연산자 예시
local a = 5
local b = 10
print("a와 b가 같은가?", a == b) -- 출력: false
print("a와 b가 다른가?", a ~= b) -- 출력: true
print("a가 b보다 큰가?", a > b) -- 출력: false
print("a가 b보다 작은가?", a < b) -- 출력: true
print("a가 b보다 크거나 같은가?", a >= b) -- 출력: false
print("a가 b보다 작거나 같은가?", a <= b) -- 출력: true
-- 논리 연산자 예시
local condition1 = true
local condition2 = false
print("condition1 and condition2:", condition1 and condition2) -- 출력: false
print("condition1 or condition2:", condition1 or condition2) -- 출력: true
print("not condition1:", not condition1) -- 출력: false
Lua
복사
코드의 가독성을 높이고 이해를 돕기 위해 주석을 사용하는 것이 좋습니다. 주석은 스크립트 실행 시 무시되는 설명문입니다. Luau에서는 한 줄 주석을 작성하기 위해 두 개의 하이픈(--)을 사용합니다. 두 개의 하이픈 뒤에 오는 모든 내용은 주석으로 처리됩니다. 여러 줄에 걸쳐 주석을 작성해야 할 경우에는 --[[로 시작하고 ]]로 끝나는 블록 주석을 사용할 수 있습니다. 주석을 통해 코드의 특정 부분에 대한 설명이나 메모를 추가하여 나중에 코드를 다시 보거나 다른 사람과 협업할 때 이해하기 쉽도록 만들 수 있습니다. 좋은 주석 습관은 코드의 유지 보수성을 크게 향상시킵니다.
-- 이것은 한 줄 주석입니다. 이 줄은 실행되지 않습니다.
print("Hello") -- 이 코드 뒤에 오는 것도 주석입니다.
--[[
이것은 여러 줄 주석입니다.
이 블록 안의 모든 내용은
스크립트 실행 시 무시됩니다.
]]
Lua
복사
데이터 유형 | 설명 | 예제 코드 |
숫자 | 숫자 값 (정수, 소수) | local age = 30 |
문자열 | 텍스트 | local name = "Alice" |
부울 | 참 또는 거짓 | local isStudent = false |
nil | 값이 없음 | local item = nil |
3. 흐름 제어: 결정 내리기와 반복적인 동작 수행
스크립트가 단순히 순서대로 명령을 실행하는 것 외에도, 특정 조건에 따라 다른 코드를 실행하거나 특정 작업을 반복적으로 수행할 수 있도록 하는 것이 중요합니다. 이를 가능하게 하는 것이 조건문과 반복문입니다. 조건문의 가장 기본적인 형태는 if 문입니다. if 문은 주어진 조건이 참일 경우에만 특정 코드 블록을 실행합니다. 조건은 비교 연산자를 사용하여 평가되며, 그 결과는 부울 값 (참 또는 거짓)입니다. 예를 들어, if score > 50 then print("합격") end는 score 변수의 값이 50보다 클 경우에만 "합격"을 출력합니다. if 문의 조건이 거짓일 경우 다른 코드를 실행해야 할 때는 else 문을 사용합니다. else 문은 if 문 뒤에 오며, if 문의 조건이 충족되지 않았을 때 실행될 코드 블록을 정의합니다. 여러 개의 조건을 순차적으로 확인해야 할 경우에는 elseif 문을 사용할 수 있습니다. elseif 문은 if 문과 else 문 사이에 위치하며, 이전의 조건이 거짓일 경우에만 새로운 조건을 평가합니다. 조건문은 게임의 다양한 상황에 따라 스크립트가 다르게 반응하도록 만들어 게임을 더욱 동적으로 만듭니다. if 문 안에 또 다른 if 문을 중첩하여 더 복잡한 조건부 논리를 구현할 수도 있습니다.
-- if 문 예시
local temperature = 25
if temperature > 30 then print("너무 더워요!")
end
-- if-else 문 예시
local money = 100
local price = 150
if money >= price then print("구매 완료!")
else print("잔액이 부족합니다.")
end
-- if-elseif-else 문 예시
local grade = 85
if grade >= 90 then print("A 학점")
elseif grade >= 80 then print("B 학점")
elseif grade >= 70 then print("C 학점")
else print("D 학점 이하")
end
Lua
복사
반복문은 특정 코드 블록을 여러 번 반복해서 실행하는 데 사용됩니다. 가장 기본적인 반복문 중 하나는 while 루프입니다. while 루프는 주어진 조건이 참인 동안 계속해서 코드 블록을 실행합니다. 예를 들어, local count = 0; while count < 5 do print(count); count = count + 1; end는 count 변수가 5보다 작을 동안 count 값을 출력하고 1씩 증가시키는 코드를 반복합니다. while true do와 같이 조건을 항상 참으로 설정하면 코드가 무한히 반복되는 무한 루프가 만들어질 수 있습니다. 이러한 경우에는 task.wait() 함수를 사용하여 루프 실행 사이에 잠시 멈춤을 두는 것이 중요합니다. for 루프는 특정 횟수만큼 코드를 반복하는 데 사용됩니다. 숫자형 for 루프는 시작 값, 종료 값, 그리고 증가/감소 단계를 지정하여 반복 횟수를 제어합니다. 예를 들어, for i = 1, 10, 1 do print(i) end는 i 변수를 1부터 10까지 1씩 증가시키면서 print(i)를 10번 실행합니다. for...in 루프는 테이블과 같은 컬렉션의 요소를 순회하는 데 사용됩니다. pairs는 테이블의 모든 키-값 쌍을 순회하며, ipairs는 테이블의 숫자형 인덱스를 순서대로 순회합니다. 때로는 루프의 조건이 충족되기 전에 루프를 빠져나가야 할 경우가 있습니다. 이럴 때는 break 문을 사용합니다. 반복문을 사용하면 게임 내에서 반복적인 작업을 자동화하고, 여러 객체에 대해 동일한 작업을 효율적으로 수행할 수 있습니다.
-- while 루프 예시
local counter = 0
while counter < 3 do print("while 루프:", counter) counter = counter + 1 task.wait(1) -- 1초 대기
end
-- 숫자형 for 루프 예시
for i = 1, 5 do print("for 루프 (숫자형):", i)
end
-- for...in 루프 (pairs) 예시
local colors = {red = "빨강", green = "초록", blue = "파랑"}
for key, value in pairs(colors) do print("for 루프 (pairs):", key, value)
end
-- for...in 루프 (ipairs) 예시
local fruits = {"사과", "바나나", "딸기"}
for index, fruit in ipairs(fruits) do print("for 루프 (ipairs):", index, fruit)
end
-- break 문 예시
for i = 1, 10 do if i > 5 then break -- i가 5보다 크면 루프 종료 end print("break 예시:", i)
end
Lua
복사
4. 게임 월드와 상호 작용하기: 객체 조작
Roblox 게임의 모든 요소는 객체로 표현되며, 이 객체들은 계층 구조를 이룹니다. 이 계층 구조의 가장 상위에 있는 객체는 game 객체입니다. game 객체 아래에는 Workspace, Players, Lighting, ServerScriptService 등과 같은 다양한 서비스들이 존재합니다. Workspace는 게임의 3D 환경을 포함하는 곳으로, 모든 파트, 모델 등이 이 서비스 아래에 있습니다. Players 서비스는 현재 게임에 접속한 모든 플레이어에 대한 정보를 관리하며, Lighting 서비스는 게임의 조명 효과를 제어합니다. ServerScriptService는 서버 측 스크립트가 저장되는 곳입니다. 스크립트에서 특정 객체에 접근하려면 점 표기법이나 FindFirstChild(), WaitForChild(), GetService()와 같은 함수를 사용합니다. 예를 들어, game.Workspace.MyPart는 Workspace 서비스 아래에 있는 MyPart라는 이름의 객체를 참조합니다. FindFirstChild() 함수는 지정된 이름의 자식 객체를 찾고, 찾지 못하면 nil을 반환합니다. WaitForChild() 함수는 지정된 이름의 자식 객체가 나타날 때까지 스크립트 실행을 일시 중단합니다. GetService() 함수는 지정된 이름의 서비스를 반환합니다. 스크립트 자체가 특정 객체 안에 있는 경우, script.Parent 속성을 사용하여 해당 객체를 직접 참조할 수 있습니다. 게임 월드의 객체 계층 구조를 이해하는 것은 스크립트를 통해 게임의 요소를 조작하는 데 필수적인 첫걸음입니다.
-- 게임 서비스 접근 예시
local workspace = game:GetService("Workspace")
local players = game:GetService("Players")
local lighting = game:GetService("Lighting")
-- 특정 객체 접근 예시
local baseplate = workspace:FindFirstChild("Baseplate")
if baseplate then print("Baseplate을 찾았습니다.")
end
-- 현재 스크립트의 부모 객체 접근 예시
local currentScriptParent = script.Parent
print("현재 스크립트의 부모:", currentScriptParent.Name)
Lua
복사
스크립트를 사용하여 게임 객체의 속성을 변경함으로써 객체의 외형과 동작을 수정할 수 있습니다. 속성에 접근하려면 점 표기법을 사용합니다. 예를 들어, part.BrickColor는 part라는 변수가 참조하는 객체의 색상 속성에 접근합니다. 초보자들이 자주 사용하는 속성으로는 BrickColor (객체의 색상) , Transparency (객체의 투명도, 0은 완전 불투명, 1은 완전 투명) , Position (3D 공간에서의 객체 위치) , Size (객체의 크기) , Anchored (객체가 중력의 영향을 받는지 여부) , CanCollide (다른 객체와 충돌할 수 있는지 여부) , 그리고 Material (객체의 표면 재질) 등이 있습니다. 각 속성은 특정 데이터 유형의 값을 가집니다. 예를 들어, BrickColor는 BrickColor 데이터 유형의 값을, Transparency는 숫자 데이터 유형의 값을 가집니다. 스크립트를 통해 이러한 속성 값을 변경함으로써 게임의 시각적 요소와 물리적 상호 작용을 동적으로 제어할 수 있습니다.
-- 객체 속성 변경 예시
local myPart = workspace:FindFirstChild("MyPart") -- 'MyPart'라는 이름의 파트가 있다고 가정
if myPart then myPart.BrickColor = BrickColor.new("Really Blue") -- 색상 변경 myPart.Transparency = 0.5 -- 반투명하게 만들기 myPart.Anchored = true -- 중력 영향 받지 않도록 고정 myPart.Size = Vector3.new(5, 2, 3) -- 크기 변경
end
Lua
복사
때로는 스크립트를 통해 게임에 새로운 객체를 생성하거나 더 이상 필요 없는 객체를 제거해야 할 경우가 있습니다. 새로운 객체를 생성하려면 Instance.new() 함수를 사용합니다. 이 함수는 생성하려는 객체의 클래스 이름을 인수로 받습니다. 예를 들어, local newPart = Instance.new("Part")는 새로운 파트 객체를 생성하여 newPart 변수에 저장합니다. 생성된 객체는 게임 계층 구조의 특정 위치에 배치해야 하는데, 이를 위해 객체의 Parent 속성을 설정합니다. 예를 들어, newPart.Parent = game.Workspace는 새로 생성된 파트를 Workspace 서비스 아래에 배치합니다. 반대로, 더 이상 필요 없는 객체를 게임에서 제거하려면 해당 객체의 Destroy() 메서드를 호출합니다. 예를 들어, partToRemove:Destroy()는 partToRemove 변수가 참조하는 객체를 게임에서 제거합니다. 객체를 동적으로 생성하고 제거하는 기능은 게임 플레이를 더욱 풍부하고 다양하게 만들어 줍니다.
-- 새로운 객체 생성 및 제거 예시
local newPart = Instance.new("Part") -- 새로운 파트 생성
newPart.Size = Vector3.new(2, 2, 2)
newPart.Position = Vector3.new(0, 10, 0)
newPart.BrickColor = BrickColor.new("Lime Green")
newPart.Parent = workspace -- Workspace에 파트 배치
task.wait(5) -- 5초 후 파트 제거
newPart:Destroy()
Lua
복사
속성 | 설명 | 데이터 유형 | 예제 코드 |
BrickColor | 객체의 색상 | BrickColor | part.BrickColor = BrickColor.new("Red") |
Transparency | 객체의 투명도 (0 ~ 1) | Number | part.Transparency = 0.5 |
Position | 3D 공간에서의 객체 위치 | Vector3 | part.Position = Vector3.new(10, 5, 0) |
Size | 객체의 크기 | Vector3 | part.Size = Vector3.new(4, 2, 6) |
Anchored | 중력의 영향을 받는지 여부 | Boolean | part.Anchored = true |
CanCollide | 다른 객체와 물리적으로 충돌할 수 있는지 여부 | Boolean | part.CanCollide = false |
Material | 객체의 표면 재질 | Enum.Material | part.Material = Enum.Material.Metal |
5. 작동하게 만들기: 이벤트에 응답하기
게임의 상호 작용성은 이벤트라는 개념을 통해 구현됩니다. 이벤트는 게임 내에서 특정 사건이 발생했음을 알리는 신호입니다. 예를 들어, 플레이어가 특정 파트를 터치했을 때, 마우스 버튼을 클릭했을 때, 또는 객체의 속성 값이 변경되었을 때 이벤트가 발생할 수 있습니다. Roblox에는 다양한 유형의 이벤트가 있으며, 초보자들이 자주 사용하는 이벤트로는 키보드 입력이나 마우스 클릭과 같은 입력 이벤트 , 객체가 다른 객체와 접촉했을 때 발생하는 Touched 이벤트 , ClickDetector 객체를 사용하여 객체를 클릭했을 때 발생하는 MouseClick 이벤트 , 객체의 속성 값이 변경되었을 때 발생하는 Changed 이벤트 , 그리고 플레이어가 게임에 추가되거나 캐릭터가 생성되었을 때 발생하는 PlayerAdded, CharacterAdded와 같은 게임 서비스 이벤트 등이 있습니다. 이벤트는 게임을 살아 움직이게 만드는 핵심 요소이며, 스크립트가 플레이어의 행동이나 게임 상태 변화에 반응할 수 있도록 합니다.
스크립트가 특정 이벤트에 반응하도록 하려면, 해당 이벤트에 함수를 연결해야 합니다. 이를 위해 콜론(:) 연산자와 함께 Connect() 메서드를 사용합니다. 기본적인 구문은 object.Event:Connect(functionName)과 같습니다. 여기서 object는 이벤트를 발생시키는 객체를, Event는 발생할 이벤트의 이름 (예: Touched, MouseClick), 그리고 functionName은 해당 이벤트가 발생했을 때 실행될 함수의 이름입니다. 때로는 간단한 작업을 위해 함수를 미리 정의하는 대신, Connect() 메서드 내에서 바로 익명 함수 (inline function)를 정의하여 사용할 수도 있습니다. 예를 들어, part.Touched:Connect(function(otherPart) print(otherPart.Name.. "가 파트를 터치했습니다!") end)와 같이 사용할 수 있습니다. 이벤트 핸들러 함수는 종종 파라미터를 받습니다. 예를 들어, Touched 이벤트는 이벤트를 발생시킨 객체 외에, 해당 객체를 터치한 다른 객체를 나타내는 otherPart라는 파라미터를 전달합니다. 이 파라미터를 통해 터치한 객체가 플레이어인지, 아니면 다른 게임 오브젝트인지 등을 확인할 수 있습니다. 이벤트에 함수를 연결하는 것은 특정 동작이 발생했을 때 스크립트가 무엇을 해야 할지를 정의하는 핵심적인 방법입니다.
-- 파트를 터치했을 때 메시지 출력 예시
local touchPart = workspace:FindFirstChild("TouchPart") -- 'TouchPart'라는 이름의 파트가 있다고 가정
if touchPart then touchPart.Touched:Connect(function(otherPart)print(otherPart.Name.. "가 TouchPart를 건드렸습니다.") end)
end
-- ClickDetector를 사용하여 파트를 클릭했을 때 색상 변경 예시
local clickablePart = workspace:FindFirstChild("ClickablePart") -- 'ClickablePart'라는 이름의 파트가 있다고 가정
local clickDetector = Instance.new("ClickDetector")
clickDetector.Parent = clickablePart
clickDetector.MouseClick:Connect(function(player) clickablePart.BrickColor = BrickColor.new("Bright Yellow") print(player.Name.. "님이 ClickablePart를 클릭했습니다.")
end)
Lua
복사
몇 가지 실용적인 이벤트 처리 예시를 살펴보겠습니다. 먼저, 파트를 터치했을 때 사라지게 만드는 스크립트를 만들 수 있습니다. 이를 위해서는 파트 객체의 Touched 이벤트에 함수를 연결하고, 그 함수 내에서 파트의 Transparency 속성을 1로 설정하고 CanCollide 속성을 false로 설정하면 됩니다. 터치한 객체가 플레이어인지 확인하기 위해 otherPart.Parent:FindFirstChildOfClass("Humanoid")와 같은 코드를 사용할 수 있습니다. 다음으로, ClickDetector를 사용하여 파트를 클릭했을 때 색상을 변경하는 스크립트를 만들 수 있습니다. 파트 안에 ClickDetector 객체를 삽입하고, 해당 객체의 MouseClick 이벤트에 함수를 연결하여 파트의 BrickColor 속성을 변경하면 됩니다. 이러한 간단한 예시들을 통해 초보자들은 이벤트 처리 코드가 실제로 게임 내에서 어떻게 작동하는지 직접 확인할 수 있습니다.
예시 1: 터치하면 사라지는 파트
1.
Roblox Studio에서 새로운 파트를 생성하고 이름을 "DisappearingPart"로 설정합니다.
2.
"DisappearingPart" 안에 새로운 스크립트를 생성합니다.
3.
다음 코드를 스크립트에 작성합니다.
local part = script.Parent
part.Touched:Connect(function(otherPart)local humanoid = otherPart.Parent:FindFirstChildOfClass("Humanoid")
if humanoid then -- 터치한 객체가 플레이어인지 확인
part.Transparency = 1
part.CanCollide = false
print(otherPart.Parent.Name.. "님이 파트를 터치하여 사라졌습니다.")
end
end)
Lua
복사
예시 2: 클릭하면 색상이 변하는 파트
1.
Roblox Studio에서 새로운 파트를 생성하고 이름을 "ColorChangingPart"로 설정합니다.
2.
"ColorChangingPart" 안에 ClickDetector 객체를 삽입합니다.
3.
"ColorChangingPart" 안에 새로운 스크립트를 생성합니다.
4.
다음 코드를 스크립트에 작성합니다.
local part = script.Parent
local clickDetector = part:FindFirstChild("ClickDetector")
clickDetector.MouseClick:Connect(function(player)local randomColor = BrickColor.random()
part.BrickColor = randomColor
print(player.Name.. "님이 파트를 클릭하여 색상이 ".. randomColor.Name.. "으로 변경되었습니다.")
end)
Lua
복사
6. 기본적인 인터페이스 구축: 플레이어와 상호 작용
게임에서 사용자 인터페이스 (GUI)는 정보를 표시하고 플레이어에게 게임을 제어할 수 있는 방법을 제공하는 데 필수적입니다. Roblox에서 GUI를 만들려면 StarterGui 서비스와 그 하위 객체인 ScreenGui 객체를 사용합니다. ScreenGui는 플레이어 화면에 GUI 요소를 표시하는 컨테이너 역할을 합니다. 초보자들이 자주 사용하는 기본적인 GuiObject 유형으로는 텍스트를 표시하는 TextLabel , 클릭 가능한 버튼을 만드는 TextButton , 다른 GUI 요소들을 담는 컨테이너 역할을 하는 Frame , 그리고 이미지를 표시하는 ImageLabel (간단히 언급) 등이 있습니다. GUI를 통해 플레이어는 게임의 상태를 확인하고, 메뉴를 조작하며, 특정 액션을 수행할 수 있습니다.
-- ScreenGui와 TextLabel 생성 예시
local player = game.Players.LocalPlayer
local playerGui = player:WaitForChild("PlayerGui")
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "MyScreenGui"
screenGui.Parent = playerGui
local textLabel = Instance.new("TextLabel")
textLabel.Name = "MyTextLabel"
textLabel.Text = "점수: 0"
textLabel.Size = UDim2.new(0, 200, 0, 50) -- 크기 설정
textLabel.Position = UDim2.new(0.1, 0, 0.1, 0) -- 위치 설정
textLabel.BackgroundTransparency = 0.5 -- 배경 투명도 설정
textLabel.Parent = screenGui
Lua
복사
가장 기본적인 GUI 상호 작용 중 하나는 버튼 클릭에 반응하는 것입니다. ScreenGui를 삽입하고 그 안에 TextButton을 추가하여 기본적인 버튼을 만들 수 있습니다. 버튼과 상호 작용하는 코드는 클라이언트 측에서 실행되어야 하므로, 버튼 안에 LocalScript를 삽입합니다. 스크립트 내에서 script.Parent를 사용하여 버튼 객체에 접근할 수 있습니다. 버튼 클릭을 감지하려면 MouseButton1Click 이벤트를 사용합니다. 이 이벤트에 함수를 연결하면, 플레이어가 버튼을 클릭했을 때 해당 함수가 실행됩니다. 예를 들어, 버튼을 클릭했을 때 출력 창에 메시지를 표시하거나, 다른 TextLabel의 텍스트를 변경하는 등의 간단한 기능을 구현할 수 있습니다. 기본적인 UI 스크립팅만으로도 플레이어 경험을 크게 향상시킬 수 있으며, 게임에 더욱 풍부한 상호 작용성을 더할 수 있습니다.
예시: 버튼 클릭 시 메시지 출력
1.
Roblox Studio에서 StarterGui에 ScreenGui를 삽입합니다.
2.
ScreenGui 안에 TextButton을 삽입합니다. 버튼의 텍스트와 위치, 크기 등을 속성 창에서 원하는 대로 설정합니다.
3.
TextButton 안에 LocalScript를 삽입합니다.
4.
다음 코드를 LocalScript에 작성합니다.
local button = script.Parent
button.MouseButton1Click:Connect(function()print("버튼이 클릭되었습니다!")
-- 여기에 버튼 클릭 시 수행할 다른 동작을 추가할 수 있습니다.
end)
Lua
복사
7. 코드 정리하기: 함수의 힘
함수는 특정 작업을 수행하는 재사용 가능한 코드 블록입니다. 함수를 사용하면 코드를 논리적인 단위로 나누어 정리하고, 동일한 코드를 여러 번 작성할 필요 없이 필요할 때마다 호출하여 실행할 수 있습니다. Luau에서 함수를 정의하려면 function 키워드를 사용합니다. 기본적인 함수 정의 구문은 function functionName() -- 실행할 코드 end와 같습니다. 함수를 호출 (실행)하려면 함수 이름 뒤에 괄호()를 붙이면 됩니다.
-- 간단한 함수 정의 및 호출 예시
local function greetPlayer()print("안녕하세요!")
end
greetPlayer() -- 함수 호출
Lua
복사
•
- 간단한 함수 정의 및 호출 예시
local function greetPlayer()print("안녕하세요!")
end
greetPlayer() -- 함수 호출
함수는 파라미터 (매개변수)를 통해 정보를 받을 수 있습니다. 파라미터는 함수를 정의할 때 괄호 안에 나열되는 변수이며, 함수를 호출할 때 전달되는 값 (arguments, 인자)을 받기 위한 자리표시자 역할을 합니다. 예를 들어, 파트의 투명도를 특정 값으로 변경하는 함수를 정의하려면 다음과 같이 할 수 있습니다. function setTransparency(part, value) part.Transparency = value end. 이 함수를 호출할 때는 setTransparency(myPart, 0.5)와 같이 파트 객체와 원하는 투명도 값을 인자로 전달합니다.
-- 파라미터를 받는 함수 예시
local function setPartColor(part, colorName)if part then part.BrickColor = BrickColor.new(colorName) else print("파트가 존재하지 않습니다.") end
end
local myPart = workspace:FindFirstChild("MyPart")
setPartColor(myPart, "Really Red") -- 함수 호출 시 파트 객체와 색상 이름 전달
Lua
복사
•
- 파라미터를 받는 함수 예시
local function setPartColor(part, colorName)if part then part.BrickColor = BrickColor.new(colorName) else print("파트가 존재하지 않습니다.") end
end
local myPart = workspace:FindFirstChild("MyPart")
setPartColor(myPart, "Really Red") -- 함수 호출 시 파트 객체와 색상 이름 전달
함수는 return 키워드를 사용하여 값을 반환할 수도 있습니다. 반환된 값은 함수 호출의 결과로 사용될 수 있습니다. 예를 들어, 두 숫자의 합을 계산하는 함수는 다음과 같이 정의할 수 있습니다. function add(num1, num2) local sum = num1 + num2 return sum end. 이 함수를 호출하고 결과를 변수에 저장할 수 있습니다. local result = add(5, 3).
-- 값을 반환하는 함수 예시
local function addNumbers(a, b)local sum = a + b return sum
end
local result = addNumbers(10, 20)
print("두 수의 합:", result) -- 출력: 두 수의 합: 3
Lua
복사
•
- 값을 반환하는 함수 예시
local function addNumbers(a, b)local sum = a + b return sum
end
local result = addNumbers(10, 20)
print("두 수의 합:", result) -- 출력: 두 수의 합: 30
함수 내에서 정의된 변수는 해당 함수 내에서만 접근할 수 있는 지역 범위 (local scope)를 갖습니다. 이는 코드의 충돌을 방지하고 관리하기 쉽게 만들어 줍니다. 전역 범위 (global scope)를 갖는 변수도 있지만 (간단히 다시 언급, 과도한 사용은 지양) , 일반적으로 지역 변수를 사용하는 것이 좋습니다. 함수를 사용하면 코드를 더욱 체계적이고 효율적으로 관리할 수 있으며, 코드의 재사용성을 높여 개발 과정을 더욱 편리하게 만들어 줍니다.
8. 모두 함께 적용하기: 연습 문제 및 도전 과제
이제까지 배운 내용을 바탕으로 몇 가지 연습 문제와 도전 과제를 통해 실력을 키워 봅시다.
도전 과제 1: 색상 변경 블록
문제: 게임 내 블록의 색상이 몇 초마다 다른 색으로 순환하도록 스크립트를 작성하세요.
연습할 개념: 변수, 반복문 (while 또는 for), 객체 속성 변경 (BrickColor), task.wait().
힌트:
•
색상 목록을 테이블에 저장합니다.
•
루프를 사용하여 테이블의 색상을 순환합니다.
•
task.wait()를 사용하여 색상 변경 간격을 조절합니다.
•
BrickColor.new() 또는 BrickColor.random()을 사용하여 색상을 설정합니다.
도전 과제 2: 클릭하면 사라지는 플랫폼
문제: 플레이어가 클릭하면 플랫폼이 사라지고 잠시 후 다시 나타나는 스크립트를 작성하세요.
연습할 개념: 이벤트 처리 (ClickDetector.MouseClick), 객체 속성 변경 (Transparency, CanCollide), 함수, task.wait().
힌트:
•
파트에 ClickDetector를 추가합니다.
•
클릭 이벤트를 감지하는 함수를 만듭니다.
•
함수 내에서 파트의 투명도와 충돌 속성을 변경합니다.
•
task.wait()를 사용하여 사라진 후 다시 나타나는 시간을 설정합니다.
도전 과제 3: 간단한 점수 카운터
문제: 점수를 표시하는 TextLabel이 있는 기본적인 UI를 만드세요. 플레이어가 특정 파트를 터치하면 점수가 증가하도록 스크립트를 작성하세요.
연습할 개념: UI 생성 (ScreenGui, TextLabel), 이벤트 처리 (Touched), 변수, 스크립트에서 UI 요소 업데이트.
힌트:
•
StarterGui에 ScreenGui와 TextLabel을 추가합니다.
•
점수를 저장할 변수를 만듭니다.
•
특정 파트의 Touched 이벤트를 감지하는 함수를 만듭니다.
•
함수 내에서 점수를 증가시키고 TextLabel의 텍스트를 업데이트합니다.
9. 여정을 계속하기: 팁과 다음 단계
코드를 작성할 때 가독성을 높이기 위해 일관된 들여쓰기를 사용하고, 변수 이름을 의미 있게 짓는 것이 좋습니다. 코드를 더 작고 관리하기 쉬운 부분으로 나누기 위해 함수를 적극적으로 활용하는 것이 좋습니다. 또한, 코드의 목적과 작동 방식을 설명하기 위해 주석을 꾸준히 작성하는 습관을 들이세요.
코드가 예상대로 작동하지 않을 때는 디버깅 전략이 필요합니다. 먼저 '출력' 창을 확인하여 오류 메시지가 있는지, print() 문을 통해 원하는 값이 출력되고 있는지 확인하세요. '스크립트 분석' 창을 통해 문법 오류 (오타 등)를 쉽게 찾아낼 수도 있습니다. 복잡한 코드는 작은 부분으로 나누어 각 부분을 개별적으로 테스트하는 것이 효과적입니다.
Luau 스크립팅에 대해 더 깊이 있게 배우고 싶다면 다음과 같은 리소스를 활용해 보세요. Roblox 개발자 허브는 공식 문서와 튜토리얼을 제공하는 훌륭한 자료입니다. Roblox 커뮤니티 포럼 (DevForum)은 질문을 하고 다른 개발자들과 교류하며 문제 해결에 도움을 받을 수 있는 곳입니다. YouTube에는 TheDevKing, AlvinBlox, GnomeCode, BrawlDev와 같이 초보자를 위한 훌륭한 튜토리얼을 제공하는 채널이 많이 있습니다. 또한, lua.org나 Codecademy와 같은 온라인 Lua 학습 리소스를 참고하는 것도 도움이 될 수 있습니다.
스크립팅을 배우는 데는 시간과 노력이 필요합니다. 조급해하지 않고 꾸준히 연습하는 것이 중요합니다. 작은 프로젝트부터 시작하여 점차 난이도를 높여가면서 다양한 기능을 구현해 보세요. 끊임없이 실험하고 배우려는 자세를 갖는다면, Roblox 게임 개발의 즐거움과 보람을 느끼게 될 것입니다.