销毁的零件在Roblox中不会被全局销毁

问题描述 投票:1回答:2

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

我有:我有一棵树,苹果掉下来了。到这里为止,它仍然完美。玩家可以拿起一个苹果-如果他用脚触摸苹果,则苹果将被破坏并获得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脚本与此:

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是否有可能将local touchObject发送到此函数中?

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

lua roblox
2个回答
0
投票

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

0
投票

确定,问题已解决。

问题是Touched事件在本地播放器的零件(脚,腿)上触发。这已将苹果的本地实例发送到Touched Event Handler。

现在我删除了此:

character.LeftFoot.Touched:Connect( PickUpApple )

[而不是用玩家脚触发Touched,我将其移至Apple部分,现在我触发了该Apple部分的Touched事件。

apple.Touched:Connect(PickUpApple)

并且有效。当Apple的零件发送到Touched Event Handler时,这是可以的-我不需要销毁它-现在可以销毁Apple。

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

© www.soinside.com 2019 - 2024. All rights reserved.