로블록스 스튜디오에서 만들어지는 3D 게임은 Workspace 안에 배치된 Part와 각 객체의 위치·회전 정보를 나타내는 CFrame, 그리고 Lua 스크립트의 이벤트(Event)를 결합해 동작한다. 단순히 블록을 배치하는 것만으로는 플레이어가 움직이는 게임이 완성되지 않으며, 특정 파트에 닿았을 때 캐릭터가 죽거나 발판이 사라지는 등의 게임 규칙을 코드로 정의해야 한다.
이번 프로젝트에서는 가장 기본적인 Lava Obstacle Map, 즉 용암을 피해 여러 발판을 건너가는 3D 오비(Obby)를 제작한다. 코딩 경험이 없는 초보자도 따라갈 수 있도록 맵 구성부터 Lua 스크립트, 테스트와 퍼블리싱까지 하나의 프로젝트 흐름으로 연결한다.
로블록스 스튜디오 Lua의 기본 구조 이해하기
로블록스 스튜디오에서 가장 먼저 이해해야 할 것은 Workspace다. Workspace는 실제 게임 화면에 존재하는 3D 객체가 들어가는 공간이다.
예를 들어 다음과 같이 생각하면 쉽다.
Workspace→ 게임 속 실제 공간Part→ 바닥, 발판, 벽 등의 3D 물체SpawnLocation→ 플레이어가 처음 등장하는 위치Script→ 객체에 특정 행동을 부여하는 코드Humanoid→ 플레이어 캐릭터의 체력과 움직임 등을 관리하는 객체
Lua 스크립트에서는 특정 이벤트가 발생했을 때 코드를 실행할 수 있다. 대표적인 것이 Touched 이벤트다.
플레이어가 용암에 닿았을 때 Touched 이벤트가 발생하고, 스크립트가 플레이어 캐릭터 내부의 Humanoid를 찾아 체력을 0으로 변경하면 캐릭터가 사망한다.
즉, 플레이어 이동 → 파트 접촉 → Touched 이벤트 → Humanoid 탐색 → 체력 0 → 리스폰
이라는 이벤트 기반 구조가 만들어진다.
로블록스 스튜디오 Lua 장애물 맵 제작 1단계
로블록스 스튜디오(Roblox Studio) 바로가기 ↗Baseplate와 SpawnLocation 준비하기
먼저 Roblox Studio를 실행하고 새로운 Baseplate 프로젝트를 생성한다.
Baseplate는 게임 공간의 기본 바닥이지만, 실제 오비에서는 플레이어가 점프하면서 이동할 수 있도록 별도의 발판을 배치하는 것이 좋다.
가장 먼저 SpawnLocation을 배치한다.
플레이어가 게임을 시작했을 때 엉뚱한 위치에서 떨어지지 않도록 SpawnLocation은 출발 지점의 바닥에 안정적으로 배치한다.
이때 중요한 속성이 Anchored다.
Anchored를 활성화하면 해당 Part가 물리 엔진의 영향을 받아 떨어지거나 움직이지 않는다. 오비의 바닥과 발판은 플레이어가 밟아도 움직이면 안 되므로 대부분 Anchored = true로 설정한다.
주요 객체 속성 정리
| 객체 | 주요 속성 | 권장 설정 | 용도 |
|---|---|---|---|
| SpawnLocation | Anchored | True | 시작 위치 |
| SpawnLocation | CanCollide | True | 플레이어 착지 |
| Platform | Anchored | True | 장애물 발판 |
| Platform | CanCollide | True | 플레이어 이동 |
| KillPart | Anchored | True | 용암 영역 |
| KillPart | CanCollide | True | 장애물 접촉 |
| FadePart | Anchored | True | 사라지는 발판 |
| FadePart | CanCollide | True | 점프 구간 |
파트 이름을 미리 정해두는 것도 중요하다.
예를 들어 용암은 KillPart, 사라지는 발판은 FadePart처럼 이름을 지정하면 나중에 Explorer에서 객체를 쉽게 찾을 수 있다.
로블록스 스튜디오 Lua 장애물 맵 제작 2단계
닿으면 즉사하는 KillPart 만들기
이제 게임의 핵심 장애물인 용암을 만든다.
Part를 하나 추가하고 크기를 넓게 조정한다. 플레이어가 발판에서 떨어졌을 때 용암 영역에 닿도록 발판 아래에 배치한다.
이 Part의 이름을 KillPart로 변경한다.
색상은 빨간색이나 주황색 계열로 지정하면 시각적으로 용암이라는 것을 쉽게 구분할 수 있다.
그다음 KillPart 안에 Script를 추가한다.
local killPart = script.Parent -- 현재 스크립트가 들어 있는 KillPart를 가져온다.
killPart.Touched:Connect(function(hit) -- 플레이어 또는 다른 객체가 KillPart에 닿았을 때 실행한다.
local character = hit.Parent -- 접촉한 객체의 부모를 캐릭터로 간주한다.
local humanoid = character:FindFirstChildOfClass("Humanoid") -- 캐릭터에서 Humanoid 객체를 찾는다.
if humanoid then -- Humanoid가 실제로 존재하는 경우에만 아래 코드를 실행한다.
humanoid.Health = 0 -- 플레이어의 체력을 0으로 설정하여 캐릭터를 사망시킨다.
end -- Humanoid 조건문을 종료한다.
end) -- Touched 이벤트 함수 실행을 종료한다.
이 코드에서 핵심은 Touched다.
Touched는 Part와 다른 BasePart가 물리적으로 접촉했을 때 발생하는 이벤트다.
다만 Touched가 발생했다고 해서 항상 플레이어가 접촉한 것은 아니다. 다른 물체가 닿을 수도 있기 때문에 Humanoid가 존재하는지 확인하는 조건문을 넣는 것이 안전하다.
로블록스 스튜디오 Lua 장애물 맵 제작 3단계
밟으면 사라지는 FadePart 만들기
다음으로 오비 게임에서 자주 사용되는 트릭 발판을 만든다.
새로운 Part를 추가하고 이름을 FadePart로 지정한다.
이 발판은 플레이어가 밟으면 잠시 유지되다가 투명해지고, 더 이상 밟을 수 없게 만든다.
발판 안에 Script를 추가하고 다음 코드를 입력한다.
local fadePart = script.Parent -- 현재 스크립트가 들어 있는 FadePart를 가져온다.
local busy = false -- 여러 번 동시에 실행되는 것을 막기 위한 상태 변수를 만든다.
fadePart.Touched:Connect(function(hit) -- 플레이어가 발판에 닿았을 때 실행한다.
if busy then return end -- 이미 실행 중이면 중복 실행하지 않고 함수를 종료한다.
local character = hit.Parent -- 접촉한 객체의 부모를 캐릭터로 설정한다.
local humanoid = character:FindFirstChildOfClass("Humanoid") -- 캐릭터에서 Humanoid를 찾는다.
if not humanoid then return end -- 플레이어 캐릭터가 아니면 실행을 종료한다.
busy = true -- 현재 발판의 사라지는 동작이 시작되었음을 기록한다.
task.wait(2) -- 플레이어가 발판을 밟은 뒤 2초 동안 기다린다.
fadePart.Transparency = 1 -- 발판을 완전히 투명하게 만든다.
fadePart.CanCollide = false -- 플레이어가 더 이상 발판 위에 설 수 없도록 한다.
task.wait(2) -- 발판이 사라진 상태를 2초 동안 유지한다.
fadePart.Transparency = 0 -- 발판을 다시 보이게 만든다.
fadePart.CanCollide = true -- 다시 플레이어가 밟을 수 있도록 만든다.
busy = false -- 발판을 다시 사용할 수 있는 상태로 변경한다.
end) -- Touched 이벤트 함수 실행을 종료한다.
여기에서 중요한 것은 Transparency와 CanCollide의 역할이 서로 다르다는 점이다.
Transparency = 1은 화면에서 발판이 보이지 않도록 만든다.
반면 CanCollide = false는 실제 물리적인 충돌을 막는다.
따라서 단순히 투명하게 만드는 것만으로는 플레이어가 보이지 않는 발판 위를 계속 걸을 수 있다. 시각적 상태와 물리적 상태를 함께 변경해야 진짜 사라지는 발판이 된다.
또한 task.wait(2)를 사용하면 일정 시간 뒤 다음 동작을 실행할 수 있다. 이를 이용하면 발판이 사라지는 시간을 조절하면서 게임 난이도를 설계할 수 있다.

로블록스 스튜디오 Lua로 난이도 조절하기
기본 오비가 완성되었다면 단순히 발판을 많이 만드는 것보다 장애물 사이의 거리와 반복 패턴을 조절하는 것이 중요하다.
초보자용 맵이라면 첫 구간은 점프 거리를 짧게 구성하고, 뒤로 갈수록 난이도를 높이는 방식을 추천한다.
예를 들어 다음과 같이 구성할 수 있다.
1구간
일반 발판 → 일반 발판 → 용암
2구간
일반 발판 → 좁은 발판 → 용암 → 일반 발판
3구간
사라지는 발판 → 사라지는 발판 → 용암
마지막 구간
좁은 발판 → 이동 구간 → 용암 → 도착 지점
이렇게 구성하면 플레이어가 게임 규칙을 먼저 익힌 뒤 점진적으로 어려운 장애물을 경험하게 된다.
특히 초보자용 교육 콘텐츠라면 처음부터 모든 기능을 넣기보다 한 가지 기능을 구현하고 직접 테스트한 뒤 다음 기능으로 넘어가는 방식이 좋다.
로블록스 스튜디오 Lua 장애물 맵 제작 4단계
F5로 플레이 테스트하기
모든 파트를 배치했다면 Roblox Studio 상단의 Play 버튼을 눌러 실제 게임을 테스트한다.
가장 먼저 확인할 것은 SpawnLocation이다.
플레이어가 정상적으로 출발 지점에 생성되는지 확인한다.
그다음 발판을 이동하면서 다음 항목을 차례로 확인한다.
- 일반 발판을 정상적으로 밟을 수 있는가?
- 용암에 닿았을 때 캐릭터가 사망하는가?
- 사망 후 다시 SpawnLocation으로 돌아오는가?
- FadePart를 밟았을 때 2초 후 사라지는가?
- 사라진 발판을 실제로 통과할 수 있는가?
- 일정 시간이 지나면 발판이 다시 나타나는가?
문제가 발생했다면 Explorer에서 해당 Part 안에 Script가 제대로 들어 있는지 먼저 확인한다.
특히 Script와 LocalScript를 잘못 사용하는 경우 초보자에게 예상하지 못한 문제가 발생할 수 있다. 이번 예제처럼 서버에서 Part의 물리 상태를 제어하는 기본적인 장애물 로직은 일반 Script를 사용하는 방식으로 구현할 수 있다.
로블록스 스튜디오 Lua 프로젝트 퍼블리싱하기
게임이 정상적으로 작동한다면 Roblox Studio에서 프로젝트를 Roblox에 게시할 수 있다.
일반적으로 File 메뉴에서 Publish to Roblox 관련 기능을 이용해 게임을 클라우드에 저장한다.
처음 게시할 때는 게임 이름과 설명을 설정한다.
예를 들어 게임 제목을 Lava Escape Obby로 설정하고 다음과 같은 설명을 추가할 수 있다.
용암을 피해 다양한 장애물을 통과하는 초보자용 3D Obby 게임입니다.
게시가 완료된 후 게임의 공개 설정을 확인하고, 필요한 경우 친구가 플레이할 수 있도록 접근 권한을 설정한다.