前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >虚幻运行时导入资产:泛型与模板的妙用

虚幻运行时导入资产:泛型与模板的妙用

作者头像
Jean
发布2020-11-12 15:20:35
1.6K0
发布2020-11-12 15:20:35
举报
文章被收录于专栏:Web行业观察Web行业观察

runtime导入资源

目录

C++创建蓝图函数库LoadObject 参数利用蓝图泛型代码Demo

  1. C++创建蓝图函数库
  2. LoadObject 参数
  3. 利用蓝图泛型
  4. 代码
  5. Demo

在虚幻运行时,动态地选择资源文件(资产/Asset),读取并导入到UE系统,有若干种方法,比如importFileAsTexture2D可以读取图片文件封装成Texture对象,如果要读取任意的uasset文件,找了一大圈发现只有LoadObject方法能实现。UAsset是一种可以序列化的UObject对象,包括所有常用的类型(网格体、材质、纹理...),序列化的结果就是uasset/umap文件。所以LoadObject方法是一种通用的方法,用来动态导入静态资源。

C++创建蓝图函数库

为了创建静态方法暴露给蓝图使用,最好的办法是继承UBlueprintFunctionLibrary,同时使用static修饰函数,否则必须实例化才能使用。

LoadObject 参数

  • Class:uasset的类型,可以填父类,这里推荐填UObject,通过泛型决定最终子类,因为LoadObject返回值永远是UObject。
  • InOuter:导入后所属的容器(类似浏览器Dom上的某个元素)
  • InName:资产路径,注意是相对路径以/Game开头,相对于Content Browser
  • FileName:暂时没搞清楚是干嘛的。
  • LoadFlags:导入的一些可选项,具体参考ELoadFlags枚举类
  • Sandbox:导入前会先在内存中检索已存在的实例,猜测这个参数是为了限制检索范围

利用蓝图泛型

C++泛型机制通过template模板动态地调整接口类型,蓝图也有类似的机制:DeterminesOutputType,利用这个宏可以根据某个参数的类型改变返回值的类型。有了泛型,就可以写一个通用的蓝图节点,不用为每一种资产类型单独写一个节点。除此之外,我们需要一个特殊的模板类TSubclassOf来让蓝图出现下拉选框,TSubclassOf的选择对象是UClass反射类,选择的范围是某个指定类的所有子类。由于本次实验主要需要StaticMesh和Texture这两个子类,我们选择UStreamableRenderAsset作为他们俩的公共父类。这个类的继承层次如下:

代码语言:javascript
复制
UObjectBase
----UObjectBaseUtility
--------UObject
------------UStreamableRenderAsset
----------------USkeletalMesh
----------------UStaticMesh
----------------UTexture

代码

利用UFUNCTION暴露一个静态方法LoadAssetFromPath,总共2个参数:Path是资产的相对路径,TargetClass是资产的类型。函数输出对应类型的资产。

代码语言:javascript
复制
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
// must be last #include
#include "AssetLoader.generated.h"
UCLASS()
class CPPTEST_API UAssetLoader : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
    UFUNCTION(BlueprintCallable, meta = (DisplayName = "LoadAssetFromPath", DeterminesOutputType = "TargetClass"), Category = "LoadAsset")
    static UObject* LoadAssetFromPath(const FString& Path, TSubclassOfTargetClass) {
        UObject* loadedObject = LoadObject( NULL, *(Path));
        // will be converted to TargetClass automatically
        return loadedObject;
    };
};

Demo

加载一个static mesh,并赋给某个static mesh component:

加载一个texture,并赋给一个动态材质实例(MID):

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WebHub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • runtime导入资源
    • C++创建蓝图函数库
      • LoadObject 参数
        • 利用蓝图泛型
          • 代码
            • Demo
            相关产品与服务
            文件存储
            文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档