회전 장애물
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입니다.
챌린지
중급- 상단 부근에서
game:GetService를 사용해CollectionService와RunService를 가져옵니다. 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()
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.