Каждый геймер мечтает чувствовать себя уникальным и ценным участником игрового мира. Одной из популярных техник привлечения внимания игроков является введение статистики прогресса, позволяющей отслеживать их успехи и достижения. В сегодняшней статье мы поговорим о создании интересной метрики — измерении пройденного игроком пути в Roblox Studio.
Предлагаемые ниже скрипты позволят вам сохранить расстояние, пройденное каждым игроком индивидуально, отобразить это значение на интерфейсе пользователя и включить дополнительную мотивацию в виде изменений скорости ходьбы героя по мере прохождения дистанции.
Часть первая: Серверный скрипт
Серверный скрипт занимается сохранением пройденного расстояния каждого игрока, подсчетом пройденных метров и изменением скорости передвижения героя в зависимости от достигнутых результатов.
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local DataStoreService = game:GetService("DataStoreService")
local UpdatePlayerDistance = ReplicatedStorage:WaitForChild("UpdatePlayerDistance")
local distanceStore = DataStoreService:GetDataStore("PlayerDistanceStore")
local playerDistances = {} -- Таблица расстояний игроков
-- Функция загрузки данных расстояния игрока
local function loadPlayerDistance(userId)
local success, result = pcall(function()
return distanceStore:GetAsync(tostring(userId)) -- загружаем данные из хранилища
end)
if success and result then
return result
else return 0 -- Возвращаем ноль, если ничего не найдено
end
end
-- Сохранение данных расстояния игрока
local function savePlayerDistance(userId, distance)
pcall(function()
distanceStore:SetAsync(tostring(userId), distance) -- записываем данные обратно в хранилище
end)
end
-- Обработчик события добавления персонажа игрока
local function onCharacterAdded(player, character)
local humanoid = character:FindFirstChildOfClass("Humanoid")
if not humanoid then return end
local lastPosition = character:GetPivot().Position -- сохранение последней позиции
local userId = player.UserId
playerDistances[userId] = playerDistances[userId] or loadPlayerDistance(userId) -- получаем дистанцию или грузим нулевую
-- Мониторинг перемещения игрока
humanoid.Running:Connect(function(speed)
local currentPosition = character:GetPivot().Position
local distance = (currentPosition - lastPosition).Magnitude -- вычисляем пройденный путь
if distance > 0 then
playerDistances[userId] = playerDistances[userId] + distance -- увеличиваем общее расстояние
lastPosition = currentPosition -- обновляем последнюю позицию
-- Логика изменения скорости
if playerDistances[userId] >= 150 then
humanoid.WalkSpeed = 50
elseif playerDistances[userId] >= 100 then
humanoid.WalkSpeed = 40
elseif playerDistances[userId] >= 50 then
humanoid.WalkSpeed = 20
else
humanoid.WalkSpeed = 16
end
-- Отправляем обновление интерфейсу клиента
UpdatePlayerDistance:FireClient(player, math.floor(playerDistances[userId]))
end
end)
end
-- Обработчики подключения и отключения игроков
Players.PlayerAdded:Connect(function(player)
local userId = player.UserId
playerDistances[userId] = loadPlayerDistance(userId)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(player, character)
end)
end)
for _, player in Players:GetPlayers() do
local userId = player.UserId
playerDistances[userId] = loadPlayerDistance(userId)
player.CharacterAdded:Connect(function(character)
onCharacterAdded(player, character)
end)
end
Players.PlayerRemoving:Connect(function(player)
local userId = player.UserId
local distance = playerDistances[userId]
if distance then
savePlayerDistance(userId, distance)
end
playerDistances[userId] = nil
end)
Комментарии к серверному скрипту:
- loadPlayerDistance: Загружает данные о расстоянии конкретного игрока из базы данных Cloud DataStores.
- savePlayerDistance: Сохраняет обновленные данные о пройденном расстоянии игрока.
- onCharacterAdded: Функция, обрабатывающая появление персонажа игрока в игре, включая расчет пройденного расстояния и отправку обновлений клиенту.
- Блоки условных операторов определяют, какую скорость присвоить герою игрока исходя из пройденного расстояния.
Часть вторая: Клиентский скрипт
Клиентская часть занимается созданием интерфейса, отображающим пройденное игроком расстояние, и своевременным обновлением этих данных на клиентской стороне.
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local UpdatePlayerDistance = ReplicatedStorage:WaitForChild("UpdatePlayerDistance")
local GetPlayerDistance = ReplicatedStorage:WaitForChild("GetPlayerDistance")
local StarterGui = game:GetService("StarterGui")
-- Создание интерфейса
local screenGui = Instance.new("ScreenGui")
screenGui.Name = "DistanceGui"
screenGui.ResetOnSpawn = false
local textLabel = Instance.new("TextLabel")
textLabel.Name = "DistanceLabel"
textLabel.Size = UDim2.new(0, 300, 0, 50)
textLabel.Position = UDim2.new(0, 10, 0, 10)
textLabel.BackgroundTransparency = 0.5
textLabel.BackgroundColor3 = Color3.new(0, 0, 0)
textLabel.TextColor3 = Color3.new(1, 1, 1)
textLabel.Font = Enum.Font.SourceSansBold
textLabel.TextSize = 32
textLabel.Text = "Расстояние: 0"
textLabel.Parent = screenGui
screenGui.Parent = game.Players.LocalPlayer:WaitForChild("PlayerGui")
-- Синхронизация расстояния при первом открытии интерфейса
local success, distance = pcall(function()
return GetPlayerDistance:InvokeServer()
end)
if success and distance then
textLabel.Text = "Расстояние: " .. tostring(distance)
end
-- Обновление интерфейса при изменении расстояния
UpdatePlayerDistance.OnClientEvent:Connect(function(distance)
textLabel.Text = "Расстояние: " .. tostring(distance)
end)
Комментарии к клиентскому скрипту:
- Интерфейс (ScreenGui и TextLabel) создается автоматически при входе игрока в игру.
- Данные расстояния запрашиваются и синхронизируются при старте игры.
- Каждый раз, когда изменяется расстояние, данные обновляются на клиентской стороне благодаря репликации через Remote Events.
Важно!
Не забудьте добавить в ReplicatedStorage Events с названиями:
- GetPlayerDistance
- UpdatePlayerDistance
Заключение
Данный материал позволит вам создать интересную механику измерения пройденного пути, сохранив прогресс каждого игрока отдельно и мотивируя их проходить большие расстояния в вашей игре. Игроки оценят уникальные преимущества, предоставляемые системой учета пробега, а сами разработчики смогут внести свежесть и разнообразие в свое творчество.