Roblox · Интерфейсы

Табличка над игроком: ник, уровень, ранг

Над каждым игроком — ник, уровень из таблицы по Tab и ранг: «Игрок», «VIP», «Админ». Уровень обновляется сам.

Структура

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

ReplicatedStorage
└─ Overhead (BillboardGui) — шаблон: Size {5,0},{1.6,0}, StudsOffset 0, 2.8, 0
   ├─ RankLabel (TextLabel) — ранг, золотой
   ├─ NameLabel (TextLabel) — ник
   └─ LevelLabel (TextLabel) — уровень, голубой
ServerScriptService
├─ OverheadServer (Script)
└─ LevelDemo (Script) — уровень для проверки (по желанию)

Шаги

  1. ReplicatedStorage → BillboardGui «Overhead»: Size {5,0},{1.6,0} (в studs), StudsOffset 0, 2.8, 0, MaxDistance 80, LightInfluence 0. Внутри три TextLabel сверху вниз: «RankLabel», «NameLabel», «LevelLabel».
  2. ServerScriptService → Script «OverheadServer»: табличку вешает сервер — её видят все игроки.
  3. Ранг: таблица RANKS (UserId → название) или атрибут «Rank» у игрока, иначе «Игрок». Свой UserId — в адресе профиля Roblox.
  4. Уровень берётся из leaderstats → Level. Нет уровня в игре — строка пустая.
  5. PlayerToHideFrom: свою табличку игрок не видит. Хочешь видеть — HIDE_OWN = false.
  6. Для проверки — «LevelDemo»: создаёт Level = 1 и прибавляет 1 каждые 20 секунд.

Скрипты

OverheadServer

Где: ServerScriptService · Script
Зачем: Табличка над каждым игроком.

-- игроки
local Players = game:GetService("Players")
-- шаблон таблички
local RS = game:GetService("ReplicatedStorage")
-- BillboardGui
local template = RS:WaitForChild("Overhead")
-- особые ранги: UserId → название
local RANKS = {
    -- впиши свой UserId (create.roblox.com или профиль)
    -- [123456789] = "Админ",
-- конец таблицы
}
-- ранг остальных
local DEFAULT_RANK = "Игрок"
-- свою табличку игрок не видит — не мешает смотреть
local HIDE_OWN = true

-- табличка новому персонажу
local function Setup(player, character)
    -- голова
    local head = character:WaitForChild("Head")
    -- прячем стандартное имя
    character:WaitForChild("Humanoid").DisplayDistanceType = Enum.HumanoidDisplayDistanceType.None
    -- копия шаблона
    local gui = template:Clone()
    -- над головой
    gui.Adornee = head
    -- хозяину не показываем
    if HIDE_OWN then gui.PlayerToHideFrom = player end
    -- ник
    gui.NameLabel.Text = player.DisplayName
    -- ранг: из таблицы, из атрибута Rank или обычный
    gui.RankLabel.Text = RANKS[player.UserId] or player:GetAttribute("Rank") or DEFAULT_RANK
    -- таблица игрока (ждём до 5 секунд)
    local stats = player:WaitForChild("leaderstats", 5)
    -- уровень, если есть
    local level = stats and stats:WaitForChild("Level", 2)
    -- обновить уровень
    local function UpdateLevel()
        -- «Ур. 5» или пусто
        gui.LevelLabel.Text = level and ("Ур. " .. level.Value) or ""
    -- конец функции
    end
    -- сразу
    UpdateLevel()
    -- уровень есть
    if level then
        -- уровень вырос — обновляем
        local connection = level.Changed:Connect(UpdateLevel)
        -- персонаж удалён — отписываемся
        gui.Destroying:Connect(function() connection:Disconnect() end)
    -- конец проверки
    end
    -- табличка на месте
    gui.Parent = head
-- конец функции
end

-- игрок зашёл
local function OnPlayer(player)
    -- каждое появление
    player.CharacterAdded:Connect(function(character) Setup(player, character) end)
    -- персонаж уже есть
    if player.Character then task.spawn(Setup, player, player.Character) end
-- конец функции
end
-- новые игроки
Players.PlayerAdded:Connect(OnPlayer)
-- кто зашёл раньше скрипта
for _, player in ipairs(Players:GetPlayers()) do OnPlayer(player) end

LevelDemo

Где: ServerScriptService · Script
Зачем: Уровень для проверки.

-- игроки
local Players = game:GetService("Players")

-- игрок зашёл
Players.PlayerAdded:Connect(function(player)
    -- таблица по Tab
    local stats = player:FindFirstChild("leaderstats") or Instance.new("Folder")
    -- имя строго такое
    stats.Name = "leaderstats"
    -- в игрока
    stats.Parent = player
    -- уровень
    local level = Instance.new("IntValue")
    -- имя — его ищет табличка
    level.Name = "Level"
    -- первый
    level.Value = 1
    -- в таблицу
    level.Parent = stats
    -- пока игрок в игре
    while player.Parent do
        -- каждые 20 секунд
        task.wait(20)
        -- уровень растёт — для проверки
        level.Value += 1
    -- конец цикла
    end
-- конец функции
end)

Проверка

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

Собрать табличку одной командой