Roblox · Тайкун · урок 8

Колесо фортуны и публикация

Клик по колесу — оно крутится несколько секунд и останавливается на случайном секторе; выигрыш падает в кассу. Игра публикуется.

Структура

Синим — что добавляем на этом уроке.

ServerStorage
└─ TycoonTemplate (Model)
   └─ Decoration_Items (Folder)
      └─ FortuneWheel (Model)
         ├─ Wheel (Part) — цилиндр, Anchored, Orientation 0, 0, 0
         │  ├─ Decal (Decal) — картинка секторов, Face = Right
         │  ├─ ClickDetector (ClickDetector)
         │  └─ FortuneWheel (Script)
         └─ Line (Part) — стрелка над колесом

Шаги

  1. Картинку секторов нарисуй (Figma) так, чтобы вверху по центру был сектор, а не граница. Загрузи в Roblox, id → Decal.Texture.
  2. Число секторов на картинке = числу значений в rewards; порядок — по кругу от верхнего.
  3. Цилиндр в Roblox лежит вдоль оси X: при Orientation 0, 0, 0 он стоит как колесо. Не поворачивай его — скрипт крутит вокруг X.
  4. Колесо — в Decoration_Items шаблона, тогда у каждого игрока своё.
  5. Публикация: скриншоты; Game Settings → Places (Max Players = платформам), Basic Info, Permissions → Public.

Скрипты

FortuneWheel

Где: … → FortuneWheel → Wheel · Script
Зачем: Крутит колесо всегда вперёд на несколько оборотов и кладёт выигрыш выпавшего сектора в кассу.

-- цилиндр колеса
local wheel = script.Parent
-- клик по колесу
local clicker = wheel:WaitForChild("ClickDetector")
-- плавная анимация
local TS = game:GetService("TweenService")
-- выигрыши по секторам, по кругу от верхнего
local rewards = {10, 2, 15, 5, 20, 7, 10, 5}
-- угол одного сектора
local sector = 360 / #rewards
-- колесо крутится?
local spinning = false
-- сколько градусов колесо уже повернулось за всё время
local turned = 0

-- кликнули по колесу
clicker.MouseClick:Connect(function(player)
    -- уже крутится — ждём
    if spinning then return end
    -- производство игрока
    local tycoon = workspace.Tycoons:FindFirstChild(player.Name)
    -- производства нет — выигрыш класть некуда
    if not tycoon then return end
    -- крутим
    spinning = true
    -- заранее выбираем выигрыш
    local rewardIndex = math.random(1, #rewards)
    -- угол этого сектора, не на границе
    local angle = (rewardIndex - 1) * sector + (math.random() - 0.5) * sector * 0.8
    -- вперёд на 3–8 оборотов и до нужного сектора
    local target = turned - turned % 360 + 360 * math.random(3, 8) + angle
    -- запоминаем, где остановится
    turned = target
    -- 3–6 секунд, к концу замедляется
    local tweenInfo = TweenInfo.new(math.random(3, 6), Enum.EasingStyle.Quint, Enum.EasingDirection.Out)
    -- поворот вокруг оси X
    local tween = TS:Create(wheel, tweenInfo, {Rotation = Vector3.new(target, 0, 0)})
    -- крутим
    tween:Play()
    -- ждём остановки
    tween.Completed:Wait()
    -- выигрыш — в кассу игрока
    tycoon.Values.Gain.Value += rewards[rewardIndex]
    -- можно крутить снова
    spinning = false
-- конец обработчика
end)

Проверка

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