← 모든 가이드
가이드 5

첫 번째 훔치고 지키기 게임 만들기

모든 플레이어가 base를 하나씩 가져요. 가운데에서 gem을 잡고, 집으로 달려가 점수를 얻고, gem을 든 사람은 태그해요.

무료70분 · 초급, 마지막 가이드 · Roblox Studio
1
단계 1 / 8

플레이스 준비하기

  1. Roblox Studio를 열고 New Experience를 눌러 Baseplate 템플릿을 골라요.
  2. gem은 맵 가운데에 놓여요. base 네 개가 gem 둘레에, 가운데에서 각각 약 60 studs 떨어져 있어요.
  3. 이 게임은 플레이어가 적어도 두 명 있어야 해요. 그래서 마지막에는 테스트 플레이어 두 명으로 테스트할 거예요.

더 자세히 보기

  • Baseplate 템플릿은 시작 화면의 템플릿 목록에 있어요.
  • Properties의 Position 칸은 part가 어디에 있는지 보여 줘요. Position 60, 0.5, 0은 맵 가운데에서 60 studs 떨어진 곳이에요.
  • SpawnLocation, 즉 플레이어가 나타나는 발판을 가운데 가까이로 옮겨요. 그러면 모든 플레이어가 gem에서 같은 거리에서 시작해요.
  • Mac에서는 이 가이드에 Ctrl이라고 나올 때마다 Cmd 키를 써요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

2
단계 2 / 8

Base 만들기

  1. Explorer에서 Workspace 위에 마우스를 올리고 +를 눌러 Folder를 추가해요. 이름은 Bases로 해요.
  2. Part를 추가해요. Size를 16, 1, 16으로 하고, Anchored를 켜고, 회색으로 만들어요. Bases 안으로 끌어넣고 이름을 Base1로 해요.
  3. Ctrl+D로 세 번 복사해요. 복사본 이름을 Base2, Base3, Base4로 하고, 맵의 사방에 하나씩 옮겨요.

더 자세히 보기

  • part를 Folder 안에 넣으려면 Explorer에서 part 이름을 Bases라는 이름 위로 끌어다 놓아요.
  • Ctrl+D로 만든 복사본은 이미 Bases Folder 안에 있어요. 하나씩 F2로 이름을 바꿔요.
  • 이름은 정확히 Base1, Base2, Base3, Base4여야 하고, 숫자 앞에 띄어쓰기가 없어요.
  • 플레이어가 네 명보다 많은 서버는 base보다 플레이어가 더 많아요. 나중에 Creator Hub의 게임 설정에서 서버 크기를 4로 정할 수 있어요.
팁. 네 base 모두 가운데에서 같은 거리에 두어요. 그러면 모두에게 공평한 게임이 돼요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

3
단계 3 / 8

Gem 만들기

  1. 맵 가운데, 바닥에서 약 4 studs 위에 Part를 추가해요. Size를 2, 2, 2로 하고, 밝은 색을 고르고, Material을 Neon으로 바꿔요. 이름은 Gem으로 해요.
  2. Anchored와 Massless를 켜고, CanCollide를 꺼요.
  3. Gem 위에 마우스를 올리고 +를 눌러 ProximityPrompt를 추가해요. ActionText를 Take로, HoldDuration을 1로 해요.

각 부분이 하는 일

  • ProximityPrompt는 플레이어가 가까이 서면 버튼을 보여 줘요. 1초 동안 누르고 있으면 작동해요.
  • Massless를 켜고 CanCollide를 끄면, gem이 들고 있는 플레이어를 느리게 하거나 밀지 않아요.

더 자세히 보기

  • Anchored, Massless, CanCollide는 Properties에 있는 체크 상자예요.
  • +를 누르고 ProximityPrompt라고 쓰면 찾을 수 있어요. 클릭한 다음 Properties에서 ActionText와 HoldDuration을 바꿔요.
  • 게임에서 gem 가까이에 서면 E 글자와 Take라는 낱말이 적힌 작은 버튼이 나타나요.
  • 휴대폰에서는 그 버튼을 손가락으로 꾹 눌러요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

4
단계 4 / 8

모든 플레이어에게 base와 점수 주기

  1. ServerScriptService 위에 마우스를 올리고 +를 눌러 Script를 추가해요. 이름은 Game으로 해요.
  2. 이미 적혀 있는 줄은 지우고 이 코드를 붙여 넣어요. 세 부분 중 첫 번째예요.
  3. Play를 눌러요. base 하나가 초록색으로 바뀌어요. 그게 내 base예요.
ServerScriptService > Game (1 / 3)
local Players = game:GetService("Players")

local bases = workspace:WaitForChild("Bases")
local gem = workspace:WaitForChild("Gem")
local home = gem.CFrame
local carrier = nil

Players.PlayerAdded:Connect(function(player)
	local stats = Instance.new("Folder")
	stats.Name = "leaderstats"
	stats.Parent = player

	local score = Instance.new("IntValue")
	score.Name = "Score"
	score.Parent = stats

	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == nil then
			base:SetAttribute("Owner", player.UserId)
			base.Color = Color3.fromRGB(60, 220, 120)
			break
		end
	end
end)

Players.PlayerRemoving:Connect(function(player)
	for _, base in ipairs(bases:GetChildren()) do
		if base:GetAttribute("Owner") == player.UserId then
			base:SetAttribute("Owner", nil)
			base.Color = Color3.fromRGB(160, 160, 160)
		end
	end
end)

각 부분이 하는 일

  • 첫 줄들은 base와 gem을 찾고, gem이 처음 있던 자리를 기억해요.
  • SetAttribute는 비어 있는 첫 번째 base에 주인의 UserId를 적어 둬요.
  • PlayerRemoving은 주인이 나가면 base를 다시 비워 줘요.

더 자세히 보기

  • script는 새 탭에서 열려요. 코드 안을 클릭하고 Ctrl+A를 누른 다음 Ctrl+V를 눌러 전부 바꿔요.
  • 어느 base가 초록색으로 바뀌는지는 Folder 안에서 base가 놓인 순서에 따라 달라요. 돌아다니면서 내 base를 찾아봐요.
  • 오른쪽 위의 플레이어 목록에 Score 0이 나와요.
  • gem으로 걸어가서 E를 꾹 눌러도 아직은 아무 일도 일어나지 않아요. 그건 다음 단계에서 해요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

5
단계 5 / 8

플레이어가 gem을 가져가게 하기

  1. Game 스크립트를 다시 열어요.
  2. 지난 단계의 코드 아래에 이 코드를 붙여 넣어요.
  3. Play를 누르고 gem으로 걸어가서 E를 길게 눌러요. gem이 머리 위로 올라와서 나를 따라와요.
ServerScriptService > Game (2 / 3)
local function resetGem()
	carrier = nil

	local weld = gem:FindFirstChild("CarryWeld")
	if weld then
		weld:Destroy()
	end

	gem.Anchored = true
	gem.CFrame = home
	gem.ProximityPrompt.Enabled = true
end

gem.ProximityPrompt.Triggered:Connect(function(player)
	local character = player.Character
	local root = character and character:FindFirstChild("HumanoidRootPart")
	if carrier or not root then return end

	carrier = player
	gem.ProximityPrompt.Enabled = false
	gem.Anchored = false
	gem.CFrame = root.CFrame * CFrame.new(0, 4, 0)

	local weld = Instance.new("WeldConstraint")
	weld.Name = "CarryWeld"
	weld.Part0 = root
	weld.Part1 = gem
	weld.Parent = gem
end)

각 부분이 하는 일

  • carrier는 누가 gem을 들고 있는지 기억해요. 들고 있는 동안에는 다른 사람이 가져갈 수 없어요.
  • WeldConstraint는 gem을 플레이어에게 붙여서, 플레이어와 함께 움직이게 해요.
  • resetGem은 weld를 떼고 gem을 가운데로 돌려놓아요.

더 자세히 보기

  • script를 다시 열려면 Explorer에서 Game을 더블클릭해요.
  • 코드의 맨 마지막 글자 뒤를 클릭하고 Enter를 두 번 눌러요. 그다음 Ctrl+V를 눌러요. 이번에는 Ctrl+A를 누르지 마요. 누르면 앞부분이 바뀌어 버려요.
  • gem을 들고 있는 동안에는 머리 위 4 studs 높이에 떠 있어요.
  • 테스트하려면 gem을 집은 다음, 들고 있는 동안 Take 버튼이 사라지는지 확인해요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

6
단계 6 / 8

점수와 태그 넣기

  1. 이 마지막 부분을 Game 스크립트의 맨 끝에 붙여 넣어요.
  2. Play를 누르고, gem을 잡고, 내 초록색 base 위로 달려가요. Score가 1 올라가고 gem이 가운데로 돌아가요.
ServerScriptService > Game (3 / 3)
for _, base in ipairs(bases:GetChildren()) do
	base.Touched:Connect(function(hit)
		local player = Players:GetPlayerFromCharacter(hit.Parent)
		if player and player == carrier and base:GetAttribute("Owner") == player.UserId then
			player.leaderstats.Score.Value += 1
			resetGem()
		end
	end)
end

while true do
	task.wait(0.2)

	if carrier then
		local weld = gem:FindFirstChild("CarryWeld")
		local root = weld and weld.Part0
		local character = root and root.Parent
		local humanoid = character and character:FindFirstChildOfClass("Humanoid")

		if not humanoid or humanoid.Health <= 0 or root.Position.Y < -20 then
			resetGem()
		else
			for _, other in ipairs(Players:GetPlayers()) do
				local otherRoot = other ~= carrier and other.Character and other.Character:FindFirstChild("HumanoidRootPart")
				if otherRoot and (otherRoot.Position - root.Position).Magnitude < 5 then
					resetGem()
					break
				end
			end
		end
	end
end

각 부분이 하는 일

  • 각 base는 세 가지를 확인해요. 플레이어가 닿았는지, 그 플레이어가 gem을 들고 있는지, 그 base가 그 플레이어의 것인지예요.
  • 맨 아래의 반복문은 1초에 5번 실행돼요. 다른 플레이어가 gem을 든 사람에게 5 studs보다 가까이 오면, gem이 되돌아가요.
  • gem을 든 사람이 게임을 나가거나 맵 밖으로 떨어져도 반복문이 gem을 되돌려 놓아요.

더 자세히 보기

  • 이번에도 script의 맨 마지막 글자 뒤를 클릭하고 Enter를 두 번 누른 다음 붙여 넣어요.
  • 완성된 script는 세 부분이 이 순서로 있어요. base와 점수, gem 집기, 점수 얻기와 태그 붙이기예요.
  • 주인이 없는 회색 base는 점수를 주지 않아요. 내 초록색 base만 점수가 돼요.
  • 혼자서는 태그 붙이기를 테스트할 수 없어요. 다음 단계에서 플레이어 두 명으로 해 봐요.
자주 하는 실수. 이 부분을 스크립트 중간에 붙여 넣는 거예요. while 반복문은 끝나지 않아서, 그 아래에 있는 코드는 절대 실행되지 않아요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

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

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

7
단계 7 / 8

플레이어 두 명으로 테스트하기

  1. Play 버튼 옆의 작은 메뉴를 열고 Server & Clients를 골라요. 플레이어 수를 2로 하고 Play를 눌러요.
  2. Studio가 게임 창을 두 개 열어요. 각 창은 서로 다른 base를 가진 서로 다른 플레이어예요.
  3. 한 창에서 gem을 잡아요. 다른 창에서 그 플레이어에게 달려가요. gem이 가운데로 돌아가요.
  4. Studio 메인 창의 빨간 Stop 버튼으로 테스트를 멈추고, 메뉴를 다시 Test로 바꿔 놓아요.

더 자세히 보기

  • 작은 메뉴는 Studio 위쪽에 있는 Play 버튼 바로 옆의 화살표예요.
  • 게임 창 두 개가 겹쳐서 열려요. 하나를 옆으로 끌어서 둘 다 보이게 해요.
  • 키보드를 쓰기 전에 창 안을 클릭해요. 키보드 입력은 마지막으로 클릭한 창으로 가요.
  • 창 두 개로 테스트하려면 메모리가 충분한 컴퓨터가 필요해요. 너무 느리면 다른 프로그램을 먼저 닫아요.
이 단계가 잘 안 돼요

먼저 이 세 가지를 확인해요

  • 모든 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와 줄을 알려 줘요.

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

이제 직접 바꿔 봐요

  • 플레이어가 5점이 되면 라운드를 끝내고 모든 Score를 0으로 되돌려 봐요.
  • 다른 색의 두 번째 gem을 추가해 봐요.
  • gem을 든 사람이 느려지게 해 봐요. 힌트: gem을 잡을 때 Humanoid.WalkSpeed를 12로 하고, resetGem에서 다시 16으로 되돌려요.