博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++实现动态加载资源(一)
阅读量:6118 次
发布时间:2019-06-21

本文共 3010 字,大约阅读时间需要 10 分钟。

hot3.png

第一种: 如果该蓝图有C++类(或者说是从C++类创建的蓝图)

ATemp* spawnActor = GetWorld()->SpawnActor(ATemp::StaticClass());

所有的加载资源并创建到场景中的方式都离不开SpawnActor这一句代码.如果你的蓝图包含了C++类,那么可以直接访问类的StaticClass

第二种: 通过ConstructorHelpers来加载(只能在类的构造函数中使用)

static ConstructorHelpers::FClassFinder bpClass(TEXT("/Game/BluePrint/TestObj"));if(bpClass.Class != NULL){GetWorld()->SpawnActor(bpClass.Class);}

FClassFinder是一个结构体,其中的Class成员变量是TSubClassof类型的.所以我们只需要SpawnActor(bpClass.Class)就可以生成我们要的东西了 该方法在一开头的地方就先检查了是否在构造函数中CheckIfIsInConstructor,另外一点,该变量必须是static

struct FClassFinder{TSubclassOf Class;FClassFinder(const TCHAR* ClassToFind){CheckIfIsInConstructor(ClassToFind);FString PathName(ClassToFind);StripObjectClass(PathName, true);Class = ConstructorHelpersInternal::FindOrLoadClass(PathName, T::StaticClass());ValidateObject(*Class, PathName, *PathName);}bool Succeeded(){return !!*Class;}};

第三种: 通过FStringAssetReference来加载

FStringAssetReference asset = "Blueprint'/Game/BluePrint/TestObj.TestObj'";UObject* itemObj = asset.ResolveObject();UBlueprint* gen = Cast
(itemObj);if (gen != NULL){AActor* spawnActor = GetWorld()->SpawnActor
(gen->GeneratedClass);}

FStringAssetReference类的作用主要是通过一个字符串,找到该字符串所对应的资源.或者通过给定的资源,找到该资源所对应的在项目中的路径,也就是前面所说的字符串 其中,asset.ResolveObject就是查找字符串对应的资源,返回一个UObejct,我们通过将其转化成UBlueprint类型然后再取的他的GenerateClass即可

第四种:  通过StaticLoadObject来加载

UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/BluePrint/TestObj.TestObj'"));if (loadObj != nullptr){UBlueprint* ubp = Cast(loadObj);AActor* spawnActor = GetWorld()->SpawnActor(ubp->GeneratedClass);UE_LOG(LogClass, Log, TEXT("Success"));}

 

 

✔动态加载资源:Material跟Texture(材质和贴图)

示例1:

动态加载的工具方法

UTexture2D* MyTextureLoader::LoadTextureFromPath(const FString& Path) {     if (Path.IsEmpty()) return NULL;      return Cast
(StaticLoadObject(UTexture2D::StaticClass(), NULL, *(Path))); }

调用:

FString PathToLoad = "/Game/Textures/YourStructureHere"; UTexture2D* tmpTexture = LoadTextureFromPath(PathToLoad);

 

示例2:

加载Material和Texture

struct FConstructorStatics {     ConstructorHelpers::FObjectFinderOptional
TextureFinder; ConstructorHelpers::FObjectFinderOptional
MaterialFinder; FConstructorStatics() : TextureFinder(TEXT("Texture2D'/Game/Textures/2DBackground.2DBackground'")) , MaterialFinder(TEXT("Material'/Game/Materials/DynamicTextureMaterial.DynamicTextureMaterial'")) { } }; static FConstructorStatics ConstructorStatics; Texture = ConstructorStatics.TextureFinder.Get(); UMaterial* Material = ConstructorStatics.MaterialFinder.Get(); DynamicMaterial = UMaterialInstanceDynamic::Create(Material, this);

设置调用加载好的Material和Texture:

DynamicMaterial->SetTextureParameterValue(FName("DynamicTexture"), Texture);Mesh->SetMaterial(0, DynamicMaterial);

 

如果资源永不再使用,想销毁资源对象,代码如下:

Texture2D* mytex; //这里假设mytex合法有效mytex->ConditionalBeginDestroy();mytex = NULL;GetWorld()->ForceGarbageCollection(true);

转载于:https://my.oschina.net/robslove/blog/796112

你可能感兴趣的文章
JAVA GC
查看>>
codeforce 599B Spongebob and Joke
查看>>
3springboot:springboot配置文件(外部配置加载顺序、自动配置原理,@Conditional)
查看>>
9、Dubbo-配置(4)
查看>>
前端第七天
查看>>
BZOJ 2190[SDOI2008]仪仗队
查看>>
图解SSH原理及两种登录方法
查看>>
[转载] 七龙珠第一部——第058话 魔境圣地
查看>>
【总结整理】JQuery基础学习---样式篇
查看>>
查询个人站点的文章、分类和标签查询
查看>>
基础知识:数字、字符串、列表 的类型及内置方法
查看>>
JSP的隐式对象
查看>>
P127、面试题20:顺时针打印矩阵
查看>>
JS图片跟着鼠标跑效果
查看>>
[SCOI2005][BZOJ 1084]最大子矩阵
查看>>
学习笔记之Data Visualization
查看>>
Leetcode 3. Longest Substring Without Repeating Characters
查看>>
【FJOI2015】金币换位问题
查看>>
数学之美系列二十 -- 自然语言处理的教父 马库斯
查看>>
Android实现自定义位置无标题Dialog
查看>>