在 Roblox 中,被破坏的部分不会被全局破坏
Posted
技术标签:
【中文标题】在 Roblox 中,被破坏的部分不会被全局破坏【英文标题】:Destroyed part is not destroyed globaly in 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
发送到这个函数中?
我不知道该怎么做。谢谢大家。
【问题讨论】:
【参考方案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()
移到了苹果部分,所以我可以直接访问苹果部分本身。
【讨论】:
以上是关于在 Roblox 中,被破坏的部分不会被全局破坏的主要内容,如果未能解决你的问题,请参考以下文章
当会话在 websphere 中失效时,Spring 视图范围不会被破坏
在 Ionic 5 路由器中登录/注销时登录/主页不会被破坏