概述(Overview)
SystemExtensions 是一个 Unity 系统级通用扩展方法 静态类,位于 PFGameFramework.Library 命名空间。
主要功能覆盖:
- 游戏退出、全屏设置
- 时间格式转换(秒 ↔ HH:mm:ss)
- 时间戳获取
- 文件编码转换(GB2312 → UTF-8)
- 场景加载快捷方法
- 当前时间 / 游戏运行时间获取
- StreamingAssets 文件打开/下载
- 二进制 & JSON 序列化/反序列化
- 简单网络通信(TCP 客户端:连接、发送、接收)
- 固定长度包(1024字节)的分包发送机制
适用于:
- 系统控制(退出、全屏)
- 时间显示与计算
- 本地文件处理
- 数据存档/读档
- 轻量级 C/S 网络通信(教学、实验、远程控制等场景)
依赖:
- UnityEngine、UnityEngine.SceneManagement、UnityEngine.UI
- Cysharp.Threading.Tasks(UniTask 异步支持)
- System.Net.Sockets(TCP 通信)
方法一览(API Index)
| 方法名 | 类型 | 异步 | 返回类型 | 主要功能 | 典型用途 |
|---|---|---|---|---|---|
| QuitGame | static | 否 | void | 退出游戏(Application.Quit) | 退出按钮 |
| FullScreen | static | 否 | void | 设置为全屏并使用最高分辨率 | 首页/启动时全屏 |
| SecondsToHH_MM_SS | static | 否 | string | 秒数 → "HH:mm:ss" 格式字符串 | 倒计时、计时器显示 |
| hh_mm_ssToSeconds | static | 否 | int | "HH:mm:ss" → 总秒数 | 时间字符串解析 |
| GetTimeStamp | static | 否 | long | 获取当前 UTC 时间戳(毫秒) | 记录时间、日志、同步 |
| ChangeFormat | static | 否 | void | 将文件从 GB2312 编码转为 UTF-8(覆盖原文件) | 处理老旧中文文本文件 |
| LoadScene | static | 否 | void | 为指定名称按钮绑定场景加载事件 | 按钮跳转场景 |
| GetNowTime / GetGameTime | static | 否 | void | 打印当前时间 / 游戏运行时间 | 调试 |
| DownLoadFileFromApp | static | 否 | void | 打开 StreamingAssets 中的文件(模拟下载) | 打开说明文档、CSV 等 |
| OpenFile | static | 否 | void | 使用系统默认程序打开指定路径文件 | 打开本地文件 |
| Serialize / DeSerialize | static | 否 | byte[] / T | 二进制序列化/反序列化(BinaryFormatter) | 对象存档(旧方式) |
| SerializeViaJson / DeSerializeViaJson | static | 否 | byte[] / T | JSON 序列化/反序列化(JsonUtility) | 推荐的轻量存档方式 |
| WriteObjToJsonFile | static | 否 | bool | 对象 → JSON → 保存到文件 | 数据存档 |
| ReadJsonFileAsObject | static | 否 | T | 从 JSON 文件读取并反序列化为对象 | 数据读档 |
| ConnectToServerAsync | static | 是 | UniTask<(bool, Socket, string)> | 异步连接指定 IP:Port 的 TCP 服务器 | 建立连接 |
| SendMsgAsync | static | 否 | (bool, string) | 发送文本命令(前置 3 位长度 + 内容) | 发送简单指令 |
| ReceiveMessageEveryUpdate | static | 是 | UniTaskVoid | 每帧接收服务器数据,解析命令(带缓冲区防粘包) | 持续接收消息 |
| SendBytes | static | 是 | UniTask | 分包发送固定 1024 字节包(A/P/E 标志) | 大数据可靠传输 |
方法详情
时间相关
SecondsToHH_MM_SS
/// <summary>
/// 将秒数转换为 "HH:mm:ss" 格式字符串
/// </summary>
/// <param name="number">秒数(float)</param>
/// <returns>格式化时间字符串</returns>
public static string SecondsToHH_MM_SS(float number)
示例:
"3600".SecondsToHH_MM_SS() → "01:00:00"
hh_mm_ssToSeconds
/// <summary>
/// 将 "HH:mm:ss" 格式字符串转换为总秒数
/// </summary>
public static int hh_mm_ssToSeconds(string timeStr)
GetTimeStamp
/// <summary>
/// 获取当前 UTC 时间戳(毫秒)
/// </summary>
public static long GetTimeStamp()
文件与编码
ChangeFormat
/// <summary>
/// 将指定文件从 GB2312 编码转换为 UTF-8(覆盖原文件)
/// </summary>
public static void ChangeFormat(string sourceFilePath)
用途:处理老旧中文 TXT/CSV 文件乱码问题。
DownLoadFileFromApp / OpenFile
public static void DownLoadFileFromApp(string fileName) // StreamingAssets/xxx
public static void OpenFile(string fileName) // 任意路径
用途:打开说明文档、CSV、PDF 等文件。
序列化 / 存档
WriteObjToJsonFile / ReadJsonFileAsObject
/// <summary>
/// 对象 → JSON → 保存到文件
/// </summary>
public static bool WriteObjToJsonFile<T>(string path, T obj)
/// <summary>
/// 从 JSON 文件读取并反序列化为对象
/// </summary>
public static T ReadJsonFileAsObject<T>(string path)
推荐:使用 JsonUtility 进行轻量存档,性能好且易读。
网络通信(TCP 客户端)
ConnectToServerAsync
/// <summary>
/// 异步连接指定 IP 和端口的 TCP 服务器
/// </summary>
/// <returns>(连接成功与否, Socket 对象, 错误信息)</returns>
public static async UniTask<(bool state, Socket socket, string info)> ConnectToServerAsync(string ip, int port)
SendMsgAsync
/// <summary>
/// 发送文本命令(前 3 位为内容长度 + 内容)
/// </summary>
public static (bool state, string error) SendMsgAsync(string cmdStr, ref Socket clientSocket)
ReceiveMessageEveryUpdate
/// <summary>
/// 每帧接收服务器数据,自动处理粘包(使用 ReceiveBuffer 缓冲)
/// 解析后调用 ParseString(str)
/// </summary>
public static async UniTaskVoid ReceiveMessageEveryUpdate(Socket clientSocket, CancellationToken ct)
SendBytes
/// <summary>
/// 可靠分包发送大数据(每包 1024 字节,A/P/E 标志)
/// </summary>
/// <returns>1=成功, 0=失败</returns>
public static async UniTask<int> SendBytes(List<byte> SendListBuffer, Socket sendSocket)
包格式:
- A:完整包(1023 字节有效数据)
- P:部分包(含长度前缀 + 补齐字节)
- E:结束包(标志结束)