Unity C#中TMP输入框onValueChanged循环触发问题求助
Unity双向货币兑换输入框循环触发问题解决方案
解决这个循环触发的核心思路是加一个更新锁——当我们主动修改其中一个输入框内容时,暂时屏蔽另一个输入框的事件响应,避免互相触发。以下是具体实现步骤:
1. 添加更新锁变量
在脚本中声明一个私有布尔变量,用来标记当前是否正在更新输入框内容:
private bool isUpdatingFields = false;
2. 修改转换方法,加入锁判断
更新你的两个转换逻辑方法,在执行修改操作前先检查锁状态,避免循环触发:
public void SellBuyUSDChange() { // 正在更新时直接返回,阻断循环 if (isUpdatingFields) return; // 上锁,标记开始更新流程 isUpdatingFields = true; // 直接使用已引用的输入框,无需重复GetComponent string ctctxt = ClientSellorBuyCTCInput.text; // 用TryParse处理非数字输入,避免报错 if (double.TryParse(ctctxt, NumberStyles.Any, CultureInfo.InvariantCulture, out double ctcAmount)) { double ctcToUsd = ctcAmount / CTCValue; Debug.Log($"{ctcAmount} CTC is worth {ctcToUsd} USD"); ClientSellorBuyUSDInput.text = ctcToUsd.ToString(); } // 解锁,恢复正常事件响应 isUpdatingFields = false; } public void SellBuyCTCChange() { if (isUpdatingFields) return; isUpdatingFields = true; string usdtxt = ClientSellorBuyUSDInput.text; if (double.TryParse(usdtxt, NumberStyles.Any, CultureInfo.InvariantCulture, out double usdAmount)) { double usdToCtc = CTCValue * usdAmount; Debug.Log($"{usdAmount} USD is worth {usdToCtc} CTC"); ClientSellorBuyCTCInput.text = usdToCtc.ToString(); } isUpdatingFields = false; }
3. 优化输入框引用(可选但推荐)
确保你的ClientSellorBuyCTCInput和ClientSellorBuyUSDInput是直接声明为TMP_InputField类型的变量,并在Unity Inspector面板中拖入对应的输入框组件,这样就无需每次调用GetComponent<TMP_InputField>(),提升代码效率:
[SerializeField] private TMP_InputField ClientSellorBuyCTCInput; [SerializeField] private TMP_InputField ClientSellorBuyUSDInput; [SerializeField] private double CTCValue; // 汇率值,比如1 CTC = 5 USD的话,这里设为5
原理说明
当你在CTC输入框输入内容时,触发SellBuyUSDChange方法:
- 首先上锁,此时即使修改USD输入框的text触发了它的
onValueChanged事件,SellBuyCTCChange方法会因为检测到isUpdatingFields为true直接返回,不会再修改CTC输入框,彻底打破循环。 - 转换完成后解锁,后续的输入操作可以正常触发转换逻辑。
内容的提问来源于stack exchange,提问作者TheTinniDev
相关产品推荐
相关产品推荐

