← Все практические скрипты
Игровые системы · Продвинутый · 35 мин

Случайные усиления без конфликтов

Одна площадка случайно даёт скорость, прыжок или уменьшение на 12 секунд.

Иллюстрация: Случайные усиления без конфликтов
🎯 Что получится

Площадка случайно выбирает один из трёх бонусов, не сбрасывая другие эффекты.

1. Подготовьте объект

Где разместить: ServerScriptService: StatsController и MysteryPadServer; Workspace: MysteryPad (Part).

Структура в Explorer
ServerScriptService
  StatsController (ModuleScript из практики 91)
  MysteryPadServer (Script)
Workspace
  MysteryPad (Part)
  1. Установите StatsController из практики 91.
  2. В Workspace создайте Anchored Part MysteryPad. Включите CanTouch.
  3. В ServerScriptService создайте Script MysteryPadServer и вставьте код.
  4. Запустите Play, наступите на платформу несколько раз с паузами. Выпадет случайное усиление.
  5. Для изменения размера требуется R15. На R6 бонус уменьшения не изменит масштаб.
  6. Проверьте, что бонусы SpeedPad и MysteryPad действуют вместе и истекают независимо.
  7. Для двух игроков эффекты должны выпадать независимо.

2. Вставьте код

Script + ModuleScript из практики 91
-- Script: ServerScriptService/MysteryPadServer
local Players = game:GetService("Players")
local Controller = require(script.Parent:WaitForChild("StatsController"))
local pad = workspace:WaitForChild("MysteryPad")
local rng = Random.new()
local lastTouch = {}
local choices = {
    {name = "Скорость", effect = {speed = 1.6}},
    {name = "Прыжок", effect = {jump = 1.7}},
    {name = "Уменьшение", effect = {size = 0.7}},
}

pad.Touched:Connect(function(hit)
    local character = hit:FindFirstAncestorOfClass("Model")
    local player = character and Players:GetPlayerFromCharacter(character)
    local humanoid = character and character:FindFirstChildOfClass("Humanoid")
    if not player or not humanoid or humanoid.Health <= 0 then return end
    local now = os.clock()
    if now - (lastTouch[player] or -100) < 3 then return end
    lastTouch[player] = now
    local choice = choices[rng:NextInteger(1, #choices)]
    if Controller.Apply(player, "MysteryPad", choice.effect, 12) then
        print(player.Name .. ": бонус " .. choice.name)
    end
end)
Players.PlayerRemoving:Connect(function(player)
    lastTouch[player] = nil
end)

3. Проверьте в игре

Нажмите Play в Roblox Studio и проверьте действие механики. Если механика не работает, откройте окно Output и проверьте тип скрипта, его расположение и названия объектов.

Ваш прогресс

Когда проверите механику в Roblox Studio, отметьте практику как выполненную. Отметка хранится только в этом браузере, не в личном кабинете.

Если объединяете несколько скриптов

Добавляйте механики по одной и проверяйте окно Output. Не создавайте несколько одинаковых систем монет или интерфейсов; скрипты, меняющие WalkSpeed, прыжок или освещение, могут влиять друг на друга.

⭐ Три шага к собственной игре
1. Повторите и измените

Измените длительность бонуса на 20 секунд.

2. Улучшите

Добавьте четвёртый бонус «Замедление».

3. Придумайте своё

Создайте лабиринт с тремя случайными площадками и контрольной точкой.

4. Проверьте себя

Почему у случайного бонуса отдельное имя эффекта MysteryPad?

🛠 Если не работает

Проверьте точные имена MysteryPad и StatsController. Если размер не меняется, используйте R15. Для многократного касания есть задержка 3 секунды. Вывод результата — в Output сервера.