被破坏的部分不会在 Roblox 中被全局破坏

Destroyed part is not destroyed globaly in Roblox

我正在尝试做的事情:我想要一棵树,每隔几秒钟就有一个苹果从树上掉下来。玩家可以"pick up"那个苹果。如果游戏中有更多玩家,则拾取苹果最多的玩家获胜。

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

问题所在:如果更多的玩家加入游戏,看起来每个玩家都可以看到自己的(本地)苹果。所以如果 Player1 捡起一个苹果,苹果就会被摧毁 - 但只有他自己 :( 所有其他玩家都可以看到那个苹果还在那里,他们也可以捡起它。如果我测试 -运行 2 人游戏,在服务器-window 我可以看到那个苹果仍然在那里,即使所有玩家都拿起它。所以服务器显然有它自己的实例。

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

申请是这样的:

我在工作区有一个苹果。每隔几秒钟,我将它克隆到 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 脚本:

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 发送到这个函数中?

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

好的,问题解决了。

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

现在我删除了这个:

character.LeftFoot.Touched:Connect( PickUpApple )

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

apple.Touched:Connect(PickUpApple)

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

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

从本地脚本中删除苹果只会为客户端删除它,为防止这种情况,请尝试通过服务器端脚本删除苹果,您有 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)