1. 文件系统操作
文件系统操作是游戏开发中的基础功能,用于管理游戏数据、配置文件、保存游戏进度等。掌握这些操作可以帮助开发者更好地组织和管理游戏资源。
1.1 创建目录(IFileManager::MakeDirectory)
创建目录是组织游戏文件结构的基本操作,常用于初始化游戏数据结构、创建用户特定的存储空间等。
// 构建目录路径
FString Dir = FPaths::ProjectDir() / TEXT("Content/Levels");
// 创建目录
IFileManager::Get().MakeDirectory(*Dir, true);
参数说明:
FPaths::ProjectDir()
: 返回项目的根目录。TEXT()
: 用于创建平台无关的字符串字面量。/
: 重载的路径组合操作符,用于连接路径。IFileManager::Get()
: 获取文件管理器单例。MakeDirectory(*Dir, true)
:- 第一个参数: 目录路径的指针(
*
用于获取FString
的底层TCHAR*
)。 - 第二个参数:
true
表示递归创建,如果父目录不存在也会被创建。
使用场景和注意事项:
- 使用场景:初始化游戏文件夹结构、为特定用户创建存储目录。
- 注意事项:确保路径合法,避免与系统保留路径冲突。
1.2 文件创建与写入(FFileHelper::SaveStringToFile)
文件创建和写入操作用于保存游戏数据、用户设置、日志等信息。这是实现存档功能、记录调试信息的关键。
// 构建文件路径
FString FilePath = Dir / TEXT("LevelData.txt");
// 准备要写入的内容
FString Content = TEXT("Level configuration data");
// 将内容写入文件
FFileHelper::SaveStringToFile(Content, *FilePath);
SaveStringToFile
参数说明:
- 第一个参数: 要写入的字符串内容。
- 第二个参数: 目标文件的路径。
使用场景和注意事项:
- 使用场景:保存游戏设置、记录游戏日志、存档功能。
- 注意事项:确保文件路径有效,避免覆盖重要文件。
1.3 文件删除(IFileManager::Delete)
文件删除操作用于清理临时文件、移除旧的存档数据等。在管理游戏存储空间和维护数据一致性时非常有用。
// 构建要删除的文件路径
FString FileToDelete = FPaths::ProjectDir() / TEXT("OldData.txt");
// 执行删除操作
IFileManager::Get().Delete(*FileToDelete);
Delete
参数说明:
- 唯一参数: 要删除的文件路径。
1.4 目录删除(IFileManager::DeleteDirectory)
目录删除用于移除整个文件夹结构,常用于卸载DLC内容、清理缓存数据或重置游戏状态。
// 构建要删除的目录路径
FString FolderToDelete = FPaths::ProjectDir() / TEXT("OldLevels");
// 执行目录删除操作
IFileManager::Get().DeleteDirectory(*FolderToDelete, true, true);
DeleteDirectory
参数说明:
- 第一个参数: 要删除的目录路径。
- 第二个参数:
true
表示递归删除(删除子目录和文件)。 - 第三个参数:
true
表示即使是只读文件也强制删除。
1.5 文件复制(IFileManager::Copy)
文件复制操作在创建备份、分发更新包或复制模板文件时非常有用。它允许开发者在保留原始数据的同时创建文件的副本。
// 定义复制进度回调结构
struct FCopyProgress : public FCopyProgress
{
virtual bool Poll(float Fraction) override
{
// 输出复制进度
UE_LOG(LogTemp, Log, TEXT("Copy Progress: %.2f%%"), Fraction * 100);
return true; // 返回true继续复制,false中止复制
}
};
// 设置源文件和目标文件路径
FString SourceFile = FPaths::ProjectDir() / TEXT("SourceData.txt");
FString DestFile = FPaths::ProjectDir() / TEXT("BackupData.txt");
// 创建进度回调实例
FCopyProgress Progress;
// 执行文件复制
IFileManager::Get().Copy(*DestFile, *SourceFile, true, &Progress);
Copy
参数说明:
- 第一个参数: 目标文件路径。
- 第二个参数: 源文件路径。
- 第三个参数:
true
表示允许覆盖已存在的文件。 - 第四个参数: 进度回调对象指针,用于跟踪复制进度。
2. 进程管理与系统交互
进程管理和系统交互功能允许游戏与操作系统和其他应用程序进行交互。这对于启动外部工具、处理更新或与第三方软件集成非常重要。
2.1 创建外部进程(FPlatformProcess::CreateProc)
创建外部进程允许游戏启动其他应用程序,如启动游戏编辑器、运行更新程序或打开第三方工具。
// 设置要启动的程序路径
FString ProgramPath = TEXT("C:/Tools/Editor.exe");
// 设置启动参数
FString Params = TEXT("-debug -fullscreen");
// 创建并启动进程
FProcHandle ProcHandle = FPlatformProcess::CreateProc(
*ProgramPath, // 程序路径
*Params, // 命令行参数
true, // 启动后不阻塞
false, // 不输出到控制台
false, // 不作为窗口程序启动
nullptr, // 不需要获取进程ID
0, // 使用默认优先级
nullptr, // 使用默认工作目录
nullptr // 不需要管道
);
CreateProc
参数详解:
- 程序路径
- 命令行参数
- 是否立即返回而不等待进程启动
- 是否创建单独的控制台窗口
- 是否作为Windows应用程序启动(隐藏控制台)
- 指向接收进程ID的变量指针
- 进程优先级
- 工作目录(为nullptr时使用当前目录)
- 管道对象指针(用于重定向标准输入输出)
2.2 URL启动(FPlatformProcess::LaunchURL)
URL启动功能使游戏能够打开网页链接,用于显示在线文档、打开社区论坛或进行网页认证等操作。
// 定义要打开的URL
FString URL = TEXT("https://docs.unrealengine.com");
// 启动默认浏览器并打开URL
FPlatformProcess::LaunchURL(*URL, nullptr, nullptr);
LaunchURL
参数说明:
- URL字符串
- 错误信息输出(这里设为nullptr表示不需要)
- 额外的命令行参数(这里设为nullptr表示没有)
2.3 进程控制(FPlatformProcess::WaitForProc、FPlatformProcess::IsProcRunning)
进程控制功能允许游戏监视和管理它启动的外部进程,对于确保外部工具正确运行和关闭非常重要。
// 等待进程完成
FPlatformProcess::WaitForProc(ProcHandle);
// 检查进程是否仍在运行
if (FPlatformProcess::IsProcRunning(ProcHandle))
{
UE_LOG(LogTemp, Log, TEXT("Process is still running"));
}
WaitForProc
参数:进程句柄,表示要等待的进程。IsProcRunning
参数:进程句柄,返回bool值表示进程是否仍在运行。
使用场景和注意事项:
- 使用场景:监视外部工具运行状态。
- 注意事项:确保正确处理进程句柄,避免资源泄漏。
2.4 系统休眠(FPlatformProcess::Sleep)
系统休眠功能用于在执行耗时操作时暂停游戏线程,避免阻塞用户界面或造成游戏卡顿。
// 定义休眠时间(秒)
float SleepTime = 2.0f;
// 暂停执行指定的时间
FPlatformProcess::Sleep(SleepTime);
Sleep
参数:休眠时间,单位为秒。
使用场景和注意事项:
- 使用场景:暂停线程、避免界面卡顿。
- 注意事项:避免休眠时间过长,影响用户体验。
2.5 获取应用程序信息(FPlatformProcess::GetApplicationName)
获取应用程序信息功能用于调试和日志记录,帮助开发者确认当前运行的是哪个应用程序实例。
// 获取当前应用程序名称
FString AppName = FPlatformProcess::GetApplicationName(0);
// 输出应用程序名称到日志
UE_LOG(LogTemp, Log, TEXT("Current Application: %s"), *AppName);
GetApplicationName
参数:
- 0表示获取当前进程名称。
- 非0值可用于获取其他正在运行的进程的名称(具体行为可能因平台而异)。
Windows: 通常可以通过进程ID获取其他进程的名称,但需要相应的权限。
Linux: 需要访问 /proc
文件系统,读取进程的 cmdline
或 comm
文件。
MacOS: 通过系统调用获取进程信息,也可能需要适当的权限。