Как запустить код при прикосновении к любому объекту с таким же именем

Итак, я пытаюсь разработать небольшую игру по сбору монет на Roblox, и я новичок в написании сценариев. Обычно каждые 0,25–1,5 секунды небольшая часть клонируется из (-254, 2, -255) (один угол опорной плиты) в (254, 2, 255) (противоположный угол). Это работает, но я пытаюсь перебрать каждый объект в workspace с именем coin, и когда к нему прикоснуться, запустить код (пока я просто пытаюсь уничтожить объект, но я, вероятно, просто обновляю Coins leaderstat). Никаких ошибок у меня не выдает, просто не работает. Я также искал в Интернете и ничего не нашел.

Код в ServerScriptStorage (создает кубики и уже работает, но показал помощь):

local runservice = game:GetService("RunService")
local interval = math.random(0.25, 1.5)
local coin = game.ServerStorage.coin
local counter = 0
local x = math.random(-254, 254)
local z = math.random(-255, 255)

runservice.Heartbeat:Connect(function(step)
    counter = counter + step
    if counter >= interval then
        counter = counter - interval
        local copy = coin:Clone()
        copy.Parent = workspace
        copy.Position = Vector3.new(x, 2, z)
        x = math.random(-254, 254)
        z = math.random(-255, 255)
        interval = math.random(0.25, 1.5)
    end
end)

скрипт на рабочем столе, который обрабатывает прикосновения:

for _, v in pairs(workspace:GetChildren()) do
    if v.Name == "coin" then
        print("foo")
    end
end

Надеюсь, этого достаточно, чтобы помочь!


person TextBasedYoutube    schedule 17.10.2020    source источник
comment
Я предлагаю вам: 1) убедиться, что workspace в первом фрагменте кода такой же, как и во втором, 2) убедиться, что цикл for _, v in pairs(workspace:GetChildren()) выполняется хотя бы один раз, 3) выяснить, что v на каждой итерации .   -  person Alexander Mashin    schedule 17.10.2020
comment
Я действительно не понимаю, что это значит и как это сделать, не могли бы вы объяснить еще немного?   -  person TextBasedYoutube    schedule 17.10.2020


Ответы (1)


Что ж, поскольку вы новичок в написании сценариев в roblox, позвольте мне дать вам ваш ответ с хорошими практиками, которые могут вам очень помочь. Во-первых, в этом сценарии вам не нужно использовать Heartbeat, вместо этого вы можете просто использовать цикл while или рекурсивную функцию и простой wait (). Также вам лучше создать папку с монетами в рабочей области, чтобы не проверять другие объекты.

local waitTime = math.random(25,150)/100 --random time between 0.25 and 1.5
while true do  --forever loop
    wait(waitTime)   --waits desired time
    local coin = game.ServerStorage.coin:Clone() --cloning your coin
    coin.Parent = workspace.Coins --Coins folder
    coin.Position = Vector3.new(math.random(0,10),2,math.random(0,10)) --you must use your own position
    coin.Touched:Connect(function(hitPart) --here is the touched function
        local plr = game.Players:FindFirstChild(hitPart.Parent.Name) --check if the hitPart is part of a player
        if plr then 
            plr.leaderstats.Coins.Value =  plr.leaderstats.Coins.Value + 1--here you can increment your coins value in your own value
            coin:Destroy()--destroys the coin
        end
    end)
    waitTime = math.random(25,150)/100 --set a new random value to wait next
end

Также вы упомянули что-то о цикле каждой монеты в рабочей области, поэтому я сказал, что лучше создать отдельную папку. Итак, я сделал локальный скрипт внутри StarterPlayerScripts со следующим кодом:

local RunService = game:GetService("RunService") --service
RunService.RenderStepped:Connect(function() --function on every game frame
    for i,v in pairs(workspace.Coins:GetChildren()) do --loop on every coin
        v.Orientation = Vector3.new(v.Orientation.X,v.Orientation.Y+5,v.Orientation.Z) --increasing Orientation just on Y in order to rotate them 
    end
end)

Я делаю это с помощью localscript, потому что это всего лишь визуальный эффект, и никогда не рекомендуется отправлять так много функций, которые быстро находятся на стороне сервера. Вот игра, которую я сделал для вас: https://www.roblox.com/games/5842250223/Help-for-TextBasedYoutube Вы можете изменить это место.

Другими словами, чтобы ответить. Как запустить код при прикосновении к любому объекту с таким же именем? Вам необходимо установить функцию для объекта при его создании.

Изменить: также не рекомендуется отправлять многим запросам на сервер за короткие промежутки времени, я бы рекомендовал вам создавать монету каждые 2–3 секунды или более.

person Juan Pedro Goicochea    schedule 18.10.2020
comment
Когда я сказал цикл, я имел в виду запускать код, который перебирает каждую монету, но вы ответили на него выше. Спасибо! - person TextBasedYoutube; 18.10.2020
comment
Кроме того, как бы вы добавили к этому привязываемое событие, чтобы использовать его для увеличения монет? Я хочу это сделать, потому что собираюсь добавить к нему DataStore2. На самом деле nvm, просто удалось заставить его работать. - person TextBasedYoutube; 18.10.2020
comment
Заставить DS2 работать с кодом, который вы указали, оказалось несложно, так что еще раз спасибо! - person TextBasedYoutube; 18.10.2020