По какой-то причине все мои локальные переменные в скрипте модуля кажутся нулевыми, без точного объяснения или решения. Локальный сценарий (скрипт шкалы выносливости):
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
Я ожидал, что с переменными можно будет взаимодействовать и использовать их.
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 }
вместо { }
.
вы можете реализовать это, используя метаметод __newindex в прокси-таблице. Прочтите это: lua.org/pil/13.4.4.html вы по сути замените информацию прокси-таблицей, которая действует как интерфейс для ваших данных. когда вы назначаете proxy.stamina, метод __newindex прокси сохраняет значение в вашей таблице данных и вызывает функцию уведомления.
Кажется, я ничего не могу понять. По сути, это означает, что я не могу просто получить доступ к переменной, изменить ее и определить, когда она изменится.
@RelaxGaming, если вы не можете разобраться в метаметодах, вы всегда можете использовать IntValues и их сигнал Изменено.
Первый ответ правильный, но если модуль не найден, то require
не вернётся nil
!
Используйте эту проверку при загрузке модуля:
local _, ms = pcall(require, game.ReplicatedStorage.ModuleScript)
if type(ms)~ = "table" then
ms = require( game.ReplicatedStorage:WaitForChild("ModuleScript") )
end
Спасибо за ответ! Знаете ли вы, как я могу определить, что значение выносливости изменилось? он говорит мне, что я не могу ссылаться на числа с помощью getpropertychangedsignal.