Skip to content

3.2资源加载管理机制

CGGG edited this page Jun 23, 2021 · 6 revisions

静态资源

本项目不提倡将常用资源放在Resources文件夹下,由于其会影响整个游戏的启动速度,并且游戏在客户端安装后无法再进行修改。 所以除了在场景内直接拖入的资源以外,所以有的动态资源加载均不使用诸如 Resources.Load 方法。

目前静态打包资源包括各个游戏场景、战斗场景以及其依赖的各种GameObject及相关挂接的Component。

动态的加载资源

本项目动态资源加载使用Addressable实现,游戏中大部分直接对Addressable的访问均简单封装了方法,位于Assets/Scripts/Jyx2ResourceHelper.cs中。

小说明:Addressable是unity提供的对Assetbundle等调用方法更高一级的封装,它可以在Editor模式下使用AssetDatabase模式加载资源,从而不需要进行打包操作,提高开发效率;而在运行时使用Assetbundle,并且提供框架自行解决分包管理、打包依赖等。具体可以阅读Unity官方资源和开源代码进行学习。

请注意Addressable提供的资源加载方法大部分为异步访问,所以在开发时需要考虑编写程序符合异步逻辑,比如一个常见的异步调用的例子如下:

//Jyx2ResourceHelper.cs中

    static public void GetRoleHeadSprite(string path, Action<Sprite> callback)
    {
        string p = ("Assets/BuildSource/head/" + path + ".png");
        Addressables.LoadAssetAsync<Sprite>(p).Completed += r => { callback(r.Result); };
    }

...

//具体调用例子:

    private void ShowCharacter(string roleHeadPath,int roleId)
    {
        ChangePosition(roleId);
        if (string.IsNullOrEmpty((roleHeadPath)))
        {
            RoleHeadImage_Image.gameObject.SetActive(false);
        }
        else
        {
            RoleHeadImage_Image.gameObject.SetActive(false);
            Jyx2ResourceHelper.GetRoleHeadSprite(roleHeadPath, (head) =>
            {
                RoleHeadImage_Image.gameObject.SetActive(true);
                RoleHeadImage_Image.sprite = head;
            });
        }
    }

预缓存资源

其中在游戏里一些经常被访问的资源,我们在启动游戏时进行了缓存,可以在Assets/BuildSource/PreCachedPrefabs.txt中来定义,具体加载逻辑可以查看Jyx2ResourceHelper.Init()方法,该方法将在游戏启动场景加载之前被调用。

对象池

一些经常在游戏内被加载和卸载的物体,我们使用对象池来进行生命周期管理。具体可以参阅 LeanPool相关代码

Lua和配置表

游戏内实现逻辑的Luaexcel都将由底层框架HSFramework进行资源管理。

在执行菜单项配置表/[GEN DATA]配置表/[GEN DATA(强制更新)]时,将打包数据放置在StreamingAssets目录下,打包为

excel所有配置表 -> hsframework_cevalues.bytes
lua -> hsframework_lua.bytes

在运行时分别由ConfigTable.InitSync()LuaManager.Init()进行资源加载。