3.2资源加载管理机制
本项目不提倡将常用资源放在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
和excel
都将由底层框架HSFramework进行资源管理。
在执行菜单项配置表/[GEN DATA]
或配置表/[GEN DATA(强制更新)]
时,将打包数据放置在StreamingAssets
目录下,打包为
excel所有配置表 -> hsframework_cevalues.bytes
lua -> hsframework_lua.bytes
在运行时分别由ConfigTable.InitSync()
和LuaManager.Init()
进行资源加载。