虚幻4程序动态创建package资源并且导出资源

直接上代码吧。


void UTestShaderBlueprintLibrary::ExportTexture(UTexture2D* TextureToBeExpot)
{
	//TextureToBeExpot->CompressionSettings = TextureCompressionSettings::TC_VectorDisplacementmap;
	//TextureToBeExpot->SRGB = 0;
	//TextureToBeExpot->UpdateResource();
	//TextureToBeExpot->Source.BulkData

	FTexture2DMipMap& mipmap = TextureToBeExpot->PlatformData->Mips[4];
	void* Data = mipmap.BulkData.Lock(LOCK_READ_WRITE);
	uint32* PixelPointer = (uint32*)Data;
	if (PixelPointer == nullptr)
	{
		mipmap.BulkData.Unlock();
		return;
	}

	int32 texturex = TextureToBeExpot->PlatformData->SizeX;
	int32 texturey = TextureToBeExpot->PlatformData->SizeY;
	TArray<uint8>colors;
	colors.AddUninitialized(texturex * texturey * 4);

	for (int32 x = 0; x < texturex * texturey; x++)
	{
		uint32 EncodedPixel = *PixelPointer;
		//B
		colors[4 * x] = (EncodedPixel & 0x000000FF);

		//G
		colors[4 * x + 1] = (EncodedPixel & 0x0000FF00) >> 8;

		//R
		colors[4 * x + 2] = (EncodedPixel & 0x00FF0000) >> 16;

		//A
		colors[4 * x + 3] = (EncodedPixel & 0xFF000000) >> 24;

		PixelPointer++;
	}
	mipmap.BulkData.Unlock();

	//----------------------------------------------------------//
	// Texture Information
	int width = texturex;
	int height = texturey;

	FString FileName = TextureToBeExpot->GetFName().ToString();
	
	// Create Package
	FString pathPackage = FString("/Game/MyTextures/") + FileName;
	//FString absolutePathPackage = FPaths::ProjectContentDir() + "/MyTextures/";

	//FPackageName::RegisterMountPoint(*pathPackage, *absolutePathPackage);

	UPackage * Package = CreatePackage(nullptr, *pathPackage);

	// Create the Texture
	//FName TextureName = MakeUniqueObjectName(Package, UTexture2D::StaticClass(), FName(*FileName));
	//FName TextureName = FPaths::GetBaseFilename(absolutePathPackage);
	UObject* TexObj = NewObject<UTexture2D>(Package, TextureToBeExpot->GetFName(), RF_Public | RF_Standalone);
	UTexture2D* Texture = Cast<UTexture2D>(TexObj);

	Texture->Source.Init(width, height, /*NumSlices=*/ 1, /*NumMips=*/ 1, TSF_BGRA8, colors.GetData());
	Texture->PlatformData = new FTexturePlatformData();
	Texture->PlatformData->SizeX = width;
	Texture->PlatformData->SizeY = height;
	Texture->PlatformData->PixelFormat = PF_B8G8R8A8;
	
	//Texture->Source.Format = 

	// Passing the pixels information to the texture
	FTexture2DMipMap* Mip = new(Texture->PlatformData->Mips) FTexture2DMipMap();
	Mip->SizeX = width;
	Mip->SizeY = height;
	Mip->BulkData.Lock(LOCK_READ_WRITE);
	uint8* TextureData = (uint8 *)Mip->BulkData.Realloc(height * width * sizeof(uint8) * 4);
	FMemory::Memcpy(TextureData, colors.GetData(), sizeof(uint8) * height * width * 4);
	Mip->BulkData.Unlock();

	// Updating Texture & mark it as unsaved
	Texture->AddToRoot();
	FAssetRegistryModule::AssetCreated(Texture);
	Texture->UpdateResource();
	Package->SetDirtyFlag(true);
	
	//Texture->PostEditChange();

	UE_LOG(LogTemp, Log, TEXT("Texture created: %s"), &FileName);

	//---------------------------------------------------------//

	//TextureToBeExpot->
	//FEditorFileUtils::PromptForCheckoutAndSave(PackagesToSave, false, /*bPromptToSave=*/ false);

	FAssetToolsModule& AssetToolModule = FModuleManager::LoadModuleChecked<FAssetToolsModule>("AssetTools");
	IAssetTools& AssetTool = AssetToolModule.Get();

	TArray<UObject*>Textures;
	Textures.Add(Texture);
	AssetTool.ExportAssetsWithDialog(Textures, true);


}

注意package的路径,如果路径不对资源将创建失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值