为什么在 Roblox 中从不同的脚本中检索部件的 BrickColor.Name 时会得到不同的值

我在 Roblox 中编写了一个简单的游戏。

在玩家的某个脚本中,将更改玩家触摸的所有灰色方块的颜色。 在部分中的其他脚本会使其闪烁。当触摸该部件时,该部分应停止闪烁,然后其颜色发生变化。

当我触摸方块时,渲染颜色和玩家脚本中的颜色名称发生变化,但零件脚本中的颜色名称未更改。 我添加了一些打印来帮助我弄清楚发生了什么。 我知道可以通过事件来解决它。但是为什么会有不同的值?

这个脚本在 StarterCharacterScripts 对象中:

print(":)")

local originalColor = BrickColor.new(0.639216, 0.635294, 0.647059)

local player = game.Players.LocalPlayer

local human = player.Character.Humanoid

print("Player logged:  " .. human.DisplayName)

human.Touched:Connect(function(hit,limb)
    if hit.BrickColor.Name == originalColor.Name then
        hit.Color = player.TeamColor.Color
    end
end)

while true do
        print("From human: " .. workspace.Test.BrickColor.Name)
        wait(3)
end

这个脚本在对象中:

local greyPart=script.Parent
local myColor = greyPart.Color

print(greyPart.Name)
print(script.Parent.Name)

while myColor == script.Parent.Color do
    greyPart.Transparency = 1
    wait(1)
    greyPart.Transparency = 0
    wait(1)

    print("From part: " .. workspace.Test.BrickColor.Name)
end

在触摸之前获得的输出类似于:

From human: Medium stone grey
From part: Medium stone grey (x2)

在触摸后得到类似于这样的输出:

  From human: Really red
  From part: Medium stone grey (x2)
点赞
用户2860267
用户2860267

出于安全原因,使用 LocalScripts 对 Workspace 进行更改只会应用于拥有 LocalScript 的玩家。

如果您从 Studio 的 Test 标签中播放该游戏并在服务器上运行 3 个玩家,则可以看到此操作(这是一个示例)。 我在 StarterCharacterScripts 中制作了一个简单的 LocalScript,将砖块更改为随机颜色。这是在所有不同客户端和服务器上的外观:

服务器:

灰色砖块和围绕它站立的 3 个玩家的服务器端视图。

玩家 1:

从玩家 1 的视角看。砖块为红色。

玩家 2:

从玩家 2 的视角看。砖块为白色

玩家 3:

从玩家 3 的视角看。砖块是蓝色的

如果您希望更改在所有玩家中复制,则必须在脚本中进行更改。

2020-05-26 01:09:16
用户9922866
用户9922866

使用RemoteEvent是解决这个问题的方法,因为您正在尝试从客户端影响服务器端的更改。在Roblox的客户端-服务器模型中,服务器是权威性的,并且只有它可以更改游戏世界中的对象。当客户端以您的脚本所做的方式进行更改时,该更改从本地客户端的角度可见;但是,该更改不会复制到其他玩家。这解释了您的脚本输出:在您的屏幕上,该块的BrickColor已更改,但从另一个玩家的角度来看,它仍然是灰色的。

RemoteEvent以及RemoteFunction可以从客户端发送信号,接收到信号的服务器则可以将其发送到所有客户端,从而通知它们要更改游戏世界。在您的情况下,您检测玩家接触哪些灰色零件的客户端脚本将通过RemoteEvent向服务器发送该信息,并告诉服务器更改零件的BrickColor

Roblox的RemoteEvent类参考页面如下所示:

RemoteEvent旨在在服务器和客户端之间提供单向消息,允许ScriptsLocalScripts中调用代码,反之亦然。此消息可以从一个客户端传递到服务器,从服务器传递到特定客户端,或从服务器传递到所有客户端。

在您的情况下,您将从一个客户端向服务器发送一个消息,从LocalScript调用包含在服务器端Script中的函数。

请参阅此处的RemoteEvent参考页面(https://developer.roblox.com/en-us/api-reference/class/RemoteEvent)以获取示例和更多详细信息。

2020-05-26 01:11:33