Как сделать, чтобы локальная переменная стала значением другой локальной переменной в другом скрипте? - PullRequest
0 голосов
/ 17 мая 2019

Я играю в прыжки и хочу, чтобы значение JumpBoost на доске лидеров равнялось значению JumpBoost объекта

local boostPart = script.Parent
local jump = leaderstats.gold.Value
local boostedJumpPower = jump.Value
local function onPartTouch(otherPart)
    local partParent = otherPart.Parent
    local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
    if ( humanoid ) then
        boostPart.CanCollide = false
        local currentJumpPower = humanoid.JumpPower
        if ( currentJumpPower < boostedJumpPower ) then
            humanoid.JumpPower = boostedJumpPower
            wait(5)
            humanoid.JumpPower = currentJumpPower
        end
    end
end
boostPart.Touched:Connect(onPartTouch)

Я попробовал это, но это не сработало, и я не могу придумать другой способ

Если я тестирую игру и прыгаю после прикосновения к объекту, мой Прыжок нормальный, а не показатель лидера

Ответы [ 2 ]

0 голосов
/ 17 мая 2019

Чтобы ответить на ваш заглавный вопрос: «Как сделать, чтобы локальная переменная стала значением локальной переменной в другом скрипте», в Roblox есть система для передачи данных с использованием BindableEvents и BindableFunctions .

Простой пример этого предполагает, что у вас есть BindableEvent в рабочей области.

Локальный сценарий 1:

local myValue = 1
local bEvent = game.Workspace.BindableEvent

-- listen for actions fired from other scripts
bEvent.Event:Connect(function(newValue)
    myValue = newValue
    print("Script 1 - myValue has changed to ", myValue)
end

print("Script 1 - myValue originally equals ", myValue)

Локальный сценарий 2:

wait(1)
local bEvent = game.Workspace.BindableEvent

-- tell the other scripts that the value has changed
print("Script 2 - firing change signal")
bEvent:Fire(10)

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

0 голосов
/ 17 мая 2019

Я думаю, что ваша проблема в том, что вы просто неправильно обращаетесь к значению лидера.

Существует разница между игроком, которого вы найдете в game.Players, и игроком в game.Workspace. В game.Players находится папка лидера, а в game.Workspace - место обитания гуманоида игрока.

Чтобы изменить значения лидера, вам нужно использовать гуманоида, чтобы узнать, какой игрок коснулся этой части, а затем получить фактический объект игрока из game.Players, чтобы правильно получить доступ к папке.

local boostPart = script.Parent

local function onPartTouch(otherPart)
    -- get the player that touched the boost block
    local partParent = otherPart.Parent
    local humanoid = partParent:FindFirstChildWhichIsA("Humanoid")
    if ( humanoid ) then
        -- a player touched this, prevent more collisions
        boostPart.CanCollide = false

        -- get the current player's jump power by looking into the players leaderstats
        local playerService = game.Players
        local playerName = partParent.Name
        local currentPlayer = playerService[playerName]
        local playerGold = currentPlayer.leaderstats.gold.Value -- << gold?

        -- give the player a temporary boost
        local currentJumpPower = humanoid.JumpPower
        if ( currentJumpPower < playerGold) then
            humanoid.JumpPower = playerGold

            -- reset the player's jump power
            wait(5)
            humanoid.JumpPower = currentJumpPower
        end
    end
end
boostPart.Touched:Connect(onPartTouch)

Это должно позволить вам правильно читать значения из лидеров. Если вы хотите изменить их, вы можете использовать ту же систему для перехода в папку Players и изменения значений.

...