创建编辑器工具蓝图
新建一个编辑器工具蓝图
选择AssetActionUtility,这个的意思是可以对Asset资源进行一些处理。
在其中新建一个函数叫做test,并让这个函数print一个字符串。
在内容浏览器中右键任意一个资源,脚本化操作 -> Test就可以看到打印的Test嘞:
就是使用这个来运行C++库中的函数。
写C++函数
思路
首先我们需要创建一个包去保存这个资源
然后以NewObject的形式创建贴图资源,保存到刚创建的包,将颜色信息写入其中
最后更新贴图的Source,创建Asset就可以嘞
实现
新建个C++蓝图函数库
在头文件中声明函数,函数为蓝图可调用
1 2 3
| public: UFUNCTION(BlueprintCallable) static void SaveTexture(const FString Name, const FVector2D Size);
|
C++文件的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| void UFunctionLibrary::SaveTexture(const FString Name, const FVector2D Size) { TArray<FColor> Colors; for(int32 y = 0; y < Size.Y; y++) { for(int32 x = 0; x < Size.X; x++) { Colors.Add(FColor::Blue); } }
const FString PackagePath = FString("/Game/SampleTexture/") + Name; UPackage* Package = CreatePackage(*PackagePath); Package->FullyLoad(); UTexture2D* NewTexture = NewObject<UTexture2D>(Package, *Name, RF_Public|RF_Standalone|RF_MarkAsRootSet); NewTexture->PlatformData = new FTexturePlatformData(); NewTexture->PlatformData->SizeX = Size.X; NewTexture->PlatformData->SizeY = Size.Y; NewTexture->PlatformData->SetNumSlices(1); NewTexture->PlatformData->PixelFormat = PF_B8G8R8A8; NewTexture->AddToRoot(); uint8* Pixels = new uint8[Size.X * Size.Y * 4]; for (int y = 0; y < Size.Y; y++) { for (int x = 0; x < Size.X; x++) { const int32 CurrentPixelIndex = y * Size.X + x; Pixels[CurrentPixelIndex * 4 + 0] = Colors[CurrentPixelIndex].B; Pixels[CurrentPixelIndex * 4 + 1] = Colors[CurrentPixelIndex].G; Pixels[CurrentPixelIndex * 4 + 2] = Colors[CurrentPixelIndex].R; Pixels[CurrentPixelIndex * 4 + 3] = Colors[CurrentPixelIndex].A; } } FTexture2DMipMap* Mip = new FTexture2DMipMap(); NewTexture->PlatformData->Mips.Add(Mip); Mip->SizeX = Size.X; Mip->SizeY = Size.Y; Mip->BulkData.Lock(LOCK_READ_WRITE); uint8* TextureData = static_cast<uint8*>(Mip->BulkData.Realloc(Size.X * Size.Y * 4)); FMemory::Memcpy(TextureData, Pixels, sizeof(uint8) * Size.X * Size.Y * 4); Mip->BulkData.Unlock(); NewTexture->Source.Init(Size.X, Size.Y, 1, 1, TSF_BGRA8, Pixels); NewTexture->UpdateResource(); Package->MarkPackageDirty(); FAssetRegistryModule::AssetCreated(NewTexture); const FString PackageFileName = FPackageName::LongPackageNameToFilename(PackagePath, FPackageName::GetAssetPackageExtension()); bool bSaved = UPackage::SavePackage(Package, NewTexture, EObjectFlags::RF_Public | EObjectFlags::RF_Standalone, *PackageFileName, GError, nullptr, true, true, SAVE_NoError); delete [] Pixels; }
|
注意:贴图格式为BGRA,否则将无法正常生成MipMap与压缩
调用
编译
在刚才创建的编辑器工具中新建个函数,添加两个输入:贴图名称和大小。找到刚才C++中写的函数,连上。
然后随便找个asset右键选择SaveTexture函数输入数据就可以看到生成了一个文件夹并且有一张新的纯蓝贴图嘞。
后面给函数加个颜色数组输入就可以控制生成图片的颜色了。