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

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

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

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

做法:

      先拿到一个ObjectThumbnail,有多种方式获取,下面代码只是其中一种,还可以从ue4内存中拿,那种方式更快捷,然后从ObjectThumbnail中解压拿到ObjectThumbnail的Image的信息用TArray保存,然后获取IImageWrapperModule模块,创建一个JPEG格式图片,并将TArray的信息转成图片Color的TArray信息,最后直接调用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(MeshObjectAssetData.GetAsset());
	
	int32 _imageRes = 128;
	FObjectThumbnail _objectThumnail;
	ThumbnailTools::RenderThumbnail(MeshObject, _imageRes, _imageRes, ThumbnailTools::EThumbnailTextureFlushMode::AlwaysFlush, NULL, &_objectThumnail);
	TArray _myData = _objectThumnail.GetUncompressedImageData();

	TArray _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(FName("ImageWrapper"));
	TSharedPtr ImageWrapper = ImageWrapperModule.CreateImageWrapper(EImageFormat::JPEG);
	ImageWrapper->SetRaw(_imageRawColor.GetData(), _imageRawColor.GetAllocatedSize(), _imageRes, _imageRes, ERGBFormat::BGRA, 8);
	const TArray& _ImageData = ImageWrapper->GetCompressed(100);
	UTexture2D*  MyTexture2D = UKismetRenderingLibrary::ImportBufferAsTexture2D(GetWorld(), _ImageData);
	return MyTexture2D;
}

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

 

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

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

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

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

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

你可能感兴趣的:(ue4)