我如何在Roblox中检查这一点?



我正在制作《Roblox》中的隐形药水。我的目标是让你可以在本地看到你的角色,但服务器上的其他人(不包括你)根本看不到你。

到目前为止,它进展顺利,在本地,我已经将透明度设置为0.7,但服务器部分是问题,每次我都试图让服务器检测它是否正在处理玩家或其他玩家。这似乎从来没有成功过。

与当前的脚本,我现在有,它将工作,但只有当你双击它,我只是希望它不被混淆,但只是按预期工作。

这是我当前的两个脚本,本地和服务器。本地:

local UIS = game:GetService("UserInputService")
script.Parent.Activated:Connect(function()
UIS.InputBegan:Connect(function(input, gpe)
if input.UserInputType == Enum.UserInputType.MouseButton1 then
local Player = script.Parent.Parent
script.Parent.EnableEvent:FireServer()
for _, child in ipairs(Player:GetChildren()) do
if child:IsA("BasePart") then
if child.Name == "HumanoidRootPart" then
child.Transparency = 1
else
child.Transparency = 0.7
end
elseif child:IsA("Accessory") then
child.Handle.Transparency = 0.7
end
end
wait(20)
for _, child in ipairs(Player:GetChildren()) do
if child:IsA("BasePart") then
if child.Name == "HumanoidRootPart" then
child.Transparency = 1
else
child.Transparency = 0
end
elseif child:IsA("Accessory") then
child.Handle.Transparency = 0
end
end
end
end)
end)

和服务器:

script.Parent.EnableEvent.OnServerEvent:Connect(function(player, Name)
local Player = script.Parent.Parent
if Name ~= script.Parent.Parent.Name then
for _, child in ipairs(Player:GetChildren()) do
if child:IsA("BasePart") then
child.Transparency = 1
elseif child:IsA("Accessory") then
child.Handle.Transparency = 1
end
end
wait(20)
for _, child in ipairs(Player:GetChildren()) do
if child:IsA("BasePart") then
if child.Name == "HumanoidRootPart" then
child.Transparency = 1
else
child.Transparency = 0
end
elseif child:IsA("Accessory") then
child.Handle.Transparency = 0
end
end
end
end)

最终的结果是这样的:https://i.stack.imgur.com/fqj6P.jpg

在我深入研究解决方案之前,先解释一下是怎么回事。

简单地说,当你触发一个远程事件时,它不会立即执行(由于客户端和服务器之间的延迟),所以客户端首先使一切透明,然后服务器覆盖它并使一切完全透明。第二次点击使一切都完全透明的原因是因为在服务器上,你已经处于透明度1。

  1. 播放器透明度设置为。7
  2. 服务器透明度设置为1透明度并覆盖本地透明度

—第二次点击

  1. 播放器透明度设置为。7
  2. 服务器透明度已经是1,所以它不会改变它。(第二次点击后,透明度为0.7)

所以为了解决这个问题,我们只需要等待服务器首先更改透明度,然后本地播放器应该将透明度更改为0.7。我的建议是使用远程函数而不是远程事件。

与远程事件不同,远程函数的行为类似于函数,并且在调用时需要完成/返回才能继续执行脚本。

-- Example
-- server
local remoteFunction = game.ReplicatedStorage.RemoteFunction
remoteFunction.OnServerInvoke = function(player)
wait(5)
end
-- client
local remoteFunction = game.ReplicatedStorage.RemoteFunction
remoteFunction:InvokeServer()
print("Hello World") -- is delayed by 5 seconds since the function call needs to finish

所以,是的,你应该能够把你的代码更改为远程函数,这应该有望解决你的问题!

相关内容

  • 没有找到相关文章

最新更新