ue4动态加载模型_U3D动态页面

ue4动态加载模型_U3D动态页面本帖纯属个人原创,如有转载请注明出处需要注意的几点:1.调试环境下进行的资源加载方式到打包出来后不一定能够使用。2.假如遇到调试模式下程序运行正常,但是打包出来后程序crash,可以查看log:Saved/Logs/filename/log3.资源路径的代码书写格式map:”Game/Maps/Main.map”蓝图类:”Game/Blueprint/Skil

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

本帖纯属个人原创,如有转载请注明出处

需要注意的几点:

1.调试环境下进行的资源加载方式到打包出来后不一定能够使用。

2.假如遇到调试模式下程序运行正常,但是打包出来后程序crash,可以查看log: Saved/Logs/filename/log

3.资源路径的代码书写格式 

map : “Game/Maps/Main.map”

蓝图类 :  “Game/Blueprint/Skill/skill_1.skill_1_C”

正常的uasset: “Game/Bluerpint/Sound/sound_1.sound_1”

关于资源路径的技巧

1>关于蓝图类的加载记得在结尾要加 _C  就比如 FString sPath = "/Game/Blueprints/Actor/RuntimeActor/RuntimeCameraBP.RuntimeCameraBP_C";
2>使用UE4编辑器的Copy Reference即可,除了蓝图类要加 _C 其他的资源应该都可以加载,就比如 FString sPath = "Texture2D'/Game/Blueprints/UITextures/风险挂接-选中.风险挂接-选中'";

CopyReference操作如下图, 粘贴出来就是 StaticMesh'/Game/Geometry/Meshes/TemplateFloor.TemplateFloor'。然后我们就可以拿到这个路径去进行Load。

ue4动态加载模型_U3D动态页面

关于动态资源生成的几种方式

资源加载远不止我列出这几种方式,会有更多。

1>代码方式如何Spawn蓝图类?

//SpawnActor用法
FString sPath = "/Game/Blueprints/Actor/RuntimeActor/RuntimeCameraBP.RuntimeCameraBP_C";

FVector vDir = GGameInstance->Player->GetActorForwardVector();
//vDir.Z = 0;
FVector vLocation = GGameInstance->Player->GetActorLocation() + vDir * 1000;
FActorSpawnParameters params;
params.SpawnCollisionHandlingOverride = ESpawnActorCollisionHandlingMethod::AdjustIfPossibleButAlwaysSpawn;
UObject* pObject = UUtilsLibrary::CreateAsset(sPath);
UBlueprintGeneratedClass* BP = Cast<UBlueprintGeneratedClass>(pObject);
	
auto pActor = GWorld->SpawnActor<ASPRuntimeCamera>(BP, FTransform(vLocation), params);

2>另外一种代码Spawn蓝图类的方式

不再写资源路径,让资源去蓝图中选择。TSubclassOf这种写法,可以在蓝图中选择你的这个指定<>类型的蓝图类,比如下面我的例子就是继承自ASPPivotMeshActor的蓝图类可以被选中

/** Pivot Actor bp calss, in the blueprint set value. */
UPROPERTY(Category = "Dynamic Data (General Settings)", EditAnywhere, BlueprintReadWrite)
TSubclassOf<ASPPivotMeshActor> PivotActorBP;

//How to Spawn?
SPPivotMeshActor = GWorld->SpawnActor<ASPPivotMeshActor>(PivotActorBP, FTransform(CenterPosition));

3>通过构造加载方式1

如何非构造函数方式加载一个uasset(直接代码写中文以及中文图片的命名方式的习惯不好,不要学我)

//静态方法, 加载uasset的资源,比如UI贴图等。建议写到继承自UBlueprintFunctionLibrary的类中
UFUNCTION(BlueprintCallable, Category = "Utils")
static UObject* CreateAsset(const FString& AssetPath);

//实现
UObject* UUtilsLibrary::CreateAsset(const FString& AssetPath)
{
	FStringAssetReference ref = AssetPath;
	UObject* uoTmp = ref.ResolveObject();
	if (uoTmp == nullptr)
	{
		UE_LOG(LogTemp, Log, TEXT("CreateAsset path = %s"), *AssetPath);
		FStreamableManager& EKAssetLoader = GGameInstance->GetStreamableManager();
		uoTmp = EKAssetLoader.LoadSynchronous(ref, true);
	}

	return uoTmp;
}

//使用案例1, 为UMG上面的UButton和UImage设置图片(直接代码写中文以及中文图片的命名方式的习惯不好,不要学我)
//UButton dynamic change normal image
UObject* pHovered_ContentAttach = UUtilsLibrary::CreateAsset(TEXT("Texture2D'/Game/Blueprints/UITextures/风险挂接-选中.风险挂接-选中'"));
Button_BottomType_Mode->WidgetStyle.Normal.SetResourceObject(pHovered_ContentAttach);

//UImage dynamic change normal image
FString sImagePath = TEXT("Texture2D'/Game/Blueprints/UITextures/添加摄像头.添加摄像头'");
UObject* pImage = UUtilsLibrary::CreateAsset(sImagePath);
RETURN_IF_NULL(pImage);
Image_CameraAdd->Brush.SetResourceObject(pImage);



//使用案例2, 结合CreateAsset在代码中创建一个UMG蓝图

// 对于ScrollBox……等类似列表容器可先使用该种方式, 创建然后再做添加
UFUNCTION()
UUserWidget* CreateFromAsset(const FStringAssetReference& StringRef, ESPPreviewType emUIType, bool bAddToViewPort, int32 nZorder = 0);

//实现
UUserWidget* USPUIManager::CreateFromAsset(const FStringAssetReference& StringRef, ESPPreviewType emUIType, bool bAddToViewPort, int32 nZorder)
{
	UUserWidget* pUI = nullptr;
	UObject* inObject = UUtilsLibrary::CreateAsset(StringRef.ToString());
	if (inObject)
	{
		pUI = CreateWidget<UUserWidget>(GGameInstance, Cast<UClass>(inObject));
		if (pUI)
		{
			if (bAddToViewPort)
			{
				pUI->AddToViewport(nZorder);
				m_WidgetCache.Add(pUI);
			}

			if (Cast<USPUserWidget>(pUI))
			{
				Cast<USPUserWidget>(pUI)->PreviewTypeArray.Add(emUIType);
			}
		}
	}

	return pUI;
}

//HowTo Use Sample
UUserWidget* pUW = GGameInstance->UIManager()->CreateFromAsset(StringRef, emUIType, false);
if(pUW) UGridSlot* pGSlot = SPGridPanel_Left->AddChildToGrid(pUW, row, column);

4>通过构造加载方式2

// set default pawn class to our Blueprinted character 构造函数中加载
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"));
if (PlayerPawnBPClass.Class != NULL)
{
	DefaultPawnClass = PlayerPawnBPClass.Class;
}

5>通过构造加载方式3 LoadClass以及ConstructorHelpers::FClassFinder

//.h中声明一下 加载一个蓝图类
UPROPERTY()
TSubclassOf<class AActor> BP_1;

//构造函数中实现, 加载一个蓝图类
BP_1 = LoadClass<AActor>(NULL, TEXT("Blueprint'/Game/BP/MeshBP_1.MeshBP_C'"));


//.h中声明一下 加载一个UMG
UPROPERTY()
TSubclassOf<UUserWidget> UIMain;

//构造函数中实现, 加载一个UMG, 这里可以注意并没有写_C
static ConstructorHelpers::FClassFinder<UUserWidget> MYWidget(TEXT("/Game/UMG/UI_Main"));
UIMain_Instance = MYWidget.Class;

6>通过构造函数内Load资源 进行资源加载  LoadObject


// 红.h中声明一下
UPROPERTY()
UMaterialInstance* MaterialInstance_Level1;


// Sets default values 构造函数中通过LoadObject加载
UWorldActorsManager::UWorldActorsManager()
	: m_pSelectedActor(nullptr)
{
	mapMaterials.Reset();

	/*MaterialInstance_Level1 = LoadObject<UMaterialInstance>(NULL, TEXT("/Game/Material/ColorMatreial_Inst_1.ColorMatreial_Inst_1"), NULL, LOAD_None, NULL);
	MaterialInstance_Level2 = LoadObject<UMaterialInstance>(NULL, TEXT("/Game/Material/ColorMatreial_Inst_2.ColorMatreial_Inst_2"), NULL, LOAD_None, NULL);
	MaterialInstance_Level3 = LoadObject<UMaterialInstance>(NULL, TEXT("/Game/Material/ColorMatreial_Inst_3.ColorMatreial_Inst_3"), NULL, LOAD_None, NULL);
	MaterialInstance_Level4 = LoadObject<UMaterialInstance>(NULL, TEXT("/Game/Material/ColorMatreial_Inst_4.ColorMatreial_Inst_4"), NULL, LOAD_None, NULL);*/
}

7>如何加载一张磁盘上的Png、jpg、jpeg、bmp到UMG上

//如何加载一张磁盘上的Png、jpg、jpeg、bmp到UMG上 头文件
UFUNCTION(BlueprintCallable, Category = "Utils")
static UTexture2D* LoadTexture(FString fullPath);

//具体实现
UTexture2D* UUtilsLibrary::LoadTexture(FString fullPath)
{
	RETURN_NULL_IF_FALSE(FPaths::FileExists(fullPath));

	TArray<uint8> RawFileData;
	UTexture2D* MyTexture = NULL;
	RETURN_NULL_IF_FALSE(FFileHelper::LoadFileToArray(RawFileData, *fullPath));
	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	// Note: PNG format.
	EImageFormat format = EImageFormat::Invalid;
	if (fullPath.EndsWith(TEXT(".png")))
	{
		format = EImageFormat::PNG;
	}
	else if (fullPath.EndsWith(TEXT(".jpg")) || fullPath.EndsWith(TEXT(".jpeg")))
	{
		format = EImageFormat::JPEG;
	}
	else if (fullPath.EndsWith(TEXT(".bmp")))
	{
		format = EImageFormat::BMP;
	}
	TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(format);
	RETURN_NULL_IF_FALSE(ImageWrapper.IsValid());
	RETURN_NULL_IF_FALSE(ImageWrapper->SetCompressed(RawFileData.GetData(), RawFileData.Num()));
	TArray<uint8> UncompressedBGRA;
	RETURN_NULL_IF_FALSE(ImageWrapper->GetRaw(ERGBFormat::BGRA, 8, UncompressedBGRA));

	// Create the UTexture for rendering
	UTexture2D* result = UTexture2D::CreateTransient(ImageWrapper->GetWidth(), ImageWrapper->GetHeight(), PF_B8G8R8A8);

	// Fill in the source data from the file
	void* TextureData = result->PlatformData->Mips[0].BulkData.Lock(LOCK_READ_WRITE);
	FMemory::Memcpy(TextureData, UncompressedBGRA.GetData(), UncompressedBGRA.Num());
	result->PlatformData->Mips[0].BulkData.Unlock();

	// Update the rendering resource from data.
	result->UpdateResource();

	return result;

}

//使用案例 注意是Full路径,绝对路径
UTexture2D* pTexture2D = UUtilsLibrary::LoadTexture(m_pRuntimeHotPoint->GetObjInfo()->GetBindMoviePath() + TEXT(".jpg"));

如有错误还请纠正。

谢谢,创作不易,大侠请留步… 动起可爱的双手,来个赞再走呗 <( ̄︶ ̄)>

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185816.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • centos7 查看端口占用_如何查看端口是否被占用

    centos7 查看端口占用_如何查看端口是否被占用 netstat-nap#会列出所有正在使用的端口及关联的进程/应用netstat-lnp|grep5000这条语句的作用是查询占用5000端口的应用和进程,把5000端口替换成你要过滤的端口就可以可以看到占用5000端口的进程的基本信息如果要杀掉占用端口的进程执行以下命令即可:kill-928533可以看到进程已被杀死 …

    2022年7月27日
    18
  • Mysql的row_format(fixed与dynamic)

    Mysql的row_format(fixed与dynamic)

    2021年11月6日
    47
  • Jmeter断言-响应断言「建议收藏」

    Jmeter断言-响应断言「建议收藏」1:Jmeter断言-响应断言1.1:添加线程组1.2:添加http请求1.3:在http请求下添加“响应断言”1.4:添加查看结果树和Debug取样器1:断言成功的结果2:断言失败的结果(如下修改)2:参数化断言2.1:添加CSV配置原件2.2:对要测试的内容进行参数化2.3:观察结果树结果与第一章一样都是pass的3:模式匹配规则的介绍3.1:Substring模式匹配规则匹配其中的一段字符…

    2025年6月18日
    3
  • 区块变速运动模拟案例

    区块变速运动模拟案例区块变速运动模拟案例 红色区块点击按钮实现区块运动速度逐渐减小到 left 值为 300px 停止 1 div 的 style 属性 div1 width 200px height 100px background red position absolute left 0 实现该功能 2 div 的 style 属性 div1 width 200px height 100px ba

    2025年11月22日
    4
  • 英语发音规则—ea字母组合发音规律「建议收藏」

    英语发音规则—ea字母组合发音规律「建议收藏」英语发音规则ea字母组合发音规律一、总结一句话总结:字母组合ea的发音规律,在学习字母组合在单词中的发音规律以前,一定要熟练撑握什么是开音节,什么是闭音节,否则你就不撑握这些发音规律。1、ea

    2022年8月5日
    8
  • 一、Linux下的SVN服务器搭建

    一、Linux下的SVN服务器搭建这里自己做个总结。环境:contos7,百度云服务下载svn服务器,必须是联网情况下。yum-yinstallsubversion查看下载后的信息,安装位置及详细信息。rpm-qlsubversion3.创建版本库目录,可以再chenjy目录上放置多个项目,不必为每个项目创建一个版本库。下面是我的版本库mkdir/opt/svn/svnrepos/ch…

    2022年7月19日
    17

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号