【问题标题】:Destroyed part is not destroyed globaly in Roblox在 Roblox 中,被破坏的部分不会被全局破坏
【发布时间】:2020-02-15 17:48:31
【问题描述】:

我想做的事:我想要一棵树,每隔几秒就有一个苹果从树上掉下来。玩家可以“拿起”那个苹果。如果游戏中有更多玩家,则拿起最多苹果的玩家获胜。

我有什么:我有一棵树,苹果都掉下来了。直到这里它完美运行。玩家可以捡起一个苹果——如果他的脚碰到了苹果,苹果就会被摧毁,玩家得 1 分。还可以。

出了什么问题:如果更多玩家加入游戏,看起来每个玩家都能看到自己的(本地)苹果。因此,如果 Player1 捡起一个苹果,苹果就会被摧毁 - 但仅限于他 :( 所有其他玩家都可以看到那个苹果还在那里,他们也可以捡起它。如果我用2个玩家,在服务器窗口中我可以看到苹果仍然存在,即使所有玩家都捡起它。所以服务器显然有它自己的实例。

但我只想要一个全球苹果。

应用是这样的:

我在工作区有一个苹果。每隔几秒钟,我就会在 Workspace 中 AppleTree 模型下的脚本(不是本地脚本,而是脚本)中克隆它:

function GrowNewApple()

    local newApplePos = GetRandomPlace()
    local appleTemplate = workspace.apples.prototype
    local newApple = appleTemplate:Clone()

    newApple.Parent = appleTemplate.Parent
    newApple.Name = "apple"
    newApple.Position = newApplePos
end

在 StarterPlayer / StarterPlayerScripts 我有一个 本地脚本:

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:wait()

character:WaitForChild("LeftFoot")

character.LeftFoot.Touched:Connect( PickUpApple )

最后我的 PickUpApple 函数如下所示:

function PickUpApple( touchObject )

    if touchObject:IsDescendantOf(workspace.apples) then
        touchObject:Destroy()
    end
end

有什么想法吗?

是不是因为 PickUpApple() 是从 LocalScript 调用的?这个 LocalScript 是否有可能将 local touchObject 发送到这个函数中?

我不知道该怎么做。谢谢大家。

【问题讨论】:

    标签: lua roblox


    【解决方案1】:

    从本地脚本中删除苹果只会为客户端删除它,为防止这种情况,请尝试让苹果被服务器端脚本删除,您有 2 个选项:

    1、将脚本设为服务器端脚本,并确保它与服务器兼容。

    2,创建一个远程事件,一旦本地脚本检测到本地玩家触摸苹果,就会触发该远程事件,并确保远程事件连接到删除苹果并给玩家点的函数,应该是服务器脚本,为此:

    1、在ReplicatedStorage中创建一个RemoteEvent(确保它是RemoteEvent而不是RemoteFunction!)并将其重命名为“PickupApple”。

    2、将本地脚本改为:

    local player = game.Players.LocalPlayer
    local character = player.Character or player.CharacterAdded:wait()
    local event = game.ReplicatedStorage:WaitForChild("PickupApple")
    local apples = workspace:WaitForChild("apples")  -- Using WaitForChild() function to prevent errors for requesting the object before it loads
    
    
    character:WaitForChild("LeftFoot")
    
    character.LeftFoot.Touched:Connect(function(touchObject)
       if touchObject:IsDescendantOf(apples) then
           event:FireServer(touchObject)
       end
    end)
    

    3、在ServerScriptService中创建一个脚本(不是LocalScript!),并把这个:

    game.ReplicatedStorage.PickupApple.OnServerEvent:Connect(function(player, item)
       if item:IsDescendantOf(workspace.apples) then
          item:Destroy()
          -- Add here any extra code such as giving points, etc
       end
    end)
    

    【讨论】:

    • 我已经解决了它,但会给你一个要点 - 你正确地拿起了那个苹果! :))
    【解决方案2】:

    好的,问题解决了。

    问题是Touched 事件是在本地玩家部件(脚、腿)上触发的。这已将苹果的本地实例发送到 Touched Event Handler。

    现在我删除了这个:

    character.LeftFoot.Touched:Connect( PickUpApple )
    

    我没有在玩家脚上触发Touched,而是将其移至Apple 部分,现在我在Apple 部分触发Touched 事件。

    apple.Touched:Connect(PickUpApple)
    

    而且它有效。虽然 Apple 部分发送到 Touched Event Handler 玩家的脚,这没问题 - 我不需要销毁它 - 我现在可以销毁 Apple。

    我不得不说我也将整个 function PickUpApple() 移到了苹果部分,所以我可以直接访问苹果部分本身。

    【讨论】:

      猜你喜欢
      • 2019-02-23
      • 1970-01-01
      • 2021-10-25
      • 1970-01-01
      • 2018-03-24
      • 2013-10-31
      • 2012-07-24
      • 2011-09-19
      相关资源
      最近更新 更多