Roblox · Усиления

Бонусы на карте

Светящиеся кубики на карте: пробежал сквозь — получил ускорение, прыжок, щит или лечение. Белый кубик даёт случайный бонус. Через 15 секунд кубик появляется снова.

Структура

Синим — что нужно создать.

Workspace
└─ PowerUps (Folder)
   └─ PowerUp (Part) — Neon, CanCollide выкл.; атрибут Kind: Speed / Jump / Shield / Heal (пусто — случайный)
      └─ PointLight (PointLight) — свечение
ServerScriptService
├─ WeaponEffects (ModuleScript) — общий модуль эффектов (версия с Heal и Boost)
└─ PowerUpsServer (Script)

Шаги

  1. Кубик: Part 2 × 2 × 2, Material Neon, CanCollide выкл., Anchored; повёрнут на ребро (Orientation 45, 45, 0) — сразу видно, что это бонус. Внутрь PointLight того же цвета.
  2. Вид бонуса — атрибут Kind (Properties → Attributes → «+», тип string): Speed, Jump, Shield или Heal. Без атрибута — случайный. Атрибут Respawn (number) — свой таймер возвращения.
  3. Workspace → Folder «PowerUps», кубики — туда. ServerScriptService → Script «PowerUpsServer».
  4. Скорость, прыжок и лечение идут через общий модуль WeaponEffects (страница «Эффекты оружия»): бонусы честно складываются с бегом и замедлением. Сборщик сам создаст или обновит модуль.

Скрипты

PowerUpsServer

Где: ServerScriptService · Script
Зачем: Выдаёт бонус при касании и возвращает кубик.

-- все игроки
local Players = game:GetService("Players")
-- удаление по таймеру
local Debris = game:GetService("Debris")
-- общий модуль эффектов
local Effects = require(game:GetService("ServerScriptService"):WaitForChild("WeaponEffects"))
-- бонусы на карте
local folder = workspace:WaitForChild("PowerUps")
-- через сколько секунд бонус появляется снова
local RESPAWN = 15
-- сколько секунд действует
local DURATION = 10
-- все виды — для случайного бонуса
local KINDS = {"Speed", "Jump", "Shield", "Heal"}

-- выдать бонус
local function Apply(humanoid, kind)
    -- скорость
    if kind == "Speed" then
        -- в 1,5 раза быстрее
        Effects.Boost(humanoid, "Speed", 1.5, DURATION)
    -- прыжок
    elseif kind == "Jump" then
        -- вдвое выше
        Effects.Boost(humanoid, "Jump", 2, DURATION)
    -- щит
    elseif kind == "Shield" then
        -- силовое поле
        local shield = Instance.new("ForceField")
        -- на персонажа
        shield.Parent = humanoid.Parent
        -- исчезнет само
        Debris:AddItem(shield, DURATION)
    -- лечение
    else
        -- +30 сразу и по 3 в секунду 5 секунд
        Effects.Heal(humanoid, 30, 3, 5)
    -- конец выбора
    end
-- конец функции
end

-- подключить бонус
local function Setup(part)
    -- бонус — одна деталь
    if not part:IsA("BasePart") then return end
    -- как он выглядит, когда виден
    local look = part.Transparency
    -- бонуса коснулись
    part.Touched:Connect(function(otherPart)
        -- уже взят
        if not part.CanTouch then return end
        -- это персонаж?
        local humanoid = otherPart.Parent:FindFirstChildOfClass("Humanoid")
        -- нет или мёртв
        if not humanoid or humanoid.Health <= 0 then return end
        -- только игроки
        if not Players:GetPlayerFromCharacter(otherPart.Parent) then return end
        -- второй раз не взять
        part.CanTouch = false
        -- исчезает
        part.Transparency = 1
        -- атрибут Kind — какой бонус; пусто — случайный
        Apply(humanoid, part:GetAttribute("Kind") or KINDS[math.random(#KINDS)])
        -- через несколько секунд
        task.delay(part:GetAttribute("Respawn") or RESPAWN, function()
            -- снова виден
            part.Transparency = look
            -- и берётся
            part.CanTouch = true
        -- конец отложенной функции
        end)
    -- конец обработчика
    end)
-- конец функции
end
-- бонусы, что уже стоят
for _, part in ipairs(folder:GetChildren()) do Setup(part) end
-- и новые
folder.ChildAdded:Connect(Setup)

Проверка

Запусти Play (или Run) и убедись:

Собрать бонусы одной командой