Skip to content

ialex32x/unityfs

Repository files navigation

unityfs

与旧版本(0.9.4)不兼容

提供一个轻量实用的资源和文件访问层, 简化资源热更新项目的开发流程. 开发过程中可以使用编辑器模式直接访问工程内的任意资源, 并在发布时无缝切换到通过 AssetBundle 访问资源. 配置文件与脚本代码独立压缩打包, 运行期直接读取压缩包访问文件, 且不受 Unity 文件命名限制.

目标特性

  • 资源管理
    • 异步加载资源/场景
    • 自动管理资源加载/卸载
    • 自动管理资源更新
    • 资源对象池
  • 下载
    • 按优先级下载资源
    • 断点续传
    • 多下载源重试
    • 支持边玩边下
    • 空闲时自动后台下载
  • 打包
    • 可视化打包管理
    • 按条件分包
    • 按资源数量分包
    • 根据资源访问分析自动配置首包
    • 资源包加密
    • 冗余资源报告

进度

功能基本完成.

Examples

初始化

    // 可用下载地址列表 (会依次重试, 次数超过地址数量时反复重试最后一个地址)
    // 适用于 CDN 部署还没有全部起作用时, 退化到直接文件服务器地址
    var urls = UnityFS.Utils.Helpers.URLs(
        // "http://localhost:8081/",
        "http://localhost:8080/"
    );

    // 下载存储目录
    var dataPath = string.IsNullOrEmpty(Application.temporaryCachePath) ? Application.persistentDataPath : Application.temporaryCachePath;
    var localPathRoot = Path.Combine(dataPath, "bundles");
    Debug.Log($"open localPathRoot: {localPathRoot}");

    UnityFS.ResourceManager.Initialize(developMode, localPathRoot, urls, this);
    UnityFS.ResourceManager.Open();

资源加载

UnityFS.ResourceManager 返回的资源会自动管理加载卸载与资源包依赖:

  • IFileSystem
  • UAsset

当资源实例不存在强引用时将进入GC流程, 对应资源包将被自动卸载.

加载文件 (脚本/配置等)

IFileSystem 中的文件可以同步加载 (实际对应zip包中的文件).

// 获取核心脚本代码包
var fs = UnityFS.ResourceManager.FindFileSystem("Assets/Examples/Scripts/code.js");
fs.completed += self =>
{
    // 可以在这里由脚本接管后续启动流程
    // 需要保持对 fs 的引用, 无引用时将在GC后自动释放对应包
    ScriptEngine.Initialize(fs); 
    ScriptEngine.RunScript("Assets/Examples/Scripts/code.js");

    // 判断文件是否存在
    var exists = fs.Exists("Assets/Examples/not_exist.file");
    Debug.Log($"file exists? {exists}");

    // 读取文件内容 (zip包中的文件可以同步读取)
    var data = fs.ReadAllBytes("Assets/Examples/Config/test.txt");
    Debug.Log(System.Text.Encoding.UTF8.GetString(data));
};
// 可以用 LoadAsset 载入文件内容 (通常位于zip包中)
var testFile = UnityFS.ResourceManager.LoadAsset("Assets/Examples/Config/test.txt");
testFile.completed += self =>
{
    var text = System.Text.Encoding.UTF8.GetString(testFile.ReadAllBytes());
    Debug.Log($"用 LoadAsset 形式加载一个文件: {text}");
};

加载资源 (异步)

// 方式1. 得到原始 UAsset 对象
UnityFS.ResourceManager.LoadAsset("Assets/Examples/Prefabs/Cube 1.prefab", self =>
{
    UnityFS.Utils.AssetHandle.CreateInstance(self, 5.0f);
});

// 方式2. 通过辅助方法直接创建 GameObject (返回的是一个代理 GameObject)
UnityFS.ResourceManager.Instantiate("Assets/Examples/Prefabs/Cube 1.prefab").DestroyAfter(10.0f);

加载场景 (异步)

// LoadScene/LoadSceneAdditive 分别对应 Single/Additive 场景加载模式
var scene = UnityFS.ResourceManager.LoadSceneAdditive("Assets/Examples/Scenes/test2.unity");
scene.completed += self =>
{
    Debug.Log("scene loaded");
};

StartCoroutine(UnityFS.Utils.Helpers.InvokeAfter(() =>
    {
        // 场景对象需要手工卸载 (异步完成)
        // 场景对应的资源包则在所有场景实例对象GC后自动卸载
        scene.UnloadScene(); 
        scene = null;
    }, 20f)
);

打包编辑器

editorwindow

资源冗余分析

buildreport

Unity 版本

Unity 2017.4+

License

MIT