UIExtensions

5 阅读3分钟

概述(Overview)  

UIExtensions 是一个专注于 Unity UI 组件(uGUI & TextMeshPro) 的静态扩展方法集合,位于 PFGameFramework.Library 命名空间。

主要功能包括:

  • InputField / TMP_InputField 输入合法性校验
  • 文本内容快速设置(Text / TMP_Text)
  • Toggle 单选/多选状态判断 & 答案比对
  • 简单提示文本设置
  • TextAsset(.txt)逐行读取并解析为字典
  • CSV 文件读取(返回 List<List>)
  • 带字体大小的文本设置

适用于:

  • 表单输入验证
  • 动态文本更新
  • 选择题/单选多选逻辑判断
  • 配置表/步骤说明读取
  • CSV 数据导入

依赖

  • UnityEngine.UI
  • TMPro(TextMeshPro)
  • System.IO(CSV 文件读取)

方法一览(API Index)

方法名扩展类型返回类型主要功能典型用途
CheckInputFieldInputFieldbool校验输入框是否合法(非空、非特殊字符)防止非法输入
CheckInputFieldTMP_InputFieldbool同上,支持 TMP_InputFieldTMP 表单验证
SetTextContentTMP_Textvoid设置 TMP_Text 内容快速更新 TMP 文本
SetTextTextvoid设置 uGUI Text 内容快速更新普通文本
SetTextWithSizeTextvoid设置文本内容 + 字体大小带样式的文本更新
IsSingleSelectedListbool判断是否正好选中一个 Toggle(单选)单选题验证
IsMultipleSelectedListbool判断是否选中了多个 Toggle(多选)多选题初步筛选
IsAnswerCorrectByNamesList, HashSetbool判断选中的 Toggle 名称集合与正确答案完全匹配严格选择题答案比对
SetText (GameObject)GameObjectvoid设置子物体中的 Text 组件内容提示/状态文本更新
ReadTxtByTextTextAssetvoid读取 TextAsset,按 Tab 分割解析为 int → string 字典步骤/配置表读取
ReadCsvstaticList<List>读取 CSV 文件,返回二维字符串列表表格数据导入

方法详情

输入校验

CheckInputField

/// <summary>
/// 校验 InputField 是否合法(非空、非纯空白、非 , . -)
/// </summary>
public static bool CheckInputField(InputField inputField)

/// <summary>
/// 校验 TMP_InputField 是否合法
/// </summary>
public static bool CheckInputField(TMP_InputField inputField)

典型用法

if (!inputField.CheckInputField())
{
    // 显示错误提示
    errorText.SetText("请输入有效数字!");
}

当前规则:排除 ,、.、- 作为单独输入(防止小数点或负号误判),可根据需求扩展。


文本设置

SetTextContent / SetText

/// <summary>
/// 设置 TMP_Text 内容(简洁扩展)
/// </summary>
public static void SetTextContent(this TMP_Text text, string content)

/// <summary>
/// 设置 uGUI Text 内容
/// </summary>
public static void SetText(this Text text, string str)

/// <summary>
/// 设置 GameObject 下子级 Text 内容
/// </summary>
public static void SetText(GameObject go, string txt)

示例

scoreText.SetTextContent($"得分:{score}");
hintObj.SetText("操作成功!");

SetTextWithSize

/// <summary>
/// 设置 uGUI Text 内容并同时设置字体大小
/// </summary>
public static void SetTextWithSize(this Text text, string str, int size)

Toggle 相关判断

IsSingleSelected

/// <summary>
/// 判断 Toggle 列表中是否**正好**只有一个被选中(严格单选)
/// </summary>
public static bool IsSingleSelected(List<Toggle> toggles)

IsMultipleSelected

/// <summary>
/// 判断 Toggle 列表中是否至少有两个被选中
/// </summary>
public static bool IsMultipleSelected(List<Toggle> toggles)

IsAnswerCorrectByNames

/// <summary>
/// 判断选中的 Toggle 名称集合与正确答案名称集合是否完全相等(顺序无关)
/// </summary>
public static bool IsAnswerCorrectByNames(List<Toggle> toggles, HashSet<string> correctNames)

推荐做法:Toggle 的 name 字段设置为选项唯一标识(如 "A"、"B"、"正确答案1" 等)。

示例

var correct = new HashSet<string> { "A", "C" };
if (toggles.IsAnswerCorrectByNames(correct))
{
    Debug.Log("答案正确!");
}

文件读取

ReadTxtByText(TextAsset → Dictionary)

/// <summary>
/// 从 TextAsset 读取 Tab 分隔文本,解析为 int → string 字典(跳过首行)
/// </summary>
public static void ReadTxtByText(this TextAsset textAsset, Dictionary<int, string> dictionary)

文件格式示例(UTF-8):

1	第一步:点击开始
2	第二步:观察变化

ReadCsv

/// <summary>
/// 读取本地 CSV 文件,返回 List<List<string>>(二维列表)
/// </summary>
/// <param name="file">文件完整路径</param>
/// <param name="rowsNum">文件行数(用于防止末尾空行)</param>
/// <param name="splitChar">列分隔符(通常 ,)</param>
public static List<List<string>> ReadCsv(string file, int rowsNum, char splitChar = ',')

返回格式

  • 外层 List:每一行
  • 内层 List:每行拆分后的单元格

注意:使用 File.ReadAllText,适用于本地文件(Editor 或 StreamingAssets 需先拷贝)。