实例对象复制不同步问题修复

开发者们大家好,

我们将很快对复制功能进行更新:当服务器/客户端接收到实例时,它将删除其所有复制的子项。这能纠正各种DataModel不同步的错误。

我们将首先在编辑器上发布这个更改,然后下周在全球范围内的游戏体验中发布。您可以根据您的游戏体验来测试这种模式,并告诉我们您的想法!

什么意思?

让我们来举个例子!

当将实例添加到DataModel中时,我们希望它能正常复制。例如,如果服务器将名为“PartA”的部分添加到Workspace,我们期望将其复制到客户端,这样每个人都可以看到:

Workspace
→ PartA

类似地,如果在PartA下添加另一个实例(例如文件夹),我们也希望每个人可以看到:

Workspace
→ PartA
→ Folder

现在,假设服务器在脚本中执行以下操作:

local partA = workspace.PartA
local folder = partA.Folder
– set parent of PartA to nil, removing it from the DataModel
partA.Parent = nil
– set the parent of Folder to nil, removing it from under PartA
folder.Parent = nil
– set the parent of PartA back to Workspace
partA.Parent = workspace

运行这个脚本之后,我们希望每个人可以看到:

Workspace
→ PartA

但结果并非如此,让我们来看看它在当前形式下是怎样运行的。

当前运行模式

假定客户端创建了本地脚本,如下所示:

local partA = workspace.PartA
print(partA.Name)

当服务器从DataModel中删除PartA时,客户端也将删除PartA。然而,由于本地脚本一直引用PartA,所以它不会从内存中删除PartA和它的子树!因此,PartA和PartA.文件夹将在客户端的以太内存里的某个位置浮动。

现在,当服务器将PartA带回Workspace下时,客户端将获取其内存中已有的PartA,并将PartA的父级设为Workspace。问题是,文件夹会自动出现,

让服务器看到:

Workspace
→ PartA

客户端看到:

Workspace
→ PartA
→ Folder

新模式

我们发布的更改将指示客户端在从服务器接收PartA时删除其所有子项来防止数据模型的不同步。

更具体地说,当服务器将PartA添加回Workspace时,客户端将会:

  1. 从PartA中删除所有子项(删除文件夹)

  2. 所有相关信号(如删除子项信号)仍然会触发

  3. 将PartA的父级设置为Workspace

  4. 仍然 存在 于服务器上的PartA的子项将再次复制到客户端

使服务器和客户端的视图保持一致:

Workspace
→ PartA

那些由本地脚本创建和添加,但从来没被客户端复制过的实例呢?由于服务器不知道这些实例,我们认为服务器修改它们是没有意义的。根据这个逻辑,我们决定新模式将会忽略本地的未复制实例。

但是,如果客户端已经将本地创建的实例复制到服务器(例如工具焊接),那么这个实例可通过这个新模式删除。

非常感谢大家的支持,如果您有任何反馈或问题,欢迎随时联系我们!

关于我们    加入我们    条款    隐私政策
©2021 Roblox Corporation、Roblox、Roblox 标志及 Powering Imagination 是我们在美国及其他国家或地区的注册与未注册商标。
粤ICP备20013629号