Roblox中,摧毁的部分未被全局摧毁

我想做什么: 我想让一个树上每隔几秒钟掉下一颗苹果。玩家可以“捡起”这个苹果。如果有更多的玩家在游戏中,就会赢得捡起最多苹果的玩家。

我所拥有的: 我有一颗树,苹果正在掉下来。到目前为止这个游戏的运作非常完美。玩家可以捡起苹果 - 如果他用脚碰到苹果,苹果就会被摧毁,玩家得到1分。还好。

问题所在: 如果有更多的玩家加入游戏,看起来每个玩家都可以看到他自己的(本地)苹果。因此,如果Player1捡起一个苹果,那么这个苹果就会被摧毁 - 但是只有他自己看不见了:(所有其他玩家仍然可以看到这个苹果并捡起它。如果我用两个玩家测试游戏,在服务器窗口中,我可以看到那个苹果还在,即使所有玩家都捡起了它。所以服务端显然有它自己的实例。

但是我只想要一个全局的苹果。

应用程序如下:

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

我不知道该怎么做。谢谢你们。

点赞
用户1284542
用户1284542

问题已解决。

问题是 Touched 事件在本地玩家的部件(脚和腿)上被触发。这导致了苹果实例被发送到 Touched 事件处理程序中。

现在我移除了这个:

character.LeftFoot.Touched:Connect( PickUpApple )

并将 Touched 事件从玩家的脚转移到了苹果部分,现在我在那个苹果部分上触发 Touched 事件。

apple.Touched:Connect(PickUpApple)

现在它可以工作了。虽然苹果部分会将其发送到 Touched 事件处理程序中的玩家脚,但这没关系 - 我不需要摧毁它 - 现在我可以摧毁苹果了。

我必须说,我还将整个 function PickUpApple() 移到了苹果部分中,这样我就可以直接访问苹果本身。

2019-10-18 20:35:21
用户10823924
用户10823924

从本地脚本中删除苹果只会删除客户端中的苹果,为了防止这种情况,请将苹果删除的任务交由服务器脚本处理,您有两种选择:

  1. 将脚本变为服务器脚本并确保其与服务器兼容。

  2. 创建一个远程事件,在本地脚本检测到本地玩家触摸苹果时触发该事件,并确保远程事件连接到一个函数,该函数删除苹果并给玩家增加一个积分,应该设置为一个服务器脚本。操作步骤如下:

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

  4. 修改本地脚本如下:

local player = game.Players.LocalPlayer
local character = player.Character or player.CharacterAdded:wait()
local event = game.ReplicatedStorage:WaitForChild("PickupApple")
local apples = workspace:WaitForChild("apples")  -- 使用 WaitForChild() 函数以防止请求对象在加载前引起错误

character:WaitForChild("LeftFoot")

character.LeftFoot.Touched:Connect(function(touchObject)
   if touchObject:IsDescendantOf(apples) then
       event:FireServer(touchObject)
   end
end)
  1. 在“ServerScriptService”中创建一个脚本(不是“LocalScript”),并添加以下内容:
game.ReplicatedStorage.PickupApple.OnServerEvent:Connect(function(player, item)
   if item:IsDescendantOf(workspace.apples) then
      item:Destroy()
      -- 在此处添加任何额外的代码,如增加积分等
   end
end)
2019-11-07 22:23:34