版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
任务一:获取材质或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上即可