开发者们大家好,
我们将很快对复制功能进行更新:当服务器/客户端接收到实例时,它将删除其所有复制的子项。这能纠正各种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时,客户端将会:
-
从PartA中删除所有子项(删除文件夹)
-
所有相关信号(如删除子项信号)仍然会触发
-
将PartA的父级设置为Workspace
-
仍然 存在 于服务器上的PartA的子项将再次复制到客户端
使服务器和客户端的视图保持一致:
Workspace
→ PartA
那些由本地脚本创建和添加,但从来没被客户端复制过的实例呢?由于服务器不知道这些实例,我们认为服务器修改它们是没有意义的。根据这个逻辑,我们决定新模式将会忽略本地的未复制实例。
但是,如果客户端已经将本地创建的实例复制到服务器(例如工具焊接),那么这个实例可通过这个新模式删除。
非常感谢大家的支持,如果您有任何反馈或问题,欢迎随时联系我们!