Menu
CoddyTech

회전 장애물

Coddy의 Roblox 게임: 끝없는 타워 코스 레슨. 18개 중 5번째.

Spinner 스테이지에는 통로를 가로질러 움직이는 빨간 팔이 있습니다. 이것은 Model이며, Spinner 태그가 지정되어 있고, 피벗은 허브입니다. 매 프레임 Model 전체를 조금씩 회전시키면 빙글빙글 돕니다.

RunService.Heartbeat는 매 프레임 한 번 발생하며 dt를 전달합니다. dt는 마지막 프레임 이후 경과한 시간(초)으로, 약 1/60초입니다. 매 프레임 speed * dt만큼 회전하면 게임이 얼마나 빠르게 실행되든 1초마다 총 speed만큼 회전하게 됩니다.

CFrame은 위치와 회전을 합친 것입니다. CFrame.Angles를 곱하면 회전하며, 각도는 라디안 단위이므로 math.rad를 사용해 도를 변환합니다:

spinner:PivotTo(spinner:GetPivot() * CFrame.Angles(0, math.rad(90) * dt, 0))

CollectionService:GetTagged("Spinner")는 ServerStorage의 템플릿을 포함해 해당 태그가 지정된 모든 항목을 나열하므로, workspace에 있는 항목만 회전시키세요. 팔에는 Kill 태그가 지정되어 있어 이미 생명을 잃게 합니다. 이 레슨에서는 모든 스테이지가 Spinner입니다.

challenge icon

챌린지

중급
  1. 상단 부근에서 game:GetService를 사용해 CollectionService와 RunService를 가져옵니다.
  2. RunService.Heartbeat를 연결합니다. 매 프레임마다, 워크스페이스에 있는 Spinner 태그가 지정된 모든 Model을 CFrame.Angles(0, math.rad(Settings.SpinSpeed) * dt, 0)만큼 피벗합니다.

Play를 눌러 팔을 지나갈 타이밍을 맞추거나, 점프해서 넘으세요. 그런 다음 Check를 누르세요.

직접 해보기

local Players = game:GetService("Players")
local ServerStorage = game:GetService("ServerStorage")
local Settings = require(game.ReplicatedStorage.Settings)

local stages = ServerStorage.Stages
local tower = nil

print("Each tower has " .. Settings.StageCount .. " stages")

-- 모든 플레이어의 leaderboard에 Wins가 추가됩니다
Players.PlayerAdded:Connect(function(player)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player

	local wins = Instance.new("IntValue")
	wins.Name = "Wins"
	wins.Parent = leaderstats
end)

-- Kill 태그가 붙은 물체에 닿으면 생명을 잃습니다
local function killOnTouch(hit)
	local humanoid = hit.Parent:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Health = 0
	end
end

-- 태그에 따라 stage의 모든 장애물을 활성화합니다
local function setupStage(stage)
	for _, part in stage:GetDescendants() do
		if part:HasTag("Kill") then
			part.Touched:Connect(killOnTouch)
		end
	end
end

-- stage를 무작위로 하나 선택합니다
local function pickStage()
	local all = stages:GetChildren()
	return all[math.random(1, #all)]
end

-- model의 복사본을 tower 위에 쌓고, 복사본과 새로운 꼭대기 높이를 반환합니다
local function stack(template, bottom)
	local copy = template:Clone()
	local box, size = copy:GetBoundingBox()
	local lift = bottom - (box.Position.Y - size.Y / 2)
	copy:PivotTo(copy:GetPivot() + Vector3.new(0, lift, 0))
	copy.Parent = tower
	return copy, bottom + size.Y
end

-- 아래에서 위로 새로운 무작위 tower를 만듭니다
local function buildTower()
	tower = Instance.new("Model")
	tower.Name = "Tower"
	tower.Parent = workspace
	local top = 0
	for i = 1, Settings.StageCount do
		local stage, newTop = stack(pickStage(), top)
		top = newTop
		setupStage(stage)
	end
	stack(ServerStorage.Finish, top)
end

buildTower()
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

Roblox 게임: 끝없는 타워의 모든 레슨