02-07-原理篇-文件系统与跨平台适配

0 阅读7分钟

文件系统与跨平台适配

篇章:02-原理篇 · 基础 阅读时间:约 40 分钟 前置知识:了解 Unity 基本资源加载方式


一、引言

Unity 游戏需要在多个平台上运行,包括 Android、iOS、PC、WebGL 等。不同平台的文件系统结构和访问方式各不相同,因此需要跨平台适配。本章将深入解析 Unity 文件系统和跨平台适配的原理和方法,结合 YooAsset 的实际实现进行详细说明。

跨平台适配是资源管理中的重要挑战。通过合理的抽象层设计、平台特定的优化和完善的错误处理机制,可以实现资源管理在所有 Unity 支持平台上的稳定运行。


二、Unity 文件系统

2.1 文件系统类型

Unity 支持多种文件系统:

  • StreamingAssets:只读目录,打包时原样拷贝
  • PersistentDataPath:可读写目录,用于存储用户数据
  • TemporaryCachePath:临时缓存目录,可被系统清理
  • Application.dataPath:应用程序目录

StreamingAssets 详解

StreamingAssets 是 Unity 提供的只读目录,打包时原样拷贝到目标平台。不同平台的 StreamingAssets 路径不同:

平台StreamingAssets 路径
Androidjar:file://$applicationPath!.apk!/assets/bin/Data/StreamingAssets
iOS$applicationPath.app/StreamingAssets
PC/Mac/Linux Standalone$applicationPath_Data/StreamingAssets
WebGL$applicationPath/StreamingAssets

PersistentDataPath 详解

PersistentDataPath 是 Unity 提供的可读写目录,用于存储用户数据。不同平台的 PersistentDataPath 路径不同:

平台PersistentDataPath 路径
Android$applicationFilesDir
iOS$applicationHome/Documents
PC/Mac/Linux Standalone$persistentDataPath
WebGL不支持

TemporaryCachePath 详解

TemporaryCachePath 是 Unity 提供的临时缓存目录,可被系统清理。它适合用于存储临时文件,如下载的资源缓存。

Application.dataPath 详解

Application.dataPath 是 Unity 应用程序的目录,包含应用程序的核心文件。它通常是只读的,不适合用于存储用户数据。

2.2 文件访问 API

Unity 提供了多种文件访问 API:

// 读取 StreamingAssets 文件
string path = Path.Combine(Application.streamingAssetsPath, "mybundle.bundle");
#if UNITY_ANDROID
    WWW www = new WWW(path);
    yield return www;
    byte[] data = www.bytes;
#elif UNITY_IOS
    WWW www = new WWW(path);
    yield return www;
    byte[] data = www.bytes;
#else
    byte[] data = File.ReadAllBytes(path);
#endif

// 写入 PersistentDataPath 文件
string filePath = Path.Combine(Application.persistentDataPath, "mybundle.bundle");
File.WriteAllBytes(filePath, data);

文件访问 API 详解

Unity 提供了多种文件访问 API,如 File.ReadAllTextFile.WriteAllBytesDirectory.GetFiles 等。这些 API 在不同平台上的行为可能有所不同,需要特别注意。


三、跨平台适配

3.1 跨平台挑战

跨平台适配面临以下挑战:

  • 文件系统差异:不同平台的文件系统结构和访问方式不同
  • 路径分隔符:Windows 使用 \\,Unix 使用 /
  • 大小写敏感:Windows 不区分大小写,Unix 区分大小写
  • 文件权限:不同平台的文件权限不同

文件系统差异详解

不同平台的文件系统结构和访问方式不同。例如,Android 使用 Linux 文件系统,iOS 使用沙盒文件系统,WebGL 使用 IndexedDB。这些差异需要在代码中进行处理。

路径分隔符详解

Windows 使用 \\ 作为路径分隔符,而 Unix 系统使用 /。在跨平台代码中,需要使用 Path.DirectorySeparatorCharPath.AltDirectorySeparatorChar 来处理路径分隔符。

大小写敏感详解

Windows 不区分大小写,而 Unix 系统区分大小写。在跨平台代码中,需要使用 StringComparison.OrdinalIgnoreCase 来处理字符串比较。

文件权限详解

不同平台的文件权限不同。例如,Android 和 iOS 使用 Unix 风格的文件权限,而 Windows 使用 NTFS 风格的文件权限。在跨平台代码中,需要特别注意文件权限的处理。

3.2 跨平台解决方案

使用 Unity 提供的 API

Unity 提供了跨平台的文件访问 API,如 Application.streamingAssetsPathApplication.persistentDataPath 等。

使用条件编译

#if UNITY_ANDROID
    // Android 特定代码
#elif UNITY_IOS
    // iOS 特定代码
#elif UNITY_EDITOR
    // Editor 特定代码
#else
    // 其他平台
#endif

使用抽象层

通过抽象层,将平台特定的代码封装起来,提供统一的接口。


四、YooAsset 文件系统

4.1 YooAsset 文件系统架构

YooAsset 提供了可扩展的文件系统架构:

YooAsset 文件系统架构
├── IFileSystem 接口
│   ├── OpenRead
│   ├── OpenWrite
│   └── Delete
├── 内置文件系统
│   ├── StreamingAssetsFileSystem
│   ├── PersistentFileSystem
│   ├── CacheFileSystem
│   └── RemoteFileSystem
└── 自定义文件系统
    └── 实现 IFileSystem 接口

IFileSystem 接口详解

IFileSystem 接口是 YooAsset 文件系统的核心接口,它定义了文件访问的基本方法,如 OpenReadOpenWriteDelete 等。

内置文件系统详解

YooAsset 提供了多种内置文件系统,如 StreamingAssetsFileSystemPersistentFileSystemCacheFileSystemRemoteFileSystem 等。这些文件系统可以组合使用,实现灵活的文件访问策略。

自定义文件系统详解

对于特殊平台,可以实现自定义文件系统。只需要实现 IFileSystem 接口,并将其注册到 YooAsset 系统中即可。

4.2 YooAsset 文件系统 API

// 创建文件系统参数
var fileSystemParameters = new FileSystemParameters()
{
    QueriDownloadAfterUpdate = true,
    FileExtensionHandler = new ExtensionModuleFileExtensionHandler()
};

// 创建缓存文件系统
var cacheFileSystem = new CacheFileSystem(fileSystemParameters);

// 创建 Package
var package = YooAsset.CreatePackage("DefaultPackage");
var initOp = package.InitializeAsync(cacheFileSystem);
yield return initOp;

文件系统参数详解

文件系统参数(FileSystemParameters)是 YooAsset 文件系统的配置参数,它定义了文件系统的行为,如是否查询下载、文件扩展名处理器等。

缓存文件系统详解

缓存文件系统(CacheFileSystem)是 YooAsset 提供的缓存文件系统,它可以将文件缓存在本地,提高文件访问速度。


五、网络适配

5.1 网络协议

不同的网络协议适用于不同的场景:

  • HTTP/HTTPS:通用协议,适合大多数场景
  • WebSocket:双向通信,适合实时数据
  • FTP:大文件传输

HTTP/HTTPS 详解

HTTP/HTTPS 是最常用的网络协议,适合大多数场景。YooAsset 默认使用 HTTP/HTTPS 协议进行资源下载。

WebSocket 详解

WebSocket 是双向通信协议,适合实时数据交换。YooAsset 支持通过 WebSocket 进行资源下载。

FTP 详解

FTP 是大文件传输协议,适合大文件下载。YooAsset 支持通过 FTP 进行资源下载。

5.2 连接管理

合理的连接管理可以提高下载效率:

  • 连接池:复用网络连接,减少连接开销
  • 并发控制:控制并发下载数量,避免网络拥塞
  • 超时处理:设置合理的超时时间,处理网络异常

连接池详解

连接池是复用网络连接的技术,可以减少连接开销,提高下载效率。YooAsset 默认使用连接池进行资源下载。

并发控制详解

并发控制是控制并发下载数量的技术,可以避免网络拥塞,提高下载稳定性。YooAsset 支持配置并发下载数量。

超时处理详解

超时处理是设置合理的超时时间,处理网络异常的技术。YooAsset 支持配置超时时间,超时后自动重试。

5.3 断点续传

断点续传可以提高下载的稳定性和效率:

  • 下载记录:记录已下载的字节数
  • 断点恢复:下载中断后从断点继续下载
  • 完整性校验:下载完成后校验文件的完整性

下载记录详解

下载记录是记录已下载的字节数,以便在下载中断后从断点继续下载。YooAsset 默认使用下载记录进行断点续传。

断点恢复详解

断点恢复是下载中断后从断点继续下载的技术。YooAsset 支持断点续传,可以确保下载的稳定性和效率。

完整性校验详解

完整性校验是下载完成后校验文件的完整性,确保文件没有被损坏。YooAsset 支持 CRC 校验,可以确保文件的完整性。


六、总结

跨平台适配是 Unity 游戏开发中的重要环节。合理的跨平台适配策略可以确保游戏在不同平台上正常运行。

在实际项目中,建议:

  1. 使用 Unity 提供的 API:避免平台特定的代码
  2. 使用条件编译:处理平台特定的逻辑
  3. 使用抽象层:封装平台特定的代码
  4. 充分测试:在所有目标平台上充分测试

通过深入理解文件系统和跨平台适配的原理,我们可以更好地利用 Unity 的资源管理功能,开发出性能更优、体验更好的游戏。


下一篇异步加载与性能优化