Мини-проект: лазерный коридор
Лазеры наносят урон, контрольная точка сохраняет место появления.
Коридор из лазеров с безопасной контрольной точкой и задержкой между ударами.
1. Подготовьте объект
Где разместить: Несколько скриптов — смотрите инструкцию и отдельные блоки кода
Создайте Workspace → Folder LaserHall. Добавьте несколько красных Part с Anchored=true и CanTouch=true — это лазеры.
Создайте Part Checkpoint с Anchored=true, CanCollide=false, CanTouch=true и разместите его за лазерами.
В ServerScriptService добавьте Script LaserSystem и Script CheckpointSystem, вставьте соответствующие блоки кода.
В Play проверьте: лазер наносит урон, а после касания Checkpoint новое появление происходит возле точки.
Это пути для скриптов из блоков кода ниже. Остальные объекты создайте по инструкции.
└── ServerScriptService
├── LaserSystem (Script)
└── CheckpointSystem (Script)2. Вставьте код
local Players = game:GetService("Players")
local folder = workspace:WaitForChild("LaserHall")
local HIT_DAMAGE = 25
local HIT_COOLDOWN = 1
local lastHit = {} -- [humanoid] = time
local function attach(laser)
if not laser:IsA("BasePart") then return end
laser.Touched:Connect(function(hit)
local model = hit:FindFirstAncestorOfClass("Model")
local humanoid = model and model:FindFirstChildOfClass("Humanoid")
local player = model and Players:GetPlayerFromCharacter(model)
if not humanoid or not player or humanoid.Health <= 0 then return end
local now = os.clock()
if now - (lastHit[humanoid] or -math.huge) < HIT_COOLDOWN then return end
lastHit[humanoid] = now
humanoid:TakeDamage(HIT_DAMAGE)
end)
end
for _, laser in ipairs(folder:GetChildren()) do attach(laser) end
folder.ChildAdded:Connect(attach)
Players.PlayerRemoving:Connect(function(player)
if player.Character then
local hum = player.Character:FindFirstChildOfClass("Humanoid")
if hum then lastHit[hum] = nil end
end
end)local Players = game:GetService("Players")
local checkpoint = workspace:WaitForChild("Checkpoint")
local saved = {} -- checkpoint is for this server session
checkpoint.Touched:Connect(function(hit)
local model = hit:FindFirstAncestorOfClass("Model")
local player = model and Players:GetPlayerFromCharacter(model)
if player then saved[player] = checkpoint.CFrame + Vector3.new(0, 5, 0) end
end)
local function onPlayer(player)
player.CharacterAdded:Connect(function(character)
local root = character:WaitForChild("HumanoidRootPart", 10)
if root and saved[player] then
task.wait(0.1)
character:PivotTo(saved[player])
end
end)
end
Players.PlayerAdded:Connect(onPlayer)
for _, player in ipairs(Players:GetPlayers()) do onPlayer(player) end
Players.PlayerRemoving:Connect(function(player) saved[player] = nil end)3. Проверьте в игре
Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.
Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.
Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.
Измените урон лазера с 25 до 10.
Постройте три коридора с разной плотностью лазеров.
Сделайте лабораторию с тремя контрольными точками (потребуется расширить таблицу saved).
4. Проверьте себя
Зачем в лазерном коридоре нужна контрольная точка?
Оба Script должны быть в ServerScriptService. Folder LaserHall и Part Checkpoint находятся прямо в Workspace. Точки не сохраняются после выхода из игры.