保存数据:简介

Time:5 分钟

DataStoreService 保存在游戏进程之间保留的数据,例如玩家的金钱、经验值或物品栏中的道具等等。保存的数据可从游戏中的任何场景访问,也可跨服务器访问。

启用 Studio 访问

默认情况下,在 Studio 中测试的游戏无法访问数据存储,所以您必须手动启用

  1. 在 **Home(主页)**选项卡中,打开 **Game Settings(游戏设置)**窗口。如果您的游戏尚未发布,您将被询问是否发布。 https://developer.roblox.com/assets/bltd6af44e38b951d0a/Game-Settings.png

  2. 在 **Security(安全)**部分,打开 Enable Studio Access to API Services(启用 Studio 访问 API 服务).

  3. 点击 **Save(保存)**来注册您的变更。

如果游戏已上线且有活跃玩家,通过 Studio 访问数据存储时请谨慎。Studio 访问与上线的游戏相同的数据,所以建议您在独立的测试版本中访问数据存储。

访问数据存储

数据存储最初通过一个独特的名称创建并访问。例如,一个名为 PlayerGold 的数据存储可以在游戏进程中与进程之间存储玩家的金钱。

  1. 在名为 DataStoreTestServerScriptService 内创建一个新的 Scripthttps://developer.roblox.com/assets/blta132586c9ea9dcc4/DataStoreTest-Object.png

  2. 数据存储通过 DataStoreService 进行管理,所以请在第一行获取服务。

访问数据存储 ```

local DataStoreService = game:GetService("DataStoreService")
  3. 用 `"PlayerGold"` 字符串调用 `DataStoreService/GetDataStore|DataStoreService:GetDataStore()`。如果已存在,这将访问 **PlayerGold** 数据存储,否则将新建。

访问数据存储 ```    
    
    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")

数据排序 »

Data returned by DataStoreService/GetDataStore|GetDataStore() is not sorted. This isn’t a concern when reading specific individual keys, but sorted data fetched via DataStoreService/GetOrderedDataStore|GetOrderedDataStore() is essential for user interfaces like persistent leaderboards.

保存数据

数据存储本质上是字典,就像 Lua 表。数据存储中的每个都由一个独特的索引,例如玩家的独特 Player/UserId|UserId 或一个命名的字符串。

玩家数据 游戏数据

Key Value

31250608 50

351675979 20

505306092 78000

Key Value

ActiveSpecialEvent SummerParty2

ActivePromoCode BONUS123

CanAccessPartyPlace true

要将数据保存进 PlayerGold 数据存储,请用键和一个值调用 GlobalDataStore/SetAsync|SetAsync()

保存至数据存储 ```

local DataStoreService = game:GetService("DataStoreService")
local goldStore = DataStoreService:GetDataStore("PlayerGold")

-- 数据存储键和值
local playerUserID = 505306092
local playerGold = 250

-- 设置数据存储键
local setSuccess, errorMessage = pcall(function()
	goldStore:SetAsync(playerUserID, playerGold)
end)
if not setSuccess then
	warn(errorMessage)
end
类似`GlobalDataStore/SetAsync|SetAsync()`这种访问数据存储内容的函数是网络调用,并且有时可能会失败。如上图所示,您应当将这些调用打包在`pcall()`中以捕获和处理错误。关于错误处理的详情,请参见`articles/Datastore Errors|此文`。 

对数据存储键的请求置于队列中。如果短时间内有对同一个键的大量请求,队列可能会爆满,使后续的请求被丢弃。所以与其在玩家每次拾取金钱时更新,不如将玩家的金钱存在一个表中并偶尔更新数据存储,例如当玩家离开时(`Players/PlayerRemoving|Players.PlayerRemoving`事件)。

## 读取数据

要从数据存储中读取数据,请用需要的键名称调用 `GlobalDataStore/GetAsync|GetAsync()`:

从数据存储中读取 ```    
    
    local DataStoreService = game:GetService("DataStoreService")
    local goldStore = DataStoreService:GetDataStore("PlayerGold")
    
    -- 数据存储键和值
    local playerUserID = 505306092
    local playerGold = 250
    
    -- 设置数据存储键
    local setSuccess, errorMessage = pcall(function()
    	goldStore:SetAsync(playerUserID, playerGold)
    end)
    if not setSuccess then
    	warn(errorMessage)
    end
    
    -- 读取数据存储键
    local getSuccess, currentGold = pcall(function()
    	return goldStore:GetAsync(playerUserID)
    end)
    if getSuccess then
    	print(currentGold)
    end

测试

当您完成脚本后,便可测试 PlayerGold 数据存储。

  1. 点击 **Run(运行)**按钮。 https://developer.roblox.com/assets/blt806e39d14fd0bf40/Play-Button-Upper.png

  2. 如果一切正确,playerGold 值应该会在 **Output(输出)**窗口中打印出来。注意这可能需要几秒钟的时间,因为函数必须连接至数据存储服务器。 https://developer.roblox.com/assets/blt3e151e0aec8a4260/DataStoreTest-Output.png

示例场景

现在您已掌握了数据存储的基本用法,请在示例场景中测试一下。

https://developer.roblox.com/assets/blt377b3c22f1e549a2/Sample-Place-Gold-Rush.jpg

淘金热

尽可能多地收集金块,您的个人最佳纪录将在游戏进程之间保存。

***Roblox官方链接:保存数据:简介