精华内容
下载资源
问答
  • ue4动态加载资源
  • 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:09
    UE4中可能使用到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静态加载和动态加载的实现方式 静态加载 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的一层封装

    ad44ee8a5a00329d97601d96f905f20d.png

    有人会认为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就能在蓝图中调用了:

    aaa4c628b1fcb0886fdbac9649e48980.png

    LoadClass()和LoadObject()

    LoadClass()和LoadObject()的区别如下:

    • LoadObject()用来加载非蓝图资源,如贴图;
    • LoadClass()用来加载蓝图并获取蓝图类;

    使用可参考:

    LoadClass()和LoadObject()

    异步加载

    蓝图提供Async Load Asset异步加载资源的接口,可以直接使用,比如要加载texture:

    b230b80e09eccd928cbb7abd03544ac6.png

    注意,New Var 0是Soft Object类型变量,Context下的任意资源都能为它赋值。

    以下为字符串转Soft Object Refernce方式

    c12c811ccee82e3aadc6a8360c81d31e.png

    编辑器加载

    编辑器中提供了Load Asset蓝图接口,对应的代码在EditorAssetLibrary下:

    15354aa3848f228cc73d21ab69f36d08.png

    1185e2bdfa9be843580bea0578c3beeb.png

    但是该方法只能在Editor Utilities下使用,不能在继承Actor的蓝图中调用

    e433500383805bb7e3b69f05e8877e1e.png

    创建一个Editor Utility Widget:

    fd30fbec15e2c0b547220dfbf97d968a.png

    注意事项

    StaticLoadObject()函数的对应路径写法( 自己就在路径上捣鼓半天才找到了正确的路径写法,其他博客根本不做介绍

    实例:

    cebc92a13da87bb98e90bac0c28895b9.png

    取Content/Texture/jianpan_c时,路径应该写/Game/Texture/jianpan_c,以/Game开头(Content下),不管你的项目名字是什么,然后不要有/Content这个部分,直接接上后面的路径才能成功读取到图片。

    鼠标移到对应的资源上,就可以查看路径了:

    e67443da3bb1f1ea0d3c03c1f896f89c.png

    或者直接右键:

    f8bc85c5890d3e9c34fe275555d6a05c.png

    大钊老师整理的路径规则:

    bdf5c27d8ce94d56a3660ec6debf2ee1.png

    同时,如果使用LoadClass()方法,路径名也必须带_C后缀(LoadObject不需要带_C后缀),例如,蓝图路径是:Blueprint'/Game/Blueprints/Test', 加后缀以后,则是:Blueprint'/Game/Blueprints/Test_C'

    展开全文
  • UE4动态/动态加载资源方式 静态加载 ConstructorHelpers::FClassFinder()和FObjectFinder() 动态加载 LoadObject() vs StaticLoadObject()LoadClass()和LoadObject()注意事项 本文将详细介绍使用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静态/动态加载资源方式 本文将详细介绍使用UE4静态加载和动态加载的实现方式 静态加载 ConstructorHelpers::FClassFinder()和FObjectFinder()静态加载指的是在构造函数中完成的加载方式,这种方式的弊端明显,...
  • C++实现动态加载的问题http://aigo.iteye.com/blog/2268056C++实现动态加载http://aigo.iteye.com/blog/2281373UE4中资源加载资源的方式http://gad.qq.com/article/detail/41256
  • using namespace UF;UCLASS()class UDynamicLoadObjectLibrary : public UBlueprintFunctionLibrary{GENERATED_BODY()public:UFUNCTION(BlueprintCallable, Category = "ShaoLang|Tools")static FName GetObjectPat....
  • 一、直接属性引用通过在头文件中定义变量指针,并将其...不过这种方式似乎是不能动态控制,就是说点击Play按钮就全部会默认都加载。/** construction start sound stinger */ UPROPERTY(EditDefaultsOnly, Catego...
  • UE4资源加载

    2021-02-23 13:47:37
    动态加载 动态加载指的是可以在Runtime期间加载的方式 LoadClass()和LoadObject()的区别如下: LoadObject()用来加载非蓝图资源,比如动画、贴图、音效等。 LoadClass()用来加载蓝图并获取蓝图类,比如...
  • UE4中有一个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...
  • 一、直接属性引用通过在头文件中定义变量指针,并将其...不过这种方式似乎是不能动态控制,就是说点击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:15
    1.调试环境下进行的资源加载方式到打包出来后不一定能够使用。 2.假如遇到调试模式下程序运行正常,但是打包出来后程序crash,可以查看log: Saved/Logs/filename/log 3.资源路径的代码书写格式  map : "Game/...
  • UE4_动态加载

    2019-04-03 13:09:51
    Ue4的世界组件可以实现地图的分段加载以达到不浪费资源的目的,世界组件跟流关卡相比的优点在于,加载大地图、多分段时,世界组件更易于编写和判断,流关卡更适合注重细节、较复杂的小型区域。 不建议在永久关卡中...
  • 加载蓝图资源 void ALPCController::GenerateRainEffectBp() { UObject* loadObj = StaticLoadObject(UBlueprint::StaticClass(), NULL, TEXT(&quot;Blueprint'/Game/Camera/PostProcess/Bp/Bp_RainEffect.Bp_...
  • UE4 异步资源加载

    2019-01-31 21:36:00
    On this page: ...虚幻引擎4中有几个新系统,使得可以更加轻松地异步加载资源数据,这些系统代替了虚幻引擎3中的免搜索内容包中存在的很多功能。这些新方法既可以在开发数据应用也可以在设备上的烘焙数据上...
  • 一、下载与UE4相对应的版本 二、在工程根目录新建Plugins目录,解压插件。   三、如果工程已经打开,则需要重新打开   四、重新打开工程后,右下角会有提示有新插件可用。   五、这个插件提供了很多常用...
  • UE4 静态加载(C++)

    2018-12-11 16:58:36
    静态加载 LoadClass&lt;T&gt;(): LoadClass&lt;...动态加载与静态加载的区别: LoadObject&lt;T&gt;()用来加载非蓝图资源,比如动画、贴图、音效等资源; LoadClass&l...
  • 以TArray数组作为容器,搜集所有需要异步加载的资源【assetList】 ...//assetList搜集需要动态加载资源 //loadingIndex新一步长开始的索引 //Count:计算从Ptr中插入的元素的数量 TArray<FSoftObjectPath> .
  • 在写插件或者资源动态加载的过程中,需要对Content目录下的资产文件进行遍历或者检索 参考内容:UE4异步载入资源 Object Libraries 是Content Browser 用来进行资产筛选和显示的类,在游戏逻辑中也可以使用。 //...
  • 以下是之前制作出的效果:2,3D交互UI及全息效果视频_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili首先把动态地图分成4个部分一,由模型边界线的mesh部分。二,有动态采样部分,可以捕捉动态的模型单位比较大动态的boss之类的,...

空空如也

空空如也

1 2
收藏数 34
精华内容 13
关键字:

ue4动态加载资源