Во-первых, немного контекста (в дополнение к тому факту, что я новичок в программировании) ... Я разрабатываю настольную игру, а для версии Tabletop Simulator указанной игры я создал серия действий меню пользовательского интерфейса, которые всплывают всякий раз, когда игрок нажимает кнопку в середине стола (игрок должен сначала объявить, что он будет подавать заявку на конкретную работу, и нажатие их кнопки инициирует процесс запроса предложения для этого работа). После того, как игрок нажимает кнопку, пользовательский интерфейс предлагает всем другим игрокам, хотят ли они участвовать в торгах на рассматриваемую работу.
Меню назначения ставок
Затем все участвующие участники торгов вводят свою эффективную ставку - вместе со своей репутацией на рынке, которая влияет на общую плату, которую они получат за работу, если они выиграют процесс торгов, - а затем сценарий находит самая низкая ставка для определения победителя задания.
Меню корректировки ставок / подачи
Первые два поля этого меню корректировки ставок доступны для редактирования, а третье (плата) только для чтения. Номер комиссии корректируется в режиме реального времени в соответствии с любыми значениями, введенными в два других. Формула для расчета комиссии: effective bid + (reputation * 5) = fee
.
Проблема, с которой я сталкиваюсь, заключается в том, что всякий раз, когда игрок удаляет значение из одного из первых двух полей (например, выделяя его и нажимая клавишу возврата), в окне чата игры появляется следующая ошибка:
Error in Script (Custom Assetbundle - 64453f) function <adjustReputationBlue>:
chunk_3:(555,4-55): attempt to perform arithmetic on a string value
Я работал в предположении, что ошибка вызвана нулевым значением, как только числовое значение было удалено, поэтому я попытался добавить несколько условных лог c, который сбрасывает нулевые значения в первых двух полях на 0 перед выполнением любых арифметических операций c. Однако это не сработало, поэтому я немного озадачен.
Вот соответствующий код Lua (который находится в файле tts lua кнопки):
function adjustBidBlue(Player, value, id)
effective_bid_blue = value
feeAdjustBlue()
end
function adjustReputationBlue(Player, value, id)
reputation_blue = value
feeAdjustBlue()
end
function feeAdjustBlue()
if effective_bid_blue == nil then
effective_bid_blue = 0
end
if reputation_blue == nil then
reputation_blue = 0
end
fee_blue = effective_bid_blue + reputation_blue * 5
UI.setAttribute("fee_blue", "text", fee_blue)
end
И вот соответствующий код XML (который находится в глобальном файле пользовательского интерфейса):
<InputField
id="effective_bid_blue"
active="false"
characterLimit="4"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-285 -150"
onValueChanged="64453f/adjustBidBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="reputation_blue"
active="false"
characterLimit="2"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="-95 -150"
onValueChanged="64453f/adjustReputationBlue"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
visibility="Blue"
width="85">
</InputField>
<InputField
id="fee_blue"
active="false"
characterValidation="Integer"
fontSize="26"
height="44"
offsetXY="95 -150"
readOnly="true"
shadow="rgba(0,0,0,0.5)"
shadowDistance="2 -2"
showAnimation="FadeIn"
animationDuration="0.25"
width="85"
visibility="Blue">
</InputField>
Если вы хотите увидеть полный код, вот он на GitHub . И вот он в мастерской Steam .
Спасибо огромное!