Событие MouseClick и MoveTo не работает на 2-й части, которая возникла

Я работаю над проектом, в котором игрок нажимает на объект, и он подходит к нему, подождите секунду, затем объект удаляется из игры, а очки обновляются в таблице лидеров. Проблема в том, что это работает только в первом раунде. Во второй раз появилась новая часть, и у нее есть 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()? Если он не устанавливает для Clone.Parent значение nil, проблема заключается в том, что тело оператора if не выполняется во второй и последующие разы.

Alex 29.05.2019 18:01

Clone:Remove() удаляет часть, которая была клонирована из ReplicatedStorage, из игры, поэтому ее родитель больше не существует. Это заставляет игру клонировать новую часть из ReplicatedStorage обратно в игру. Вот почему старая часть исчезает, а затем появляется новая часть с ClickDetector в качестве дочернего элемента. Исходная часть в ReplicatedStorage не имеет ClickDetector.

MuajtxujXyoojVaaj 30.05.2019 05:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
191
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Будет ли это работать, было трудно понять ваш вопрос, но я думаю, что вы говорите, что клон не появится после повторного щелчка. Ну это сработало? Кроме того, вам не нужно иметь событие щелчка внутри цикла, а для создания клона каждый раз, когда игрок щелкает, внутри функции щелчка вы создаете клон переменной 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, я также попытался поместить их в отдельные серверные скрипты.

MuajtxujXyoojVaaj 30.05.2019 18:27

Клон действительно появился, и в нем также был ClickDetector. При наведении на него отображается значок ClickDetector, но щелчок по нему не делает того, что должен делать. Это работает только в первый раз, когда игрок впервые входит в игру. После того, как игрок нажимает на него, и он исчезает и снова появляется, детектор кликов не работает, когда он снова появляется.

MuajtxujXyoojVaaj 30.05.2019 18:37

Этот пример не будет работать, потому что цикл while не позволяет коду когда-либо достигать соединения ClickDetector.MouseClick. Клон появится в мире с ClickDetector, но при нажатии на него ничего не произойдет. Цикл while должен быть в конце.

Kylaaa 31.05.2019 03:46

Просто сделайте цикл сопрограммой.

Stanlyhalo 10.06.2019 17:45
Ответ принят как подходящий

Ваша проблема в том, что функция в 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 в будущем.

MuajtxujXyoojVaaj 31.05.2019 17:18

Я добавил ожидание, пока игрок доберется до детали, и воспроизвел анимацию, прежде чем заставить ее исчезнуть, и теперь это идеально.

MuajtxujXyoojVaaj 31.05.2019 17:21

Другие вопросы по теме