GameFramework:StarForce资源讲解

资源处理是游戏中很重要的一模块。

提示:资源创建,资源初始化,资源加载,资源卸载,为整个流程。
关于资源怎么创建出来的,如何打ab资源,看这篇内容:GameFramework:AssetBunle 工具、配置、打包设置


文章目录


一、资源管理器

Editor Resource Mode 

 一看这个描述,还是不太清楚,到底是啥意思。

我们就查找所有引用,看看这个属性用到了那些地方,有啥作用。

1、如果勾选,就用EditorResourceHelper编辑器资源组件,反之ResourceManager资源管理器。

2、数据表组件,场景组件,声音组件等等,关于组件模块需要用到资源管理器的,都会设置资源管理器,对应使用。

 3、根据Editor Resource Mode 是否走,编译器模式流程。

GameEntry.Resource.ResourceMode 根据走单机,还是热更流程。

4、Editor Resource Mode  勾选启用自己并且编辑器资源组件赋值,反之不启用。

 EditorResourceComponent

编辑器资源组件,专门给在编译器下处理资源加载的,后面会单独介绍。

这个脚本并没有继承GameFrameworkModule类,猜想可能是EditorResourceMode勾选启用,更加方便吧。

二、资源初始化

编辑器模式下,并没有初始化资源这个流程。

1、在单机模式,会进入ProcedureInitResources,资源初始化就是从这个流程开始的。

GameEntry.Resource.InitResources(OnInitResourcesComplete);

接着往下看,咱们会看到这里,主要看ResourceManager,因为咱们走的并不是编辑器模式。

大家看到这个初始化。

 m_ResourceManager.m_ResourceHelper.LoadBytes

下面这个回调,才是重中之重。

OnLoadPackageVersionListSuccess

从StreamAssets读取GameFrameworkVersion.dat。

从GameFrameworkVersion.dat读取二进制文件流,利用回调函数解析资源信息,把资源分组加载到资源组里面。

下面我框起来的,这个大家注意看一下,后面加载资源就是从m_ResourceManager.m_AssetInfos  这里面拿出资源使用的,后面资源加载再详细的介绍。

2、热更的资源初始化。

ResourceManager.ResourceChecker 这个脚本里面。

 三、资源加载

加载资源这个操作,大家应该看到很多。

我们来看看怎么处理的,从ResourceManager.ResourceLoader脚本看看。

 从CheckAsset函数里面定位到GetAssetInfo 

 m_AssetInfos 这个大家看到过的,资源初始化这个字典就获取到了资源信息的数据。

四、资源卸载

走的资源池,释放的流程。可以看到各个模块的辅助器,都有调用,卸载资源的引用。

 我们来看个释放界面的例子。

m_ResourceComponent.UnloadAsset 卸载资源

Destroy 删除对象

先给对象回收,如果有释放就走释放的流程。

 释放之前会有,释放对象池中的可释放对象,流程筛选。

会从对象池释放对象。

总结

资源的初始化,资源加载,资源卸载,整个流程大家应该有了初步的了解,想要了解的更深入,还需要仔细的研究。

UnityGameFrameWork是一个非常优秀的游戏开发框架,而StarForce_ILRuntime是UnityGameFrameWork框架的一部分,用于实现热更新功能。下面是使用StarForce_ILRuntime实现热更新的步骤: 1. 在Unity中创建一个新的项目,并且导入UnityGameFrameWork框架。 2. 下载StarForce_ILRuntime插件,并且导入到Unity中。 3. 在Unity中创建一个新的场景,并且添加一个空物体作为热更新管理器。 4. 在热更新管理器下创建一个新的C#脚本,并且添加以下代码: ``` public class HotfixManager : MonoSingleton<HotfixManager> { private ILRuntime.Runtime.Enviorment.AppDomain m_AppDomain = null; public void LoadHotfixAssembly(byte[] assBytes, byte[] pdbBytes) { if (m_AppDomain != null) { m_AppDomain = new ILRuntime.Runtime.Enviorment.AppDomain(); } using (MemoryStream ms = new MemoryStream(assBytes)) { using (MemoryStream pdb = new MemoryStream(pdbBytes)) { m_AppDomain.LoadAssembly(ms, pdb, new Mono.Cecil.Pdb.PdbReaderProvider()); } } m_AppDomain.Invoke("Hotfix.Init", "Init", null, null); } public T Invoke<T>(string typeName, string methodName, object instance, params object[] args) { var type = m_AppDomain.LoadedTypes[typeName]; var method = type.GetMethod(methodName); if (method == null) { Debug.LogError($"Can't find method: {methodName} in type: {typeName}"); return default(T); } return (T)method.Invoke(instance, args); } } ``` 5. 在Unity中创建一个新的C#脚本,并且添加以下代码: ``` public static class Hotfix { public static void Init() { Debug.Log("Hotfix Init"); } public static int Add(int a, int b) { return a + b; } } ``` 6. 在Unity中打包项目,并且生成一个DLL文件。 7. 使用ILRuntime的工具将DLL文件转换成bytes和pdb文件。 8. 加载bytes和pdb文件到热更新管理器中: ``` var hotfixManager = HotfixManager.Instance; hotfixManager.LoadHotfixAssembly(assBytes, pdbBytes); ``` 9. 调用热更新代码: ``` var hotfixManager = HotfixManager.Instance; int result = hotfixManager.Invoke<int>("Hotfix", "Add", null, 1, 2); Debug.Log(result); ``` 以上就是使用StarForce_ILRuntime实现热更新的基本步骤。希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值