概述(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)
| 方法名 | 扩展类型 | 返回类型 | 主要功能 | 典型用途 |
|---|---|---|---|---|
| CheckInputField | InputField | bool | 校验输入框是否合法(非空、非特殊字符) | 防止非法输入 |
| CheckInputField | TMP_InputField | bool | 同上,支持 TMP_InputField | TMP 表单验证 |
| SetTextContent | TMP_Text | void | 设置 TMP_Text 内容 | 快速更新 TMP 文本 |
| SetText | Text | void | 设置 uGUI Text 内容 | 快速更新普通文本 |
| SetTextWithSize | Text | void | 设置文本内容 + 字体大小 | 带样式的文本更新 |
| IsSingleSelected | List | bool | 判断是否正好选中一个 Toggle(单选) | 单选题验证 |
| IsMultipleSelected | List | bool | 判断是否选中了多个 Toggle(多选) | 多选题初步筛选 |
| IsAnswerCorrectByNames | List, HashSet | bool | 判断选中的 Toggle 名称集合与正确答案完全匹配 | 严格选择题答案比对 |
| SetText (GameObject) | GameObject | void | 设置子物体中的 Text 组件内容 | 提示/状态文本更新 |
| ReadTxtByText | TextAsset | void | 读取 TextAsset,按 Tab 分割解析为 int → string 字典 | 步骤/配置表读取 |
| ReadCsv | static | List<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 需先拷贝)。