Все переменные ModuleScript == ноль

По какой-то причине все мои локальные переменные в скрипте модуля кажутся нулевыми, без точного объяснения или решения. Локальный сценарий (скрипт шкалы выносливости):

local ms = require(game.ReplicatedStorage.ModuleScript)
if not ms then
    
    local ms = require(game.ReplicatedStorage:WaitForChild("ModuleScript"))
    
end

local TW = game:GetService("TweenService")--Get Tween Service

local Staminabar = script.Parent -- Get The Stamina bar

local function UpdateStaminabar() --Stamina Bar Size Change Function
    local stamina = math.clamp(ms.stamina / ms.maxstamina, 0, 1) --Maths
    local info = TweenInfo.new(ms.stamina / ms.maxstamina,Enum.EasingStyle.Linear,Enum.EasingDirection.InOut,0,false,0) --Tween Info
    TW:Create(script.Parent,info,{Size = UDim2.fromScale(ms.stamina, 1)}):Play() -- Create The Tween Then Play It
end

UpdateStaminabar()--Update The Health Bar

ms.stamina:GetPropertyChangedSignal("Value"):Connect(UpdateStaminabar) --Update The Health Bar When The Health Change
ms.maxstamina:GetPropertyChangedSignal("Value"):Connect(UpdateStaminabar) --Update The Health Bar Wheb The MaxHealth Change

LocalScript (боевой сценарий):

local ms = require(game.ReplicatedStorage.ModuleScript)
if not ms then
    
    local ms = require(game.ReplicatedStorage:WaitForChild("ModuleScript"))
    
end 
local uis = game:GetService("UserInputService")
local cas = game:GetService("ContextActionService")
local rs = game:GetService("ReplicatedStorage")

local events = rs:WaitForChild("Events")
local hitbox = events:WaitForChild("Hitbox")

local plr = game.Players.LocalPlayer
local character = plr.Character
if not character then
    
    plr:WaitForChild("Character")
    
end
local humanoid = character.Humanoid
local animator = humanoid:WaitForChild("Animator")

local idle = animator:LoadAnimation(script:WaitForChild("idle"))
local jab = animator:LoadAnimation(script:WaitForChild("jab"))
local rightcross = animator:LoadAnimation(script:WaitForChild("rightstraight"))
local lefthook = animator:LoadAnimation(script:WaitForChild("lefthook"))
local righthook = animator:LoadAnimation(script:WaitForChild("righthook"))
local swingsfx = script:WaitForChild("Air swing")

local currentPunch = 0
local currentPunch2 = 0
local debounce1 = false
local debounce2 = false

local function onInputBegan(input)
    
    if debounce2 == true then return end
    if ms.stamina <= 0 then return end
    
    
    if input.KeyCode == Enum.KeyCode.Q then
        
        ms.stamina -= 20
        debounce2 = true
        humanoid.WalkSpeed = 0.5
        lefthook:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(4.5, 1), 7.5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        lefthook:Stop()
        task.wait(6)
        debounce2 = false
        
    end 
    
    if input.KeyCode == Enum.KeyCode.E then

        ms.stamina -= 20
        debounce2 = true
        humanoid.WalkSpeed = 0.5
        righthook:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(4.5, 1), 7.5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        righthook:Stop()
        task.wait(6)
        debounce2 = false

    end 
end

local function punch()
    
    if debounce1 then return end
    
    debounce1 = true
    if currentPunch == 0 then
        
        ms.stamina -= 10
        humanoid.WalkSpeed = 0.6
        jab:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(5.7, 1), 2.5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        jab:Stop()
        debounce1 = false
        
    elseif currentPunch == 1 then
        
        ms.stamina -= 10
        humanoid.WalkSpeed = 0.6
        rightcross:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(5.7, 1), 2.5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        rightcross:Stop()
        debounce1 = false
        
    elseif currentPunch == 2 then
        
        ms.stamina -= 10
        humanoid.WalkSpeed = 0.6
        jab:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(5.7, 1), 2.5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        jab:Stop()
        debounce1 = false
        
    elseif currentPunch == 3 then
        
        ms.stamina -= 10
        debounce2 = true
        humanoid.WalkSpeed = 0.6
        rightcross:Play()
        swingsfx:Play()
        hitbox:FireServer(Vector3.new(4, 5, 3), Vector3.new(5.7, 1), 5, 0.15)
        task.wait(0.5)
        humanoid.WalkSpeed = 10
        rightcross:Stop()
        debounce1 = false
        debounce2 = false
        
    end

    if currentPunch == 3  then
        
        currentPunch = 0
        debounce1 = true
        wait(2)
        debounce1 = false
        
    else
        
        currentPunch += 1
        
    end
    
end

cas:BindAction("Punch", punch, true, Enum.UserInputType.MouseButton1)
uis.InputBegan:Connect(onInputBegan)

МодульСкрипт:

local info = {}

    local stamina = 100
    local maxstamina = 100
    
return info

Я пытался сделать систему выносливости вместе с полосой выносливости, но они просто отказываются использовать локалы, а вместо этого распечатывают ошибки типа:

15:00:30.915 Players.Morelval1.PlayerGui.ScreenGui.StaminaBar.Frame.StaminaBar Сценарий: 12: попытка выполнить арифметику (div) с нулевым значением - Клиент - Сценарий StaminaBar: 12 15:00:32.505 Players.Morelval1.PlayerGui.Main.PunchScript:39: попытка сравнить ноль <= число - Клиент - PunchScript:39

Я ожидал, что с переменными можно будет взаимодействовать и использовать их.

Стоит ли изучать 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 называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
local ms = require(game.ReplicatedStorage.ModuleScript)
if not ms then
    
    local ms = require(game.ReplicatedStorage:WaitForChild("ModuleScript"))    
end

Второй ms является локальным для оператора if. Он затмевает первый ms. Таким образом, в случае сбоя первого требования вы сохраните возвращаемое значение второго требования в неправильной переменной.

Удалите локальное ключевое слово.

local ms = require(game.ReplicatedStorage.ModuleScript)
if not ms then
    
    ms = require(game.ReplicatedStorage:WaitForChild("ModuleScript"))    
end

Или просто

local ms = require(game.ReplicatedStorage.ModuleScript)
         or require(game.ReplicatedStorage:WaitForChild("ModuleScript"))    

Конечно, вам все равно следует проверить, успешна ли вторая попытка запроса, прежде чем продолжить.

Нет вашей реальной проблеме.

local info = {}

    local stamina = 100
    local maxstamina = 100
    
return info

Вы возвращаете сюда пустую таблицу. Таким образом, любая операция с индексом ms приведет к нулю.

Вы хотите сделать это:

local info = {

    stamina = 100,
    maxstamina = 100,
}
    
return info

или

local info = {}

info.stamina = 100
info.maxstamina = 100
    
return info

Поскольку stamina и maxstamina должны быть полями информации таблицы, а не локальными переменными вашего скрипта.

Тогда результатом вашего запроса require будет таблица { maxstamina = 100, stamina = 100 } вместо { }.

Спасибо за ответ! Знаете ли вы, как я могу определить, что значение выносливости изменилось? он говорит мне, что я не могу ссылаться на числа с помощью getpropertychangedsignal.

Relaxing Gaming 05.07.2024 14:26

вы можете реализовать это, используя метаметод __newindex в прокси-таблице. Прочтите это: lua.org/pil/13.4.4.html вы по сути замените информацию прокси-таблицей, которая действует как интерфейс для ваших данных. когда вы назначаете proxy.stamina, метод __newindex прокси сохраняет значение в вашей таблице данных и вызывает функцию уведомления.

Piglet 05.07.2024 14:49

Кажется, я ничего не могу понять. По сути, это означает, что я не могу просто получить доступ к переменной, изменить ее и определить, когда она изменится.

Relaxing Gaming 05.07.2024 15:40

@RelaxGaming, если вы не можете разобраться в метаметодах, вы всегда можете использовать IntValues ​​и их сигнал Изменено.

Kylaaa 05.07.2024 19:05

Первый ответ правильный, но если модуль не найден, то require не вернётся nil!

Используйте эту проверку при загрузке модуля:

local _, ms = pcall(require, game.ReplicatedStorage.ModuleScript) 

if type(ms)~ = "table" then 
 ms = require( game.ReplicatedStorage:WaitForChild("ModuleScript") )
end

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