我想做的事情:我想有一棵树,每隔几秒钟苹果就会从那棵树上掉下来。玩家可以“捡起”那个苹果。如果游戏中有更多玩家,则赢得最多苹果的玩家将获胜。
我有:我有一棵树,苹果掉下来了。到这里为止,它仍然完美。玩家可以拿起一个苹果-如果他用脚触摸苹果,则苹果将被破坏并获得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
发送到此函数中?
我不知道该怎么做。谢谢大家。
确定,问题已解决。
问题是Touched
事件在本地播放器的零件(脚,腿)上触发。这已将苹果的本地实例发送到Touched Event Handler。
现在我删除了此:
character.LeftFoot.Touched:Connect( PickUpApple )
[而不是用玩家脚触发Touched
,我将其移至Apple部分,现在我触发了该Apple部分的Touched
事件。
apple.Touched:Connect(PickUpApple)
并且有效。当Apple的零件发送到Touched Event Handler播放器的脚时,这很好-我不需要销毁它-现在可以销毁Apple。
我不得不说我也将整个function PickUpApple()
移到了苹果部件中,所以我可以直接访问苹果部件本身。