-
ue4动态加载资源路径信息
2019-11-22 14:30:50ue4动态加载资源 -
ue4 动态加载资源
2019-12-11 11:24:15动态加载非蓝图资源如图片声音等使用LoadObject<资源类型>(nullptr, TEXT("资源路径引用")) 加载蓝图资源获得蓝图类 LoadClass<蓝图的类型(nullptr, TEXT("资源路径引用_C")) 这里需要注意就是资源的路径...动态加载非蓝图资源 如图片 声音等使用LoadObject<资源类型>(nullptr, TEXT("资源路径引用"))
加载蓝图资源 获得蓝图类 LoadClass<蓝图的类型(nullptr, TEXT("资源路径引用_C")) 这里需要注意就是资源的路径需要额外加上_C
例如
UClass* result1 = LoadClass<ACharacter>(nullptr, TEXT("Blueprint'/Game/Map/Test/tt.tt_C'"));
根据名称动态加载UClass
UClass* result = FindObject<UClass>(ANY_PACKAGE, TEXT("PersonCharacterBase"));
-
UE4 动态加载资源,运行内存优化
2019-04-15 18:09:09UE4中可能使用到DataAsset或者存储相关模型数据,基于UE4的运行机制,当前地图包含的所有资源都会在进入该地图时候统一全部加载,这就导致了如果我们在这个地图中只使用到了一部分DataAsset中的数据,但是依然会把...UE4中可能使用到DataAsset或者存储相关模型数据,基于UE4的运行机制,当前地图包含的所有资源都会在进入该地图时候统一全部加载,这就导致了如果我们在这个地图中只使用到了一部分DataAsset中的数据,但是依然会把其中所有的数据全部加载进来,模型,贴图,材质等,无端增加了许多内存开销。
但是其实UE4本身还给出了另外一种方法。比如用 TSoftObjectPtr<UStaticMesh> 代替 UStaticMesh* ,用TSoftObjectPtr标识的资源只会引用到该资源的链接,但是不会自动加载该资源,需要使用时候再手动加载和释放来达到降低内存消耗的目标。
USTRUCT(Blueprintable) struct FTestMeshInfo : public FTableRowBase //声明为TableRow是为了方便使用DataTable来管理数据 { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DA") int32 MeshID; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "DA") TSoftObjectPtr<UStaticMesh> MeshResource; FTestMeshInfo() { MeshID = 0; MeshResource = FSoftObjectPath(""); } };//本文为CSDN博主执手画眉弯原创,未经允许不得转载!
//资源信息列表 TArray<FTestMeshInfo> TestMeshInfoList; //加载的资源列表 TArray<FSoftObjectPath> ObjToLoadList;
//加载资源 bool UTestGameInstance::LoadMeshRes(const TArray<int32> &LoadMeshIDList) { for(auto MeshID: LoadMeshIDList) { for(auto &MeshInfo : TestMeshInfoList) { if(MeshID == MeshInfo.MeshID) { ObjToLoadList.AddUnique(MeshInfo.MeshResource.ToSoftObjectPath()); } } } //加载资源 if (ObjToLoadList.Num() > 0) { UAssetManager::GetStreamableManager().RequestAsyncLoad(ObjToLoadList, FStreamableDelegate::CreateUObject(this, &UTestGameInstance::LoadMeshResCallBack), 0, true); return true; } else { return false; } } //加载完成回调 void UTestGameInstance::LoadMeshResCallBack() { GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, TEXT("Load Succeed!")); }//本文为CSDN博主执手画眉弯原创,未经允许不得转载! //卸载资源 void UTestGameInstance::UnloadMeshRes() { for (auto &Obj : ObjToLoadList) { UAssetManager::GetStreamableManager().Unload(Obj); } ObjToLoadList.Empty(); }
-
ue4 异步加载关卡_UE4静态/动态加载资源方式
2020-12-08 16:40:03UE4静态/动态加载资源方式 本文将详细介绍使用UE4静态加载和动态加载的实现方式 静态加载 ConstructorHelpers::FClassFinder()和FObjectFinder()静态加载指的是在构造函数中完成的加载方式,这种方式的弊端明显,...UE4静态/动态加载资源方式
本文将详细介绍使用UE4静态加载和动态加载的实现方式
静态加载
ConstructorHelpers::FClassFinder()和FObjectFinder()
静态加载指的是在构造函数中完成的加载方式,这种方式的弊端明显,就是需要写死路径,一旦改变路径读取失败很容易造成程序崩溃
API接口:ConstructorHelpers::FClassFinder()和FObjectFinder()
以下为测试代码:创建一个Actor类
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS() class TWODTEST_API AMyActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AMyActor(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; };
核心代码为
#include "UObject/ConstructorHelpers.h" //以下需要写在构造函数中 UTexture2D *texture; static ConstructorHelpers::FObjectFinder<UTexture2D> Texture(TEXT("/Game/StarterContent/Textures/T_Spark_Core.T_Spark_Core")); //安全判定 if (Texture.Succeeded()) { texture = Texture.Object; } // Fill out your copyright notice in the Description page of Project Settings. #include "MyActor.h" #include "UObject/ConstructorHelpers.h" // Sets default values AMyActor::AMyActor() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; UTexture2D *texture; static ConstructorHelpers::FObjectFinder<UTexture2D> Texture(TEXT("/Game/StarterContent/Textures/T_Spark_Core.T_Spark_Core")); if (Texture.Succeeded()) { texture = Texture.Object; } } // Called when the game starts or when spawned void AMyActor::BeginPlay() { Super::BeginPlay(); } // Called every frame void AMyActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); }
动态加载
LoadObject() vs StaticLoadObject()
API接口:LoadObject vs StaticLoadObject
这种方式未提供蓝图接口,要想在蓝图中调用需要用C++进行封装
动态加载一般使用LoadClass()和LoadObject() 这两个API,示例如下:
UMaterial *mt = LoadObject<UMaterial>(nullptr, TEXT("/Game/Map/Materials/grass.grass")); UMaterial *mt = Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), nullptr, TEXT("/Game/Map/Materials/grass.grass")));
LoadObject和StaticLoadObject的区别:
用VS速览定义发现,LoadObject是对StaticLoadObject的一层封装
有人会认为LoadObject要比StaticLoadObject的速度快一点,毕竟又多封装一次,但实际上我们发现,LoadObject使用了inline进行修饰,因此实际和StaticLoadObject没什么区别,只是参数不一样而已。
实例测试:
创建一个FunctionLibrary,写入以下代码:(主要参考LoadTextureFromPath函数实现)// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "Engine/Texture2D.h" #include "LoadFile.generated.h" /** * */ UCLASS() class TWODTEST_API ULoadFile : public UBlueprintFunctionLibrary { GENERATED_BODY() UFUNCTION(BlueprintCallable, meta = (DisplayName = "LoadTextureFromPath", keywords = "Load"), Category = "LoadFile") UTexture2D* LoadTextureFromPath(const FString& Path) { if (Path.IsEmpty()) return NULL; return Cast<UTexture2D>(StaticLoadObject(UTexture2D::StaticClass(), NULL, *(Path))); } };
点一下VS的生成和UE4 的compile就能在蓝图中调用了:
LoadClass()和LoadObject()
LoadClass()和LoadObject()的区别如下:
- LoadObject()用来加载非蓝图资源,如贴图;
- LoadClass()用来加载蓝图并获取蓝图类;
使用可参考:
LoadClass()和LoadObject()
异步加载
蓝图提供Async Load Asset异步加载资源的接口,可以直接使用,比如要加载texture:
注意,New Var 0是Soft Object类型变量,Context下的任意资源都能为它赋值。
以下为字符串转Soft Object Refernce方式
编辑器加载
编辑器中提供了Load Asset蓝图接口,对应的代码在EditorAssetLibrary下:
但是该方法只能在Editor Utilities下使用,不能在继承Actor的蓝图中调用
创建一个Editor Utility Widget:
注意事项
StaticLoadObject()函数的对应路径写法( 自己就在路径上捣鼓半天才找到了正确的路径写法,其他博客根本不做介绍 )
实例:
取Content/Texture/jianpan_c时,路径应该写/Game/Texture/jianpan_c,以/Game开头(Content下),不管你的项目名字是什么,然后不要有/Content这个部分,直接接上后面的路径才能成功读取到图片。
鼠标移到对应的资源上,就可以查看路径了:
或者直接右键:
大钊老师整理的路径规则:
同时,如果使用LoadClass()方法,路径名也必须带_C后缀(LoadObject不需要带_C后缀),例如,蓝图路径是:Blueprint'/Game/Blueprints/Test', 加后缀以后,则是:Blueprint'/Game/Blueprints/Test_C'
-
UE4静态/动态加载资源方式
2020-10-19 17:54:49UE4动态/动态加载资源方式 静态加载 ConstructorHelpers::FClassFinder()和FObjectFinder() 动态加载 LoadObject() vs StaticLoadObject()LoadClass()和LoadObject()注意事项 本文将详细介绍使用UE4静态加载和...UE4静态/动态加载资源方式
本文将详细介绍使用UE4静态加载和动态加载的实现方式
静态加载
ConstructorHelpers::FClassFinder()和FObjectFinder()
静态加载指的是在构造函数中完成的加载方式,这种方式的弊端明显,就是需要写死路径,一旦改变路径读取失败很容易造成程序崩溃
API接口:ConstructorHelpers::FClassFinder()和FObjectFinder()
以下为测试代码:创建一个Actor类
// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "GameFramework/Actor.h" #include "MyActor.generated.h" UCLASS() class TWODTEST_API AMyActor : public AActor { GENERATED_BODY() public: // Sets default values for this actor's properties AMyActor(); protected: // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; };
核心代码为
#include "UObject/ConstructorHelpers.h" //以下需要写在构造函数中 UTexture2D *texture; static ConstructorHelpers::FObjectFinder<UTexture2D> Texture(TEXT("/Game/StarterContent/Textures/T_Spark_Core.T_Spark_Core")); //安全判定 if (Texture.Succeeded()) { texture = Texture.Object; }
// Fill out your copyright notice in the Description page of Project Settings. #include "MyActor.h" #include "UObject/ConstructorHelpers.h" // Sets default values AMyActor::AMyActor() { // Set this actor to call Tick() every frame. You can turn this off to improve performance if you don't need it. PrimaryActorTick.bCanEverTick = true; UTexture2D *texture; static ConstructorHelpers::FObjectFinder<UTexture2D> Texture(TEXT("/Game/StarterContent/Textures/T_Spark_Core.T_Spark_Core")); if (Texture.Succeeded()) { texture = Texture.Object; } } // Called when the game starts or when spawned void AMyActor::BeginPlay() { Super::BeginPlay(); } // Called every frame void AMyActor::Tick(float DeltaTime) { Super::Tick(DeltaTime); }
动态加载
LoadObject() vs StaticLoadObject()
API接口:LoadObject vs StaticLoadObject
这种方式未提供蓝图接口,要想在蓝图中调用需要用C++进行封装
动态加载一般使用LoadClass()和LoadObject() 这两个API,示例如下:
UMaterial *mt = LoadObject<UMaterial>(nullptr, TEXT("/Game/Map/Materials/grass.grass")); UMaterial *mt = Cast<UMaterial>(StaticLoadObject(UMaterial::StaticClass(), nullptr, TEXT("/Game/Map/Materials/grass.grass")));
LoadObject和StaticLoadObject的区别:
用VS速览定义发现,LoadObject是对StaticLoadObject的一层封装
有人会认为LoadObject要比StaticLoadObject的速度快一点,毕竟又多封装一次,但实际上我们发现,LoadObject使用了inline进行修饰,因此实际和StaticLoadObject没什么区别,只是参数不一样而已。
实例测试:
创建一个FunctionLibrary,写入以下代码:(主要参考LoadTextureFromPath函数实现)// Fill out your copyright notice in the Description page of Project Settings. #pragma once #include "CoreMinimal.h" #include "Kismet/BlueprintFunctionLibrary.h" #include "Engine/Texture2D.h" #include "LoadFile.generated.h" /** * */ UCLASS() class TWODTEST_API ULoadFile : public UBlueprintFunctionLibrary { GENERATED_BODY() UFUNCTION(BlueprintCallable, meta = (DisplayName = "LoadTextureFromPath", keywords = "Load"), Category = "LoadFile") UTexture2D* LoadTextureFromPath(const FString& Path) { if (Path.IsEmpty()) return NULL; return Cast<UTexture2D>(StaticLoadObject(UTexture2D::StaticClass(), NULL, *(Path))); } };
点一下VS的生成和UE4 的compile就能在蓝图中调用了:
LoadClass()和LoadObject()
LoadClass()和LoadObject()的区别如下:
- LoadObject()用来加载非蓝图资源,如贴图;
- LoadClass()用来加载蓝图并获取蓝图类;
使用可参考:
异步加载
蓝图提供Async Load Asset异步加载资源的接口,可以直接使用,比如要加载texture:
注意,New Var 0是Soft Object类型变量,Context下的任意资源都能为它赋值。
以下为字符串转Soft Object Refernce方式
编辑器加载
编辑器中提供了Load Asset蓝图接口,对应的代码在EditorAssetLibrary下:
但是该方法只能在Editor Utilities下使用,不能在继承Actor的蓝图中调用
创建一个Editor Utility Widget:
注意事项
StaticLoadObject()函数的对应路径写法( 自己就在路径上捣鼓半天才找到了正确的路径写法,其他博客根本不做介绍 )
实例:
取Content/Texture/jianpan_c时,路径应该写/Game/Texture/jianpan_c,以/Game开头(Content下),不管你的项目名字是什么,然后不要有/Content这个部分,直接接上后面的路径才能成功读取到图片。
鼠标移到对应的资源上,就可以查看路径了:
或者直接右键:
大钊老师整理的路径规则:
同时,如果使用LoadClass()方法,路径名也必须带_C后缀(LoadObject不需要带_C后缀),例如,蓝图路径是:Blueprint’/Game/Blueprints/Test’,
加后缀以后,则是:Blueprint’/Game/Blueprints/Test_C’, -
中动态路径加载_UE4静态/动态加载资源方式
2021-01-13 13:19:35UE4静态/动态加载资源方式 本文将详细介绍使用UE4静态加载和动态加载的实现方式 静态加载 ConstructorHelpers::FClassFinder()和FObjectFinder()静态加载指的是在构造函数中完成的加载方式,这种方式的弊端明显,... -
【UE4】C++实现动态加载资源,静态加载资源
2018-05-01 14:06:16C++实现动态加载的问题http://aigo.iteye.com/blog/2268056C++实现动态加载http://aigo.iteye.com/blog/2281373UE4中资源加载资源的方式http://gad.qq.com/article/detail/41256 -
ue4 通过指定路径加载资源_UE4 如何做动态加载资源?解决方案与问题
2020-12-19 02:20:16using namespace UF;UCLASS()class UDynamicLoadObjectLibrary : public UBlueprintFunctionLibrary{GENERATED_BODY()public:UFUNCTION(BlueprintCallable, Category = "ShaoLang|Tools")static FName GetObjectPat.... -
ligertoolbar 动态加载按钮_UE4资源加载的几种方式
2020-12-03 22:46:16一、直接属性引用通过在头文件中定义变量指针,并将其...不过这种方式似乎是不能动态控制,就是说点击Play按钮就全部会默认都加载。/** construction start sound stinger */ UPROPERTY(EditDefaultsOnly, Catego... -
UE4资源加载
2021-02-23 13:47:37动态加载 动态加载指的是可以在Runtime期间加载的方式 LoadClass()和LoadObject()的区别如下: LoadObject()用来加载非蓝图资源,比如动画、贴图、音效等。 LoadClass()用来加载蓝图并获取蓝图类,比如... -
ue4 异步加载关卡_【UE4】world composition世界关卡动态加载
2020-12-15 07:07:49UE4中有一个world composition(世界场景构成)的东西,可以根据玩家位置进行关卡的动态加载,对于一些大场景的加载比较有好处。下图是官方文档截图开启功能此功能需要在世界场景设置中 启用场景合成添加关卡为了... -
UE4动态获得资源路径并进行加载
2019-11-22 14:31:03//根据资源获得他的path FName AMyActor::GetObjPath(const UObject* Obj) { if (!Obj) return NAME_None; FStringAssetReference ObjPath = FStringAssetReference(Obj); FString str = Obj->GetClass()-&... -
UE4 如何做动态加载资源?
2018-12-31 22:57:35摘自:http://www.v5xy.com/?p=558(有空看下这个人的博客) .h文件 using namespace UF; UCLASS() class UDynamicLoadObjectLibrary : public UBlueprintFunctionLibrary ... UFUNCTION(Blue... -
ue4 通过指定路径加载资源_UE4资源加载的几种方式
2020-12-19 02:20:21一、直接属性引用通过在头文件中定义变量指针,并将其...不过这种方式似乎是不能动态控制,就是说点击Play按钮就全部会默认都加载。/** construction start sound stinger */UPROPERTY(EditDefaultsOnly, Categor... -
UE4在C++中动态加载资源
2017-08-29 16:40:10动态加载UObject和动态加载UClass分别用LoadObject(),和LoadClass() ,两者均在在UObjectGlobals.h中。 另外注意:LoadClass的模版名称,不能直接写UBlueprint,例如:LoadClass是错误的,创建蓝图时选择... -
关于UE4动态资源加载(蓝图类)
2016-04-21 11:12:151.调试环境下进行的资源加载方式到打包出来后不一定能够使用。 2.假如遇到调试模式下程序运行正常,但是打包出来后程序crash,可以查看log: Saved/Logs/filename/log 3.资源路径的代码书写格式 map : "Game/... -
UE4_动态加载
2019-04-03 13:09:51Ue4的世界组件可以实现地图的分段加载以达到不浪费资源的目的,世界组件跟流关卡相比的优点在于,加载大地图、多分段时,世界组件更易于编写和判断,流关卡更适合注重细节、较复杂的小型区域。 不建议在永久关卡中... -
UE4 动态加载蓝图类型,场景根据名字查找actor,c++与蓝图交互
2018-11-22 16:32:02加载蓝图资源 void ALPCController::GenerateRainEffectBp() { UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT("Blueprint'/Game/Camera/PostProcess/Bp/Bp_RainEffect.Bp_... -
UE4 异步资源加载
2019-01-31 21:36:00On this page: ...虚幻引擎4中有几个新系统,使得可以更加轻松地异步加载资源数据,这些系统代替了虚幻引擎3中的免搜索内容包中存在的很多功能。这些新方法既可以在开发数据应用也可以在设备上的烘焙数据上... -
[UE4]一个好用的虚幻4插件,根据资源名称动态加载资源,GetCurrentLeveName(获得当前地图名称)...
2018-12-03 13:17:00一、下载与UE4相对应的版本 二、在工程根目录新建Plugins目录,解压插件。 三、如果工程已经打开,则需要重新打开 四、重新打开工程后,右下角会有提示有新插件可用。 五、这个插件提供了很多常用... -
UE4 静态加载(C++)
2018-12-11 16:58:36静态加载 LoadClass<T>(): LoadClass<...动态加载与静态加载的区别: LoadObject<T>()用来加载非蓝图资源,比如动画、贴图、音效等资源; LoadClass&l... -
《UE4游戏开发》之 《资源异步加载进度条处理》
2020-08-04 16:26:30以TArray数组作为容器,搜集所有需要异步加载的资源【assetList】 ...//assetList搜集需要动态加载的资源 //loadingIndex新一步长开始的索引 //Count:计算从Ptr中插入的元素的数量 TArray<FSoftObjectPath> . -
UE4_Content目录资源检索以及异步载入资源
2021-02-18 14:39:38在写插件或者资源动态加载的过程中,需要对Content目录下的资产文件进行遍历或者检索 参考内容:UE4异步载入资源 Object Libraries 是Content Browser 用来进行资产筛选和显示的类,在游戏逻辑中也可以使用。 //... -
ol xyz 加载天地图_UE4 全息地图制作流程
2020-12-31 02:25:41以下是之前制作出的效果:2,3D交互UI及全息效果视频_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili首先把动态地图分成4个部分一,由模型边界线的mesh部分。二,有动态采样部分,可以捕捉动态的模型单位比较大动态的boss之类的,...