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