首页 > 解决方案 > 桌面模拟器 Lua 错误:“尝试对字符串值执行算术运算”

问题描述

首先,一些上下文(除了我对编码还很陌生)......我正在开发一个棋盘游戏,对于所说游戏的桌面模拟器版本,我创建了一系列 UI每当玩家按下桌子中间的按钮时弹出的菜单操作(玩家必须首先宣布他们将为特定工作提交投标,并且他们的按钮按下启动该工作的 RFP 投标过程)。玩家按下按钮后,UI 会提示所有其他玩家是否愿意参与相关工作的竞标。

投标意向菜单

然后所有参与的投标人输入他们的有效投标——连同他们的市场声誉,这会影响他们在投标过程中从工作中收取的总体费用——然后脚本找到最低投标来确定工作获胜者。

出价调整/提交菜单

此出价调整菜单的前两个字段是可编辑的,而第三个(费用)是只读的。费用数字会根据其他两个输入的值实时调整。费用的计算公式是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

我假设错误是由删除数值后的 nil 值引起的,因此我尝试添加一些条件逻辑,在执行任何算术之前将前两个字段中的 nil 值重置为 0。然而,这并没有奏效,所以我有点难过。

这是相关的 Lua 代码(在按钮的 ttslua 文件中):

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 代码(在全局 UI 文件中):

<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 创意工坊中。

非常感谢!

标签: xmlluatabletop-simulator

解决方案


正如约瑟夫指出的那样,effective_bid_blue = value并且reputation_blue = value需要更改为effective_bid_blue = tonumber(value)and reputation_blue = tonumber(value),因为“值”参数变量只要不是输入的数字或nil.


推荐阅读