【问题标题】:How would I make a player invisible only to certain players?我如何让某个玩家只对某些玩家不可见?
【发布时间】:2021-04-09 18:55:05
【问题描述】:

到目前为止,我所做的基本上是为每个玩家添加一个 boolValue,如果该 boolValue 设置为 true,他们可以看到隐形人,如果为 false,他们不能。我目前对代码一无所知,所以我不知道如何开始。我也在通过工具更改 Bool Value 的值。

【问题讨论】:

  • 你应该下次发布一些代码。
  • 但我实际上不知道从哪里开始,这就是问题所在。
  • 是的,但你说Basically what I've done so far is add a boolValue to every player显示该代码来帮助我们。

标签: lua roblox


【解决方案1】:

让一个玩家只对某些玩家不可见的关键是要理解LocalScript 中对世界所做的任何更改只有该玩家可见。它们不会在其他客户端之间复制。因此,如果我们可以设置一个系统,可以告诉 LocalScripts 使特定玩家不可见,那么该玩家将从他们的屏幕上消失,并且只会从他们的屏幕上消失。

所以如果我们有这个系统,玩家二可以说,“嘿,游戏服务器,你能不能让人们知道让我隐形!”。该消息将发送到服务器,服务器会将其发送到一堆不同的客户端,每个客户端将使用它们的 LocalScripts 在本地进行更改,并且玩家实际上会在他们的屏幕上变得不可见。

因此,即使玩家 2 看起来对玩家 1 和 3 来说是不可见的,但对于游戏服务器来说,并没有什么不同或不寻常的地方,这些变化完全是针对每个玩家的世界版本进行本地化的。

一种方法是使用这样的设置:

在 LocalScript 中,你会有这样的东西:

local tool = script.Parent
local IsHidden = tool:WaitForChild("IsHidden", 5)
local TogglePlayerVisible = game.ReplicatedStorage.TogglePlayerVisible
local localPlayer = game.Players.LocalPlayer

-- debug
tool.Name = "Turn Invisible"
tool.RequiresHandle = false
IsHidden.Value = false

-- 1) When a player activates the tool, flip the BoolValue
tool.Activated:Connect(function()
    IsHidden.Value = not IsHidden.Value
    tool.Name = IsHidden.Value and "Become Visible" or "Turn Invisible"
end)

-- 2) When the BoolValue changes, tell the server about it
IsHidden.Changed:Connect(function(updatedValue)
    TogglePlayerVisible:FireServer(updatedValue)    
end)

-- 4) When the server tells us a player has used the tool, make that player invisible locally
TogglePlayerVisible.OnClientEvent:Connect(function(player, isHidden)
    local invisible = 1.0
    local visible = 0.0
    
    -- if we are the one who sent it, only make us a little invisible
    if (player.Name == localPlayer.Name) then
        invisible = 0.7
    end
    
    -- loop over all of the parts in a player's Character Model and hide them
    for _, part in ipairs(player.Character:GetDescendants()) do
        local shouldTogglePart = true
        
        -- handle exceptions
        if not (part:IsA("BasePart") or part:IsA("Decal")) then
            shouldTogglePart = false
        elseif part.Name == "HumanoidRootPart" then
            shouldTogglePart = false
        end
        
        -- hide or show all the parts and decals
        if shouldTogglePart then
            part.Transparency = isHidden and invisible or visible
        end
    end
end)

在脚本中,你会有这样的东西:

local TogglePlayerVisible = game.ReplicatedStorage.TogglePlayerVisible

-- 3) whenever a player triggers this event, send it out to all players
TogglePlayerVisible.OnServerEvent:Connect(function(player, isVisible)
    TogglePlayerVisible:FireAllClients(player, isVisible)
end)

如果您只希望特定个玩家看不到某个玩家,那么您可以修改第 3 步,这样您就可以专门选择将消息发送给哪些玩家,而不是使用TogglePlayerVisible:FireAllClients FireClient.

【讨论】:

  • 嗨,谢谢!这非常有帮助!不过有一件事,我如何让隐形玩家看到其他隐形玩家?
  • 在第 3 步中,我们将消息发送给玩家以使用 TogglePlayerVisible 显示或隐藏玩家。所以我会修改第 3 步,让服务器脚本跟踪所有不可见的玩家,将不可见的玩家添加到表中,并删除可见的玩家。每当一个玩家变得隐形时,我都会遍历我的玩家列表,并只告诉新隐形的玩家让每个人再次可见......或者至少部分地,这样你就可以知道谁应该是隐形的。
猜你喜欢
  • 2021-11-02
  • 1970-01-01
  • 2022-06-21
  • 2022-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多