被破坏的部分不会在 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)
我正在尝试做的事情:我想要一棵树,每隔几秒钟就有一个苹果从树上掉下来。玩家可以"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)