You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity TMPro InputField小数点分隔符问题:PC与移动端输入不兼容

解决Unity TMPro InputField跨平台小数分隔符问题

方案一:自定义输入验证(推荐,完全可控)

直接绕过TMPro自带的区域依赖验证,强制统一使用点号作为小数分隔符:

  1. 在Inspector里把InputField的Content Type改成Standard,避免自带验证拦截点号
  2. 挂载以下脚本,实现自定义字符过滤:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 01:43:16