← 모든 가이드
가이드 4

첫 번째 tower defense 만들기

적이 path를 따라 내 base로 걸어오고, 타워가 가장 가까운 적을 쏴요.

무료60분 · 초급 · Roblox Studio
1
단계 1 / 8

플레이스 준비하기

  1. Roblox Studio를 열고 New Experience를 눌러 Baseplate 템플릿을 골라요.
  2. Explorer에서 Workspace 위에 마우스를 올리고 +를 눌러 Folder를 추가해요. 이름은 Path로 해요.
  3. Workspace에 Folder를 하나 더 추가하고 이름을 Enemies로 해요. 비워 둬요. 게임이 진행되는 동안 적이 그 안에 나타나요.

더 자세히 보기

  • Baseplate 템플릿은 시작 화면의 템플릿 목록에 있어요.
  • +를 누르고 Folder라고 쓰면 빨리 찾을 수 있어요. Folder 이름은 F2로 바꿔요.
  • 이름은 정확히 Path와 Enemies여야 하고, 첫 글자는 대문자예요. script가 이 이름을 찾아요.
  • Mac에서는 이 가이드에 Ctrl이라고 나올 때마다 Cmd 키를 써요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

2
단계 2 / 8

길 만들기

  1. Part를 추가해요. Size를 6, 1, 6으로 하고, Anchored를 켜고, Path Folder 안으로 끌어넣어요. 이름은 1로 해요.
  2. Ctrl+D로 복사해서 복사본을 약 30 studs 떨어진 곳으로 옮겨요. 이름은 2로 해요.
  3. 1, 2, 3, 4, 5라는 이름의 part가 5개가 될 때까지 반복해요. 길에 굽은 곳이 몇 군데 생기도록 놓아요.
  4. 적은 1에서 2로, 3으로 차례차례 가는데, 각 두 part 사이는 직선으로 가요.

더 자세히 보기

  • part를 Folder 안에 넣으려면 Explorer에서 part 이름을 Path라는 이름 위로 끌어다 놓아요.
  • Ctrl+D로 만든 복사본은 이미 Path Folder 안에 있어요. 옮기고 이름만 바꾸면 돼요.
  • 이름은 그냥 숫자예요. 1, 2, 3, 4, 5요. 글자도 띄어쓰기도 없어요.
  • part는 바닥에 그대로 눕혀 둬요. 적은 그 위 2 studs 높이에 떠 있어요.
자주 하는 실수. 번호를 건너뛰는 거예요. 3번 part가 없으면 적이 2번에서 멈추고 스크립트에 오류가 나요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

3
단계 3 / 8

적 만들기

  1. Part를 추가해요. Shape를 Ball로 하고 Size를 3, 3, 3으로 하고, 빨간색으로 만들어요. Anchored를 켜고, CanCollide를 끄고, 이름을 Enemy로 해요.
  2. Enemy 위에 마우스를 올리고 +를 눌러 IntValue를 추가해요. 이름은 Health로 하고 Value를 3으로 해요.
  3. Enemy를 ServerStorage로 끌어다 놓아요. 이제 견본이 됐어요. 게임이 이걸 복사해서 적을 만들 거예요.

더 자세히 보기

  • Shape는 Properties에 있는 목록이에요. 클릭해서 Ball을 골라요.
  • CanCollide는 Properties에 있는 체크 상자예요. 체크 표시가 없으면 플레이어와 다른 part가 enemy를 통과해요.
  • +를 누르고 IntValue라고 쓰면 찾을 수 있어요. 새 IntValue를 클릭하고, Properties에서 Name을 Health로, Value를 3으로 바꿔요.
  • Enemy를 ServerStorage로 끌어넣으면 Viewport에서 사라져요. 맞는 거예요.
팁. 스크립트가 움직이기 때문에 적은 Anchored예요. Anchored part는 중력도 밀림도 받지 않아요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

4
단계 4 / 8

Base 만들기

  1. path 끝, 5번 part 옆에 큰 Part를 추가해요. Anchored를 켜고 이름을 Base로 해요.
  2. Base 위에 마우스를 올리고 +를 눌러 IntValue를 추가해요. 이름은 Health로 하고 Value를 10으로 해요.
  3. Base에 BillboardGui를 추가하고 Size는 {0, 200}, {0, 50}, StudsOffset은 0, 8, 0으로 해요. 그 안에 TextLabel을 추가하고 Size는 {1, 0}, {1, 0}으로 하고 TextScaled를 켜요.
  4. Base에 Script를 추가하고 이 코드를 붙여 넣어요.
Base > Script
local base = script.Parent
local health = base.Health
local label = base.BillboardGui.TextLabel

local function update()
	if health.Value > 0 then
		label.Text = "Base: " .. health.Value
	else
		label.Text = "Game over"
	end
end

health.Changed:Connect(update)
update()

각 부분이 하는 일

  • Changed는 Health 값이 바뀔 때마다 실행돼요.
  • update 함수는 새 숫자를 base 위에 있는 글씨에 적어 줘요.
  • Health가 0이 되면 글씨에 Game over가 나타나고 Waves 스크립트는 적을 보내는 걸 멈춰요.

더 자세히 보기

  • 10, 10, 10 크기가 base로 좋아요. 색은 아무거나 괜찮아요.
  • base의 Health와 enemy의 Health는 서로 다른 오브젝트예요. 각각 자기 part 안에 들어 있어요.
  • Size와 StudsOffset은 괄호와 쉼표까지 보이는 그대로 숫자를 쓰고 Enter를 눌러요.
  • 테스트하려면 F5를 눌러요. base 위의 이름표에 Base: 10이 나와요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

5
단계 5 / 8

웨이브 보내기

  1. ServerScriptService 위에 마우스를 올리고 +를 눌러 Script를 추가해요. 이름은 Waves로 해요.
  2. 이미 적혀 있는 줄은 지우고 이 코드를 붙여 넣어요.
  3. Play를 눌러요. 3초마다 빨간 공이 1번 part에 나타나서 path를 따라 움직여요. 끝에 닿으면 base가 health 1을 잃어요.
ServerScriptService > Waves
local TweenService = game:GetService("TweenService")
local ServerStorage = game:GetService("ServerStorage")

local path = workspace:WaitForChild("Path")
local enemies = workspace:WaitForChild("Enemies")
local base = workspace:WaitForChild("Base")
local SPEED = 8

local function walk(enemy)
	for i = 2, #path:GetChildren() do
		local target = path[tostring(i)].Position + Vector3.new(0, 2, 0)
		local distance = (target - enemy.Position).Magnitude
		local info = TweenInfo.new(distance / SPEED, Enum.EasingStyle.Linear)
		local tween = TweenService:Create(enemy, info, {Position = target})
		tween:Play()
		tween.Completed:Wait()
		if not enemy.Parent then return end
	end

	base.Health.Value = math.max(0, base.Health.Value - 1)
	enemy:Destroy()
end

while base.Health.Value > 0 do
	task.wait(3)

	local enemy = ServerStorage.Enemy:Clone()
	enemy.Position = path["1"].Position + Vector3.new(0, 2, 0)
	enemy.Parent = enemies
	task.spawn(walk, enemy)
end

각 부분이 하는 일

  • Clone은 ServerStorage에 있는 Enemy 견본을 복사해요.
  • walk 함수는 적을 path의 각 part로 차례대로 움직여요. distance / SPEED 덕분에 긴 구간에서도 짧은 구간에서도 속도가 똑같아요.
  • task.spawn은 적마다 따로 걷게 해 줘서, 반복문이 계속 새 적을 보낼 수 있어요.

더 자세히 보기

  • script는 새 탭에서 열려요. 코드 안을 클릭하고 Ctrl+A를 누른 다음 Ctrl+V를 눌러 전부 바꿔요.
  • 게임이 실행되는 동안 enemy가 Enemies Folder 안에 나타나요. Explorer에서 볼 수 있어요.
  • tower가 아직 없으면 모든 enemy가 base에 닿아요. enemy 10마리가 닿으면 이름표에 Game over가 나오고 enemy가 더 이상 오지 않아요.
  • Output에 없는 이름에 관한 빨간 글씨가 나오면, path의 part나 Folder 중 하나의 이름이 틀렸다는 뜻이에요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

6
단계 6 / 8

타워 만들기

  1. path가 굽는 곳 근처에 Part를 추가해요. Size를 4, 8, 4로 하고, Anchored를 켜고, 이름을 Tower로 해요.
  2. Tower에 Script를 추가하고 이 코드를 붙여 넣어요.
  3. Play를 눌러요. 1초마다 타워가 사거리 안에서 가장 가까운 적을 때려요. 적은 하얗게 번쩍이고, 3번 맞으면 사라져요.
Tower > Script
local tower = script.Parent
local enemies = workspace:WaitForChild("Enemies")
local RANGE = 25
local DAMAGE = 1

while true do
	task.wait(1)

	local target = nil
	local closest = RANGE
	for _, enemy in ipairs(enemies:GetChildren()) do
		local distance = (enemy.Position - tower.Position).Magnitude
		if distance < closest then
			target = enemy
			closest = distance
		end
	end

	if target then
		target.Health.Value -= DAMAGE
		if target.Health.Value <= 0 then
			target:Destroy()
		else
			target.Color = Color3.new(1, 1, 1)
			task.wait(0.1)
			target.Color = Color3.fromRGB(255, 60, 60)
		end
	end
end

각 부분이 하는 일

  • 반복문은 타워에서 모든 적까지의 거리를 재서 가장 가까운 적을 기억해요.
  • RANGE는 타워가 닿을 수 있는 거리예요. DAMAGE는 한 번 때릴 때 깎이는 health의 양이에요.
  • Health가 0이 되면 Destroy가 적을 없애요.

더 자세히 보기

  • tower는 path에서 8에서 12 studs 떨어진 곳에 놓아요. range는 모든 방향으로 25 studs예요.
  • tower 하나는 enemy 한 마리에 3초가 걸리고, 새 enemy는 3초마다 와요. 그래서 enemy가 range 안에 충분히 오래 머물러야 tower 하나로 path를 막을 수 있어요.
  • 하얀 번쩍임은 0.1초 동안만 보여요. 잘 보면 보여요.
  • 두 번째 tower를 만들려면 Tower를 선택하고 Ctrl+D를 누른 다음 복사본을 옮겨요. script도 같이 따라와요.
팁. 타워는 굽은 곳 옆에 놓을 때 가장 좋아요. 거기서는 적이 사거리 안에 더 오래 머물러요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

7
단계 7 / 8

테스트하고 균형 맞추기

  1. F5를 눌러서 웨이브를 몇 번 지켜봐요.
  2. base에 닿는 적이 하나도 없으면 게임이 너무 쉬운 거예요. base가 health를 순식간에 다 잃으면 너무 어려운 거예요.
  3. 숫자 세 개로 균형을 맞춰요. Waves의 기다리는 시간, 적의 Health 값, 타워의 DAMAGE예요.
  4. Shift+F5를 눌러 멈춰요. 뭔가 잘 안 되면 Window 메뉴에서 Output 창을 열고 빨간 글씨를 읽어요.

더 자세히 보기

  • 한 번에 숫자 하나만 바꾸고 다시 해 봐요. 그렇지 않으면 어떤 변화가 도움이 됐는지 알 수 없어요.
  • 기다리는 시간은 Waves script 끝부분 근처의 task.wait(3)에 있는 숫자예요. 숫자가 작을수록 enemy가 더 빨리 와요.
  • enemy의 Health는 ServerStorage의 Enemy 안에 있어요. tower의 DAMAGE는 Tower script 맨 위에 있어요.
  • 좋은 첫 목표는 tower 두 개로 base가 2분 동안 버티는 거예요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

8
단계 8 / 8

게시하기

  1. File → Publish to Roblox를 골라요. 게임 이름과 짧은 설명을 적어요.
  2. Creator Hub 웹사이트에서 내 게임을 열고 Maturity 설문을 채워요.
  3. 게임을 Public으로 바꾸고 친구에게 링크를 보내요.

더 자세히 보기

  • 처음 게시할 때 Studio가 이름과 설명을 물어봐요. Create를 눌러요.
  • Creator Hub는 create.roblox.com 웹사이트예요. 같은 계정으로 로그인하고 목록에서 내 게임을 클릭해요.
  • 게임을 공개하려면 Roblox가 더 요구할 수도 있어요. 예를 들면 계정의 나이 확인이에요. 무엇이 빠졌는지 페이지가 알려 줘요.
  • 18세 미만이라면 이 단계는 부모님과 함께 해요.
팁. 친구에게 게임을 보여 주고 한 가지만 물어봐요. 너무 쉬웠나요, 너무 어려웠나요? 그다음 숫자 하나를 바꾸고 다시 테스트해요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 part와 script의 이름이 가이드와 똑같은지 확인해요. 대문자도 똑같아야 해요.
  • script가 알맞은 오브젝트 안에 있는지 확인해요. 코드 상자 위의 이름표를 봐요.
  • Window 메뉴에서 Output 창을 열어요. 빨간 글씨가 문제가 있는 script와 줄을 알려 줘요.

그래도 안 되나요? 우리에게 메일을 보내요 →

이제 직접 바꿔 봐요

  • 사거리가 짧고 DAMAGE가 2인 두 번째 타워를 추가해 봐요.
  • 웨이브가 갈수록 빨라지게 해 봐요. 힌트: 기다리는 시간을 변수에 넣고, 적이 나올 때마다 조금씩 줄여요.
  • base의 health를 20으로 하고, 적이 하나 올 때마다 2씩 깎이게 해 봐요.