【Unity3D小技巧】Unity3D中实现对InputField的自定义输入限制实例

推荐阅读

大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。

一、前言

InputField是UGUI的文本输入框,自带的有输入类型控制。

一共有以下几种类型:

类型 功能
Standard 标准,可以输入任意字符
Auto corrected 自动更正,可以自动更正用户输入,并建议输入内容
Integer Number 整数,只允许输入整数
Decimal Number 小数,允许输入数字和小数点后一位
Alphanumeric 字母数字,允许字母和数字。无法输入符号
Name 名称(支持中文)自动将每个单词的首字母大写。
Email Address 电子邮件地址,允许您输入最多包含一个@符号的字母数字字符串
Password 密码:用 * 表示输入的字符,从而隐藏输入内容。允许输入任意字符
Pin 密码:用 * 号表示输入的字符,从而隐藏输入内容。仅允许输入整数
Custom 自定义:允许自定义行类型、输入类型、默认键盘类型、字符验证

自定义:

Line Type:行类型,允许输入单行或者多行,或者Enter 键来新建行,继续输入

Input Type:输入类型,有三个选项,任何字符、自动修正、密码类型

Keyboard Type:它可以在用户选中输入框时,调出不同类型的键盘

但是,总有一些对于输入框的特殊需求,比如说:

我只想输入汉字、字母、数字和字母、只想输入几十个字符,这种特殊需求就需要特殊处理。

下面,就是对于一些特殊的需求进行实现的例子,仅供参考。

二、正文

2-1、实现只能输入汉字,并且只能输入40个字符

代码参考:

csharp 复制代码
using System.Collections;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Windows;

public class InputFieldControl1 : MonoBehaviour
{
    public InputField input;
    public Text m_Info;

    void Start()
    {
        InputSet("^[A-Za-z0-9]+$",40);
    }

    /// <summary>
    /// 输入设置
    /// </summary>
    /// <param name="pattern">正则表达式</param>
    /// <param name="limit">输入字符限制</param>
    public void InputSet(string pattern,int limit)
    {
        input.characterLimit = limit;//限制输入
        input.onValueChanged.AddListener((str) => OnInputFieldValueChange(str, pattern));
    }

    public void OnInputFieldValueChange(string inputInfo, string _InputType)
    {
        m_Info.text = "还可输入" + (input.characterLimit - input.text.Length) + "字";
        Regex reg = new Regex(_InputType);
        if (reg.IsMatch(inputInfo))
        {
            input.text = inputInfo;
        }
        else
        {
            if (input.text == "")
            {
                input.text = "";
            }
            else
            {
                input.text = inputInfo.Substring(0, inputInfo.Length - 1);
            }
        }
    }
}

搭建UI,拖动卡槽中:

运行结果:

2-2、只能输入字母和数字,限制70个字符

代码参考:

csharp 复制代码
using System.Collections;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;

public class InputFieldControl2 : MonoBehaviour
{
    public InputField input;
    public Text m_Info;

    void Start()
    {
        InputSet("^[A-Za-z0-9\u4e00-\u9fbb\\p{P}]+$", 70);
    }

    /// <summary>
    /// 输入设置
    /// </summary>
    /// <param name="pattern">正则表达式</param>
    /// <param name="limit">输入字符限制</param>
    public void InputSet(string pattern,int limit)
    {
        input.characterLimit = limit;//限制输入
        input.onValueChanged.AddListener((str) => OnInputFieldValueChange(str, pattern));
    }

    public void OnInputFieldValueChange(string inputInfo, string _InputType)
    {
        m_Info.text = "还可输入" + (input.characterLimit - input.text.Length) + "字";
        Regex reg = new Regex(_InputType);
        if (reg.IsMatch(inputInfo))
        {
            input.text = inputInfo;
        }
        else
        {
            if (input.text == "")
            {
                input.text = "";
            }
            else
            {
                input.text = inputInfo.Substring(0, inputInfo.Length - 1);
            }
        }
    }
}

代码差不多,就是修改了正则表达式,然后改了一下输入的字符数。

搭建UI,拖动卡槽中:

运行结果:

2-3、限制只能输入浮点数,保留小数点后一位

代码参考:

csharp 复制代码
using System.Collections;
using System.Text.RegularExpressions;
using UnityEngine;
using UnityEngine.UI;

public class InputFieldControl3 : MonoBehaviour
{
    public InputField input;

    void Start()
    {
        InputSet("^(0|[1-9]\\d*)(\\.\\d{0,1})?$");
    }

    /// <summary>
    /// 输入设置
    /// </summary>
    /// <param name="pattern">正则表达式</param>
    /// <param name="limit">输入字符限制</param>
    public void InputSet(string pattern)
    {
        input.onValueChanged.AddListener((str) => OnInputFieldValueChange(str, pattern));
    }

    public void OnInputFieldValueChange(string inputInfo, string _InputType)
    {
        Regex reg = new Regex(_InputType);
        if (reg.IsMatch(inputInfo))
        {
            input.text = inputInfo;
        }
        else
        {
            if (input.text == "")
            {
                input.text = "";
            }
            else
            {
                input.text = inputInfo.Substring(0, inputInfo.Length - 1);
            }
        }
    }
}

还是使用了正则表达式。

当输入的值是匹配的值,那么就正常赋值给InputFiled的text;

如果不是,就操作字符串去掉最后输入的值。

三、后记

如果觉得本篇文章有用别忘了点个关注,关注不迷路,持续分享更多Unity干货文章。


你的点赞就是对博主的支持,有问题记得留言:

博主主页有联系方式。

博主还有跟多宝藏文章等待你的发掘哦:

专栏 方向 简介
Unity3D开发小游戏 小游戏开发教程 分享一些使用Unity3D引擎开发的小游戏,分享一些制作小游戏的教程。
Unity3D从入门到进阶 入门 从自学Unity中获取灵感,总结从零开始学习Unity的路线,有C#和Unity的知识。
Unity3D之UGUI UGUI Unity的UI系统UGUI全解析,从UGUI的基础控件开始讲起,然后将UGUI的原理,UGUI的使用全面教学。
Unity3D之读取数据 文件读取 使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。
Unity3D之数据集合 数据集合 数组集合:数组、List、字典、堆栈、链表等数据集合知识分享。
Unity3D之VR/AR(虚拟仿真)开发 虚拟仿真 总结博主工作常见的虚拟仿真需求进行案例讲解。
Unity3D之插件 插件 主要分享在Unity开发中用到的一些插件使用方法,插件介绍等
Unity3D之日常开发 日常记录 主要是博主日常开发中用到的,用到的方法技巧,开发思路,代码分享等
Unity3D之日常BUG 日常记录 记录在使用Unity3D编辑器开发项目过程中,遇到的BUG和坑,让后来人可以有些参考。
相关推荐
mxwin13 小时前
Unity Shader 半透明物体为什么不能写入深度缓冲?
unity·游戏引擎·shader
晚枫歌F14 小时前
三层时间轮的实现
网络·unity·游戏引擎
望眼欲穿的程序猿15 小时前
苹果系统使用VsCode开发QT
ide·vscode·编辑器
咸鱼永不翻身16 小时前
Lua脚本事件检查工具
unity·lua·工具
其实防守也摸鱼17 小时前
带你了解与配置phpmyadmin
笔记·安全·网络安全·pdf·编辑器·工具·调试
leo__52017 小时前
单载波中继系统资源分配算法MATLAB仿真程序
算法·matlab·unity
Rsun0455118 小时前
Oracle中常用语法
编辑器
努力长头发的程序猿19 小时前
Unity使用ScriptableObject序列化资源
unity·游戏引擎
mxwin19 小时前
Unity Shader 手写基于 PBR 的 URP Lit Shader 核心光照计算
unity·游戏引擎·shader
小贺儿开发19 小时前
Unity3D 智能云端数字标牌系统
unity·阿里云·人机交互·视频·oss·广告·互动