创建编辑器工具蓝图

编辑器工具蓝图

新建一个编辑器工具蓝图

选择AssetActionUtility,这个的意思是可以对Asset资源进行一些处理。

在其中新建一个函数叫做test,并让这个函数print一个字符串。

Test

在内容浏览器中右键任意一个资源,脚本化操作 -> Test就可以看到打印的Test嘞:

运行函数

就是使用这个来运行C++库中的函数。

写C++函数

思路

首先我们需要创建一个包去保存这个资源

然后以NewObject的形式创建贴图资源,保存到刚创建的包,将颜色信息写入其中

最后更新贴图的Source,创建Asset就可以嘞

实现

以下代码在UE4 4.26中可以正常运行

新建个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();

// 写入颜色信息
// 储存像素数据的数组,因为有RGBA四个数据,所以数组大小要乘以4
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();

// 更细贴图并创建Asset
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函数输入数据就可以看到生成了一个文件夹并且有一张新的纯蓝贴图嘞。

贴图创建成功

后面给函数加个颜色数组输入就可以控制生成图片的颜色了。