首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Roblox-如何在roblox数据存储中存储大型数组

Roblox-如何在roblox数据存储中存储大型数组
EN

Stack Overflow用户
提问于 2018-09-24 11:19:44
回答 3查看 2.4K关注 0票数 1

我试图做一个游戏,玩家创造自己的建筑,然后可以保存他们为其他玩家看到和发挥。但是,roblox不允许我存储整个创建所需的所有数据(每个块都有几个属性),我得到的全部错误代码是: 104:无法在DataStore中存储数组

任何帮助都将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-25 02:19:46

我不确定这是不是最好的方法,但这是我的尝试。下面是一个表的示例,您可以使用表来存储多个值。我认为您可以使用HttpService的JSONEncode函数将表转换为字符串(希望能够更有效地保存)。

JSONEncode (将布里克的数据放入字符串中,您可以将其保存到DataStore

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local HttpService = game:GetService("HttpService")

-- this is an example of what we'll convert into a json string
local exampleBrick = {
    ["Size"] = Vector3.new(3,3,3),
    ["Position"] = Vector3.new(0,1.5,0),
    ["BrickColor"] = BrickColor.new("White")
    ["Material"] = "Concrete"
}

local brickJSON = HttpService:JSONEncode(exampleBrick)
print(brickJSON)

-- when printed, you'll get something like
-- { "Size": Vector3.new(3,3,3), "Position": Vector3.new(0,1.5,0), "BrickColor": BrickColor.new("White"), "Material": "Concrete"}
-- if you want to refer to this string in a script, surround it with two square brackets ([[) e.g. [[{"Size": Vector3.new(3,3,3)... }]]

JSONDecode (读取字符串并将其转换回砖块)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local HttpService = game:GetService("HttpService")
local brickJSON = [[ {"Size": Vector3.new(3,3,3), "Position": Vector3.new(0,1.5,0), "BrickColor": BrickColor.new("White"), "Material": "Concrete"} ]]

function createBrick(tab)
    local brick = Instance.new("Part")
    brick.Parent = <insert parent here>
    brick.Size = tab[1]
    brick.Position= tab[2]
    brick.BrickColor= tab[3]
    brick.Material= tab[4]
end

local brickData = HttpService:JSONDecode(brickJSON)
createBrick(brickData) --this line actually spawns the brick

如果您想要解释任何可能的数据存储错误,也可以将该函数包装在pcall中。

将整个模型编码为字符串

如果你的玩家的“建筑”是一个模型,你可以使用上面的代码脚本将模型中的所有部分转换成一个json字符串来保存。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local HttpService = game:GetService("HttpService")
local StuffWeWantToSave = {}

function getPartData(part)
    return( {part.Size,part.Position,part.BrickColor,part.Material} )
end

local model = workspace.Building --change this to what the model is
local modelTable = model:Descendants()
for i,v in pairs(modelTable) do
    if v:IsA("Part") or v:IsA("WedgePart") then
        table.insert(StuffWeWantToSave, HttpService:JSONEncode(getPartData(modelTable[v])))
    end
end

将字符串解码为一个完整的模型

当服务器加载播放机的数据时,可能会发生这种情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local HttpService = game:GetService("HttpService")
local SavedStuff = game:GetService("DataStoreService"):GetDataStore("blabla") --I don't know how you save your data, so you'll need to adjust this and the rest of the scripts (as long as you've saved the string somewhere in the player's DataStore)

function createBrick(tab)
    local brick = Instance.new("Part")
    brick.Parent = <insert parent here>
    brick.Size = tab[1]
    brick.Position= tab[2]
    brick.BrickColor= tab[3]
    brick.Material= tab[4]
end

local model = Instance.new("Model") --if you already have 'bases' for the players to load their stuff in, remove this instance.new
model.Parent = workspace

for i,v in pairs(SavedStuff) do
    if v[1] ~= nil then
        CreateBrick(v)
    end
end

FilteringEnabled

如果您的游戏使用过滤启用,请确保只有服务器处理保存和加载数据!!(您可能已经知道了)如果您希望播放器通过单击gui按钮进行保存,则将gui按钮设置为一个RemoteFunction,该将其基数据发送到服务器,并将其转换为字符串。

顺便说一句,我不太擅长编写脚本,所以我可能犯了一个错误。祝你好运

票数 2
EN

Stack Overflow用户

发布于 2019-06-15 21:25:49

克拉布韦的回答是正确的,因为HttpServiceJSONEncodeJSONDecode方法是解决这个问题的方法。正如它在DataStoreServiceData is ... saved as a string in data stores, regardless of its initial type. (https://developer.roblox.com/articles/Datastore-Errors)的开发人员参考页面上说的那样,这解释了您收到的错误,因为您不能简单地将表推送到数据存储区;相反,您必须首先使用JSONEncode将表的数据编码为字符串。

虽然我同意Crabway的大部分答案,但我相信函数createBrick的行为不会像预期的那样。考虑以下简单的示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
httpService = game:GetService("HttpService")
t = {
    hello = 1,
    goodbye = 2
}

s = httpService:JSONEncode(t)
print(s)
> {"goodbye":2,"hello":1}

u = httpService:JSONDecode(s)
for k, v in pairs(u) do print(k, v) end
> hello 1
> goodbye 2

如您所见,JSONDecode返回的表与原始表一样,使用字符串作为键而不是数字索引。因此,createBrick应该编写如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function createBrick(t)
    local brick = Instance.new("Part")
    brick.Size = t.Size
    brick.Position = t.Position
    brick.BrickColor = t.BrickColor
    brick.Material = t.Material
    -- FIXME: set any other necessary properties.
    -- NOTE: try to set parent last for optimization reasons.
    brick.Parent = t.Parent
    return brick
end

至于对模型进行编码,调用GetChildren将生成模型的子表,然后您可以循环遍历该表,并对模型中的所有属性进行编码。请注意,在Crabway的回答中,他只说明了Parts和WedgeParts。您应该说明使用object:IsA("BasePart")的所有部分,并检查是否与object:IsA("UnionOperation")合并。下面是一个非常基本的示例,在这个示例中,我不存储编码的数据;相反,我只是试图展示如何检查所需的情况。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function encodeModel(model)
    local children = model:GetChildren()
    for _, child in ipairs(children) do
        if ((child:IsA("BasePart")) or (child:IsA("UnionOperation"))) then
            -- FIXME: encode child
        else if (child:IsA("Model")) then
            -- FIXME: using recursion, loop through the sub-model's children.
        end
    end
    return
end

对于userdata (如Vector3s或BrickColors ),当您使用JSONEncode对它们进行编码时,您可能希望将这些字符串转换为字符串。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- Example: part with "Brick red" BrickColor.
color = tostring(part.BrickColor)
print(string.format("%q", color))
> "Bright red"
票数 1
EN

Stack Overflow用户

发布于 2019-10-03 20:40:36

我建议使用@Crabway说的,使用HttpService。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local httpService = game:GetService("HttpService")
print(httpService:JSONEncode({a = "b", b = "c"}) -- {"a":"b","b":"c"}

但是,如果您有任何UserData值,如Vector3s、CFramesColor3s、BrickColors和Enum项,那么请使用此Defaultio图书馆。其实挺不错的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
local library = require(workspace:WaitForChild("JSONWithUserdata"))
library:Encode({Vector3.new(0, 0, 0)})

如果您需要一些文档,请查看脚本中的第一个注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- Defaultio

--[[

    This module adds support for encoding userdata values to JSON strings.
    It also supports lists which skip indices, such as {[1] = "a", [2] = "b", [4] = "c"}

    Userdata support is implemented by replacing userdata types with a new table, with keys _T and _V:
        _T = userdata type enum (index in the supportedUserdataTypes list)
        _V = a value or table representing the value

    Follow the examples bellow to add suppport for additional userdata types.

    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ 

    Usage example:

        local myTable = {CFrame.new(), BrickColor.Random(), 4, "String", Enum.Material.CorrodedMetal}

        local jsonModule = require(PATH_TO_MODULE)

        local jsonString = jsonModule:Encode(myTable)

        local decodedTable = jsonModule:Decode(jsonString)

--]]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52485973

复制
相关文章
Axios 取消重复请求
项目地址:https://github.com/Ewall1106/mall 有什么用? 当用户频繁点击在短时间内发送多个 ajax 请求,但是由于网络原因服务器数据无法及时响应返回,这时候,就会有可能造成前端页面数据不匹配的情况。 具体场景来说,在用户网速不好的情况下的比如搜索框 onchange 事件的模糊搜索、触底刷新请求列表数据、tab 栏的高频切换等等。 再者,这样也浪费服务器资源,也是性能优化的一种必要手段。 基本使用 官网地址:Axios-CancelToken 官网的基本示例如下。 c
Ewall
2020/11/12
1.5K0
如何优雅处理重复请求/并发请求?
一些用户请求在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些涉及写入操作,一旦重复了,可能会导致很严重的后果。例如交易接口如果重复请求,可能会重复下单。
java进阶架构师
2021/07/08
4.8K1
如何优雅处理重复请求/并发请求?
优雅地处理重复请求(并发请求)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/24
9970
如何优雅地处理重复请求(并发请求)
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。 重复的场景有可能是: 黑客拦截了请求,重放 前端/客户端因为某些原因请求重复发送了,或者用户在很短的时间内重复点击了 网关重发 …. 本文讨论的是如何在服务端优雅地统一处理这种情况,如何禁止用户重复点击等客户端操作不在本文的讨论范畴。 利用唯一请求编号去重 可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去
程序猿DD
2022/04/11
5760
如何优雅地处理重复请求(并发请求)
对于一些用户请求,在某些情况下是可能重复发送的,如果是查询类操作并无大碍,但其中有些是涉及写入操作的,一旦重复了,可能会导致很严重的后果,例如交易的接口如果重复请求可能会重复下单。
用户1263954
2022/05/23
1.1K0
如何优雅地处理重复请求(并发请求)
如何优雅地处理重复请求(并发请求)
你可能会想到的是,只要请求有唯一的请求编号,那么就能借用Redis做这个去重——只要这个唯一请求编号在redis存在,证明处理过,那么就认为是重复的
用户2781897
2020/12/15
1.4K0
LeetCode - 重复 N 次的元素
原题地址:https://leetcode-cn.com/problems/n-repeated-element-in-size-2n-array/
晓痴
2019/08/06
7650
LeetCode - 重复 N 次的元素
webapi避免http重复请求
route过滤 添加路由过滤,在过滤器中判断sessionid或者cookie session session服务端文件,存储guid或者用户账户(操作简单,增加服务器压力) session管理参考:https://www.cnblogs.com/wxdlut/p/9237577.html cookie cookie浏览器端,浏览器请求附带cookie,cookie设置超时管理连接状态) 路由过滤实现方式 golang gin.Default().Use(func() gin.HandlerFunc{
sofu456
2021/12/06
8970
封装 axios 取消重复请求
在我们web开发过程中,很多地方需要我们取消重复的请求。但是哪种场合需要我们取消呢?我们如何取消呢?带着这些问题我们阅读本文。
coder_koala
2021/01/06
1.7K0
ExcelVBA生成不重复n位的n个数字
'使用方法:call rnd_n_n(位数,个数,存放位置)如:Call rnd_n_n(10, 100, "a1")
哆哆Excel
2022/10/25
4460
ExcelVBA随机生成不重复的N个N位数文本
效果看图 【代码】 自定义函数1 '随机生成不重复指定位数文本,用法:brr=RndDigitText(位数, 个数) '.range("A1").Resize(UBound(brr), 1) = brr Function RndDigitText(di As Integer, number As Integer) Dim d As Object 'New Dictionary
哆哆Excel
2022/10/31
5080
961. 重复 N 次的元素
在大小为 2N 的数组 A 中有 N+1 个不同的元素,其中有一个元素重复了 N 次。 返回重复了 N 次的那个元素。
Michel_Rolle
2021/02/25
2.5K0
java防止接口重复请求_前端防止重复提交
对于一些新增数据的接口通常需要进行接口的防重复提交保护,如:用户账号注册、用户下单、用户发帖等等类似的应用场景。 防重复提交主要应用场景是避免用户短时间内由于误操作导致同一份数据被保存多次所带来的问题,如果被保存的数据内容存在唯一标识限制则可以选择不使用防重复提交,在业务侧保证数据的唯一性即可。 注意:防重复提交只能防止短时间内用户的误操作导致插入重复数据的问题,如果需要数据的唯一性还是需要在业务中自行处理。
全栈程序员站长
2022/09/27
2K0
AJAX请求重复发送问题
在进行 AJAX(Asynchronous JavaScript and XML)请求时,我们有时会遇到请求重复发送的问题。这可能会导致不必要的请求重复执行,增加服务器负载和网络带宽消耗,并且可能对应用程序的性能和用户体验产生不良影响。
堕落飞鸟
2023/05/18
1.2K0
Axios使用CancelToken取消重复请求
处理重复请求:没有响应完成的请求,再去请求一个相同的请求,会把之前的请求取消掉
明知山
2023/08/18
4020
Axios使用CancelToken取消重复请求
SpringBoot如何处理重复请求?
日常业务开发中,处理重复请求应该是我们需要经常注意的,那么在Spring Boot中,防止重复请求的方法可以通过以下几种方式实现:
跟着可乐学技术
2023/04/27
9470
get 和 post 重复请求详解
适用于频繁触发并且需要给予用户一些反馈的场景,如:resize、scroll、mousemove
ruochen
2021/12/16
3.5K0
使用Vagrant在几秒钟内调试内核
所有Windows内核黑客(从初学者到专业人士)都知道,设置和管理用于内核调试的虚拟机可能很耗时。Vagrant是一个免费的开源工具,可以自动创建和自动化VM。这篇文章将向您介绍Vagrant,以及如何利用其功能自动执行我们的内核调试设置。
franket
2021/01/05
2.9K0
使用原生 JavaScript 在页面加载完成后处理多个函数
网页中的 JavaScript 脚本运行是需要通过事件去触发的。一般的做法就是在网页中,直接编写几个函数,有的在代码被加载的时候就被浏览器处理,或者使用类似下面的代码来触发实现函数的相关功能。
Denis
2023/04/15
2.8K0
iOS多个网络请求完成后执行下一步
在开发中,我们很容易遇到这样的需求,需要我们同时做多个网络请求,所有网络请求都完成后才能进行下一步的操作。如下载多个图片,下载完了才能展示。 今天我们就来研究一下这个问题的解决方案。 1.首先,我们创建一个项目,然后做一般性的做法,不做任何处理去连续请求一个接口10次: 先在viewDidLoad中创建第一种情况. //1.无处理 UIButton *Btn1 = [UIButton buttonWithType:UIButtonTypeCustom]; Btn1.frame = CGRec
清墨
2018/05/07
3K0

相似问题

重复bash命令n秒钟

22

RXJava + Retrofit.每n秒钟重复请求一次

16

重复函数执行n秒钟

44

如何每N秒钟重复运行bash脚本?

28

angular2调用http.get请求打开文件

40
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文