Unity TMPro InputField小数点分隔符问题:PC与移动端输入不兼容
解决Unity TMPro InputField跨平台小数分隔符问题
方案一:自定义输入验证(推荐,完全可控)
直接绕过TMPro自带的区域依赖验证,强制统一使用点号作为小数分隔符:
- 在Inspector里把InputField的Content Type改成
Standard,避免自带验证拦截点号 - 挂载以下脚本,实现自定义字符过滤:
using TMPro; using UnityEngine; public class DecimalInputHandler : MonoBehaviour { public TMP_InputField inputField; void Awake() { inputField.onValidateInput += ValidateDecimalInput; inputField.text = "0.0"; // 初始化默认值 } private char ValidateDecimalInput(string text, int charIndex, char addedChar) { // 允许数字和退格键 if (char.IsDigit(addedChar) || addedChar == '\b') return addedChar; // 只允许一个点号,且不能在输入开头 if (addedChar == '.' && !text.Contains(".") && text.Length > 0) return addedChar; // 拦截所有无效字符 return '\0'; } // 读取输入值的方法 public float GetDecimalValue() { float.TryParse(inputField.text, out float value); return value; } }
方案二:强制修改TMPro的文化设置
如果不想改Content Type,可以通过代码强制让TMPro使用不变文化(忽略系统区域),固定小数分隔符为点号:
using TMPro; using System.Globalization; using UnityEngine; public class ForceDotSeparator : MonoBehaviour { public TMP_InputField inputField; void Start() { // 设置文本组件的文化信息为不变文化 inputField.textComponent.cultureInfo = CultureInfo.InvariantCulture; // 同步修改输入验证器的文化设置 if (inputField.inputValidator is TMP_DigitValidator validator) { validator.cultureInfo = CultureInfo.InvariantCulture; } } }
注意事项
- 方案一完全脱离系统区域限制,跨平台行为一致,适合需要统一输入格式的场景
- 方案二保留了
Decimal Number的其他验证逻辑(比如禁止非数字字符),但需要确保在InputField初始化后执行代码 - 读取值时建议用
float.Parse(inputField.text, CultureInfo.InvariantCulture),避免不同系统下的解析错误
内容的提问来源于stack exchange,提问作者CheckerT
相关产品推荐
相关产品推荐

