获取UE4编辑器中材质和Mesh缩略图并拖拽到指定Mesh替换材质

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zhangxiaofan666/article/details/97643308

任务一:获取材质或Mesh的缩略图并渲染成一张Texture2D图片

       我们知道在UMG中显示的图片和UE4编辑器中从磁盘Import进的图片最后都转成了Texture2D格式,然而缩略图的信息都是封装在以Thumbnail关键字的类中

做法:

      先拿到一个ObjectThumbnail,有多种方式获取,下面代码只是其中一种,还可以从ue4内存中拿,那种方式更快捷,然后从ObjectThumbnail中解压拿到ObjectThumbnail的Image的信息用TArray<unint8>保存,然后获取IImageWrapperModule模块,创建一个JPEG格式图片,并将TArray<unint8>的信息转成图片Color的TArray<unint8>信息,最后直接调用UKismetRenderingLibrary封装的静态函数直接创建一个Texture2D

UTexture2D* UMyButton::GetTexture2D(UObject* MeshObject)
{
	//UAssetManager& AssetManager = UAssetManager::Get();
	//FAssetData MeshObjectAssetData;
	//AssetManager.GetAssetDataForPath(MeshObject->GetPathName(), MeshObjectAssetData);


	//UAssetManager& AssetManager = UAssetManager::Get();
	//FAssetData MeshObjectAssetData;
	//AssetManager.GetAssetDataForPath(MeshObject->GetPathName(), MeshObjectAssetData);
	//UTexture2D* MyTexture2D = Cast<UTexture2D>(MeshObjectAssetData.GetAsset());
	
	int32 _imageRes = 128;
	FObjectThumbnail _objectThumnail;
	ThumbnailTools::RenderThumbnail(MeshObject, _imageRes, _imageRes, ThumbnailTools::EThumbnailTextureFlushMode::AlwaysFlush, NULL, &_objectThumnail);
	TArray<uint8> _myData = _objectThumnail.GetUncompressedImageData();

	TArray<FColor> _imageRawColor;
	for (int i = 0; i < _myData.Num(); i += 4)
	{
		_imageRawColor.Add(FColor(_myData[i + 2], _myData[i + 1], _myData[i], _myData[i + 3]));
	}
	//FString _fileName = OutputPath.ToString() + "/" + obj->GetName() + FString(".jpg");
	IImageWrapperModule& ImageWrapperModule = FModuleManager::LoadModuleChecked<IImageWrapperModule>(FName("ImageWrapper"));
	TSharedPtr<IImageWrapper> ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
	ImageWrapper->SetRaw(_imageRawColor.GetData(), _imageRawColor.GetAllocatedSize(), _imageRes, _imageRes, ERGBFormat::BGRA, 8);
	const TArray<uint8>& _ImageData = ImageWrapper->GetCompressed(100);
	UTexture2D*  MyTexture2D = UKismetRenderingLibrary::ImportBufferAsTexture2D(GetWorld(), _ImageData);
	return MyTexture2D;
}

注意的是,在自己测试时候发现UKismetRenderingLibrary::ImportBufferAsTexture2D在UE4.22版本提供了该函数,4.19版本没有封装该函数,大家可以自己追下源码自己封装个函数

任务二:在自定义的编辑器中实现材质拖拽给mesh并切换材质的功能

说下思路,将材质拖出来无非是创建一个窗口,在tick中跟随指针移动,只不过放到指针指着的mesh,这个mesh怎么获取,有多种方法:

比如通过射线碰撞检测实现的,以当前相机位置为原点,光标在屏幕上的2D位置转化成射线方向上的一个点,遍历查询该射线的碰撞网格,返回距离最近的即可

最后将材质替换到mesh上即可

猜你喜欢

转载自blog.csdn.net/zhangxiaofan666/article/details/97643308
今日推荐