Trò chơi thường cần lưu trữ dữ liệu vĩnh viễn giữa các phiên, chẳng hạn như cấp độ của người chơi, điểm kinh nghiệm, tiền, vật phẩm kho hàng, vị trí và nhiều hơn nữa.
Hướng dẫn này cho thấy cách tạo một cửa hàng dữ liệu cơ bản , lưu dữ liệu người chơi và đọc lại dữ liệu vào phiên trò chơi.
Bật truy cập Studio
Mặc định, các trò chơi được kiểm tra trong Studio không thể truy cập các kho lưu trữ dữ liệu, vì vậy bạn phải bật chúng trước:
Xuất bản trải nghiệm.
Chọn Tập tin và Cài đặt trò chơi .
Trong phần Bảo mật , bật Bật truy cập Studio vào API Services và nhấn Lưu .
Tạo một kho lưu trữ dữ liệu
Các kho dữ liệu yêu cầu một tên duy nhất **** .Ví dụ này tạo một kho dữ liệu có tên là PlayerGold lưu vàng của mỗi người chơi trong kho lưu trữ vĩnh viễn:
Tạo một Script bên trong ServerScriptService được gọi là GoldManager .
Các kho dữ liệu được quản lý bởi DataStoreService, vì vậy hãy nhận dịch vụ:
local DataStoreService = game:GetService("DataStoreService")Gọi DataStoreService:GetDataStore() với chuỗi "PlayerGold".Phương thức này truy cập vào kho dữ liệu PlayerGold nếu nó đã tồn tại.Nếu không tồn tại, phương thức tạo một kho lưu trữ dữ liệu mới và đặt tên nó là PlayerGold .
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")
Lưu dữ liệu
Một kho lưu trữ dữ liệu về cơ bản là một từ điển, giống như một bảng Luau.Mỗi giá trị trong kho dữ liệu được lập chỉ mục bởi một chìa khóa duy nhất , có thể là chìa khóa độc đáo của người chơi hoặc chỉ đơn giản là một chuỗi có tên cho một chiến dịch quảng bá trò chơi
Key | Value |
---|---|
31250608 | 50 |
351675979 | 20 |
505306092 | 78000 |
Để lưu dữ liệu người chơi trong kho dữ liệu:
Tạo một biến có tên là playerUserID cho chìa khóa kho lưu trữ dữ liệu. Sau đó, sử dụng playerGold để lưu số vàng khởi động của người chơi.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Chìa khóa và giá trị của kho dữ liệulocal playerUserID = 505306092local playerGold = 250Để lưu dữ liệu vào kho lưu trữ dữ liệu PlayerGold, gọi SetAsync trong một cuộc gọi bảo mật, truyền các biến chìa khóa và giá trị đã tạo trước đó.
local DataStoreService = game:GetService("DataStoreService")local goldStore = DataStoreService:GetDataStore("PlayerGold")-- Chìa khóa và giá trị của kho dữ liệulocal playerUserID = 505306092local playerGold = 250-- Đặt mã kho lưu trữ dữ liệulocal success, error = pcall(function()goldStore:SetAsync(playerUserID, playerGold)end)if not success thenwarn(error)end
Các chức năng như SetAsync() là cuộc gọi mạng có thể thất bại thỉnh thoảng.Như được hiển thị ở trên, pcall() được sử dụng để phát hiện và xử lý khi các lỗi như vậy xảy ra
Trong hình thức cơ bản nhất, pcall() nhận một chức năng và trả về hai giá trị:
- Tình trạng, đó là true nếu chức năng được thực hiện mà không có lỗi, hoặc false nếu không.
- Giá trị trả về của chức năng hoặc một thông điệp lỗi
Mẫu trên kiểm tra trạng thái ở dòng 13. Nếu SetAsync() thất bại vì bất kỳ lý do gì, mẫu hiển thị lỗi trong cửa sổ Output.
Đọc dữ liệu
Để đọc dữ liệu từ một kho dữ liệu, gọi GetAsync() với tên chìa khóa mong muốn.
local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Chìa khóa và giá trị của kho dữ liệu
local playerUserID = 505306092
local playerGold = 250
-- Đặt mã kho lưu trữ dữ liệu
local setSuccess, errorMessage = pcall(function()
goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
warn(errorMessage)
end
-- Đọc khóa kho lưu trữ dữ liệu
local getSuccess, currentGold = pcall(function()
return goldStore:GetAsync(playerUserID)
end)
if getSuccess then
print(currentGold)
end
Để kiểm tra kịch bản, hãy nhấp vào Chạy và chú ý giá trị currentGold được in vào cửa sổ Xuất .Lưu ý rằng nó có thể mất vài giây, vì các chức năng phải kết nối với các máy chủ kho dữ liệu.
Đọc và lưu tự động
Tập lệnh trước đó hoạt động, nhưng có một vấn đề cốt lõi: nó bao gồm các giá trị được mã hóa cứng cho playerUserID và playerGold, do đó nó không hỗ trợ nhiều người chơi với số lượng vàng khác nhau.Một giải pháp thực tế hơn đọc giá trị vàng khi người chơi kết nối với trải nghiệm và sau đó lưu nó khi người chơi rời đi.Cách tiếp cận này có nghĩa là kết nối các cuộc gọi lưu trữ dữ liệu với sự kiện từ dịch vụ Players.
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local goldStore = DataStoreService:GetDataStore("PlayerGold")
-- Thêm giá trị vàng cho mỗi người chơi vào bảng địa phương để tránh đánh vào dữ liệu
-- lưu lại nhiều lần.
local playerGold = {}
local function incrementGold(player, amount)
playerGold[player.UserId] += amount
end
local function onPlayerAdded(player)
-- Đọc khóa kho lưu trữ dữ liệu
local success, storedGold = pcall(function()
return goldStore:GetAsync(player.UserId)
end)
if success then
local currentGold
if storedGold then
currentGold = storedGold
else
currentGold = 0
end
playerGold[player.UserId] = currentGold
print(currentGold)
end
-- Kiểm tra tăng dần vàng
incrementGold(player, 5)
end
local function onPlayerRemoving(player)
-- Đặt mã kho lưu trữ dữ liệu
local success, err = pcall(function()
goldStore:SetAsync(player.UserId, playerGold[player.UserId])
end)
if not success then
warn(err)
end
-- Làm sạch lối vào để bảng không phát triển trong suốt thời gian hoạt động của máy chủ
playerGold[player.UserId] = nil
end
Players.PlayerAdded:Connect(onPlayerAdded)
Players.PlayerRemoving:Connect(onPlayerRemoving)
Đọc và lưu vị trí nhân vật
Để lưu vị trí người chơi, bạn làm việc với Character thay vì Player, nhưng nguyên tắc tương tự.Lần này, tạo một Script trong ServerScriptService được gọi là Quản lý vị trí :
local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local Workspace = game:GetService("Workspace")
local playerPositionStore = DataStoreService:GetDataStore("PlayerPositionStore")
local function positionHandler(player)
-- Xác định vị trí khi thêm nhân vật
player.CharacterAdded:Connect(function(character)
local success, coords = pcall(function()
return playerPositionStore:GetAsync(player.UserId)
end)
local position = Vector3.new(coords[1], coords[2], coords[3])
if success and position then
character:PivotTo(CFrame.new(position))
print("Loaded player position!")
else
warn("Failed to load position for player " .. player.Name .. ". Placing in default position.")
end
-- Xử lý người chơi hồi sinh sau khi chết
local humanoid = character:FindFirstChildOfClass("Humanoid")
humanoid.Died:Connect(function()
local spawnLocation = Workspace:FindFirstChild("SpawnLocation")
character:PivotTo(spawnLocation.CFrame)
end)
end)
-- Lưu vị trí khi xóa nhân vật
player.CharacterRemoving:Connect(function(character)
local position = character:GetPivot().Position
local success, err = pcall(function()
playerPositionStore:SetAsync(player.UserId, {position.X, position.Y, position.Z})
print("Saved player position!")
end)
if not success then
warn("Failed to save position for player " .. player.Name .. ": " .. err)
end
end)
end
Players.PlayerAdded:Connect(positionHandler)
Tập lệnh này thêm một kho lưu trữ dữ liệu mới, playerPositionStore .Bởi vì các kho dữ liệu chỉ lưu các loại cơ bản thay vì các đối tượng, bạn phải lưu X, Y và Z là các số cụ thể thay vì một giá trị duy nhất Vector3 hoặc CFrame .Khi bạn thử nghiệm trải nghiệm của mình, di chuyển nhân vật của bạn xung quanhLưu ý cách nhân vật của bạn quay trở lại vị trí tương tự lần tiếp theo bạn kiểm tra trải nghiệm của mình.
Dự án mẫu
Bây giờ bạn đã hiểu được cách sử dụng cơ sở dữ liệu cơ bản, hãy kiểm tra nó trong trò chơi Gold Rush mẫu.Bạn cũng có thể chỉnh sửa trò chơi trong Studio và khám phá kịch bản GoldManager nâng cấp, hiển thị vàng như một phần của giao diện người dùng và bao gồm việc lưu tự động