Я работаю над проектом, в котором игрок нажимает на объект, и он подходит к нему, подождите секунду, затем объект удаляется из игры, а очки обновляются в таблице лидеров. Проблема в том, что это работает только в первом раунде. Во второй раз появилась новая часть, и у нее есть ClickDetector в качестве дочернего элемента, но он не работает.
local flowers = game.ReplicatedStorage.Flowers.level1:GetChildren()
local selection = math.random(1,#flowers)
local Clone = flowers[selection]:Clone()
local ClickDetector = Instance.new("ClickDetector")
ClickDetector.Parent = Clone
ClickDetector.MaxActivationDistance = 500
local spawners = workspace.Spawners.level1:GetChildren()
local spawnSelection = math.random(1,#spawners)
local spawner = spawners[spawnSelection]
while true do
wait(1)
if Clone.Parent == nil then
Clone.Parent = workspace.Flowers.level1
Clone.CFrame = spawner.CFrame + Vector3.new(math.random(-5,5),1,math.random(-5,5))
print("Clone added")
ClickDetector.MouseClick:Connect(function(playerWhoClicked)
playerWhoClicked.Character.Humanoid:MoveTo(Clone.Position,Clone)
print("clicked")
wait(1)
Clone:Remove()
print("Clone removed")
local flowerValue = playerWhoClicked.leaderstats.Flowers
local coinsValue = playerWhoClicked.leaderstats.Coins
flowerValue.Value = flowerValue.Value + 1
coinsValue.Value = coinsValue.Value + 5
end)
end
end
Сообщений об ошибках на выходе нет. Просто на новой порожденной части "клик" не печатает.
Clone:Remove() удаляет часть, которая была клонирована из ReplicatedStorage, из игры, поэтому ее родитель больше не существует. Это заставляет игру клонировать новую часть из ReplicatedStorage обратно в игру. Вот почему старая часть исчезает, а затем появляется новая часть с ClickDetector в качестве дочернего элемента. Исходная часть в ReplicatedStorage не имеет ClickDetector.
Будет ли это работать, было трудно понять ваш вопрос, но я думаю, что вы говорите, что клон не появится после повторного щелчка. Ну это сработало? Кроме того, вам не нужно иметь событие щелчка внутри цикла, а для создания клона каждый раз, когда игрок щелкает, внутри функции щелчка вы создаете клон переменной Clone.
local flowers = game.ReplicatedStorage.Flowers.level1:GetChildren()
local selection = math.random(1,#flowers)
local Clone = flowers[selection]:Clone()
local ClickDetector = Instance.new("ClickDetector")
ClickDetector.Parent = Clone
ClickDetector.MaxActivationDistance = 500
local spawners = workspace.Spawners.level1:GetChildren()
local spawnSelection = math.random(1,#spawners)
local spawner = spawners[spawnSelection]
while true do
wait(1)
if Clone.Parent == nil then
Clone.Parent = workspace.Flowers.level1
Clone.CFrame = spawner.CFrame + Vector3.new(math.random(-5,5),1,math.random(-5,5))
print("Clone added")
end
end
ClickDetector.MouseClick:Connect(function(playerWhoClicked)
_clone = Clone:Clone()
playerWhoClicked.Character.Humanoid:MoveTo(_clone.Position,_clone)
print("clicked")
wait(1)
_clone:Destroy()
print("_clone removed")
local flowerValue = playerWhoClicked.leaderstats.Flowers
local coinsValue = playerWhoClicked.leaderstats.Coins
flowerValue.Value = flowerValue.Value + 1
coinsValue.Value = coinsValue.Value + 5
end)
Это было мое первое испытание. Разделяя регенерацию цикла и ClickDetector, я также попытался поместить их в отдельные серверные скрипты.
Клон действительно появился, и в нем также был ClickDetector. При наведении на него отображается значок ClickDetector, но щелчок по нему не делает того, что должен делать. Это работает только в первый раз, когда игрок впервые входит в игру. После того, как игрок нажимает на него, и он исчезает и снова появляется, детектор кликов не работает, когда он снова появляется.
Этот пример не будет работать, потому что цикл while не позволяет коду когда-либо достигать соединения ClickDetector.MouseClick. Клон появится в мире с ClickDetector, но при нажатии на него ничего не произойдет. Цикл while должен быть в конце.
Просто сделайте цикл сопрограммой.
Ваша проблема в том, что функция в ClickDetector использует ссылку на Clone, и когда Clone уничтожается, он больше не существует. Ваш код будет работать, если он просто удалит объект из мира, а не уничтожит его.
-- choose a random flower and clone it
local flowers = game.ReplicatedStorage.Flowers.level1:GetChildren()
local selection = math.random(1,#flowers)
local Clone = flowers[selection]:Clone()
-- configure a click detector into the cloned flower
local ClickDetector = Instance.new("ClickDetector")
ClickDetector.Parent = Clone
ClickDetector.MaxActivationDistance = 500
ClickDetector.MouseClick:Connect(function(playerWhoClicked)
-- when a player clicks on the flower, move the player over to it
playerWhoClicked.Character.Humanoid:MoveTo(Clone.Position,Clone)
print("clicked")
-- remove the cloned flower from the workspace, but don't destroy it
wait(1)
Clone.Parent = nil -- << simply hide it from the world
-- award the player with some points
local flowerValue = playerWhoClicked.leaderstats.Flowers
local coinsValue = playerWhoClicked.leaderstats.Coins
flowerValue.Value = flowerValue.Value + 1
coinsValue.Value = coinsValue.Value + 5
end)
-- choose a random spawn location
local spawners = workspace.Spawners.level1:GetChildren()
local spawnSelection = math.random(1,#spawners)
local spawner = spawners[spawnSelection]
-- begin a loop to place the flower into the world
while true do
wait(1)
-- if the flower isn't visible, place it near a specific location
if Clone.Parent == nil then
Clone.Parent = workspace.Flowers.level1
Clone.CFrame = spawner.CFrame + Vector3.new(math.random(-5,5),1,math.random(-5,5))
print("Clone added into the world")
-- now wait for a player to click on it and unparent it.
-- this case will come back around a second later, and it will be added back in.
end
end
Таким образом, вам не придется беспокоиться о втором или третьем появлении цветка, потому что всегда будет только один цветок.
Большое спасибо. Оно работало завораживающе. Ожидая, пока кто-нибудь поможет мне найти проблему в сценарии, я сделал альтернативный сценарий, используя часть непосредственно в Workspace вместо ее клонирования из ReplicatedStorage, и изменив ее прозрачность и устранение дребезга перед повторным появлением. Мне очень нравится ваш Clone.Parent = nil. Я не знал об этом, кроме Remove() или Destroy(). Я буду продолжать использовать *.Parent = nil в будущем.
Я добавил ожидание, пока игрок доберется до детали, и воспроизвел анимацию, прежде чем заставить ее исчезнуть, и теперь это идеально.
Что делает Clone:Remove()? Если он не устанавливает для Clone.Parent значение nil, проблема заключается в том, что тело оператора if не выполняется во второй и последующие разы.