虚幻4创建与加载自定义资源流程
在虚幻4项目开发中,通常我们会把一个模型资源或蓝图资源放进关卡中,这些资源会随着关卡的加载而加载。然而,如果开发者需要更精确地掌控特定资源的加载与卸载,就需要创建自定义资源。
首先介绍一下资源的概念和资源管理器
1.什么是资源?
当你打开虚幻引擎的编辑器时,在左下角的内容浏览器部分可以看到有很多不同命名的文件夹,这些文件夹中包含了项目开发中需要用到的不同类型的资源文件。开发者创建的资源被序列化后就会保存在资源文件中,程序运行时用到的资源反序列化后会被加载到内存中。
资源通常由虚幻引擎自动加载或卸载,如果某个时刻加载的资源过多,会导致程序出现加载等待和卡顿现象。
2.虚幻的资源类
虚幻4中表示资源的类叫做UDataAsset,这个类派生自UObject。
在虚幻4中,资源管理系统将所有的资源分为两类:主资源 和 次资源。
主资源是由资源管理器直接管理的资源,通过主资源的ID值,资源管理器可以直接控制主资源进行加载或卸载操作。
在工程项目设置中可以看到默认只有 UWorld 资源为主资源,而次资源只有在被主资源引用或使用后引擎才会进行加载。
主资源类(UPrimaryDataAsset)是UDataAsset的子类,在UPrimaryDataAsset类中实现了UObject的一个虚函数GetPrimaryAssetId(),函数的返回值是这个主资源的ID值,用来标识这个资源,资源管理器也是根据主资源的ID值来加载资源的。
3.资源管理器
资源管理器(Asset Manager)是一个单例类,负责管理主资源的注册与加载。
- 自定义资源管理器类
每个项目中都可以创建自定义资源管理器类,这个类应该派生自UAssetManager。资源管理器负责主资源的加载和卸载,维护资源的引用关系。在UAssetManager类中有很多重要的函数,比如:扫描一个指定路径下的某一类型的资源,根据资源ID获得资源保存的路径,根据资源类型或ID加载或卸载指定资源,获得资源包列表。
- 重写函数
开发者需要在自定义的资源管理器类中重写初始化函数和获得新类实例的函数
virtual void StartInitialLoading() override;
static UAssetManager& Get();
- 修改配置文件
在项目工程文件夹下找到Config,打开 DefaultEngine.ini 文件,增加以下项: [/Script/Engine.Engine] AssetManagerClassName=/Script/Module.UClassName 其中“Module”代表项目的模块名,漏掉会导致程序访问资源时崩溃。
4.创建自定义资源类
开发者可以在虚幻4中使用C++或蓝图创建派生自UPrimaryDataAsset的自定义主资源类,比如UItem游戏物品类。你可以在类中可以定义各种类属性,比如名字、描述、价格、数量、等级。
在自定义类中需要重写父类的虚函数GetPrimaryAssetId() ,这个函数可以根据传入的自定义资源类型参数得到资源的ID值,在后面的蓝图中会使用到这个函数。
5.创建数据资源
有了上面的自定义主资源类,就可以创建数据资源(Data Asset)了。在蓝图中右键选择杂项中的Data Asset,选择自定义主资源类。
打开Data Asset 在细节中开始设置资源的各项数据值,这里的设置会在资源被加载到内存后读取到。
7.在资源管理器中注册
打开工程设置中的资源管理器选项,在要扫描的主资源数组中添加元素来注册自定义资源,设置资源类型、基类、DataAsset的路径。
8.加载数据资源
创建游戏实例蓝图(Game Instance),在Init事件中通过资源类型获得主资源ID,并异步加载资源。
这样资源就被加载到内存中了,然后就可以通过引用来使用这些资源了。
本站部分内容来源于互联网,仅供学习交流之用。如有侵犯您的版权,请及时联系我们,我们将尽快处理。