1. *.Build.cs 引用编辑器模块
构造函数:
//编辑器模块
if (Target.bBuildEditor)//或者if (Target.Type == TargetType.Editor)
{
PublicDependencyModuleNames.AddRange(new string[] {
"UnrealEd",
"MeshDescription",
"RawMesh",
//"*****",//其他编辑器模块
});
}
1.1 *Editor.Build.cs
PublicDependencyModuleNames
PrivateDependencyModuleNames
添加编辑器模块
2. *.cpp 实现
#if WITH_EDITOR
编辑器头文件
或应用的编辑器实现
#else
非编辑器实现
#endif
(1)引用编辑器头文件 ,例如
#if WITH_EDITOR
#include "Factories/MaterialFactoryNew.h"
#include "Runtime\Engine\Classes\Materials\MaterialExpressionTextureSample.h"
#endif
(2)实现,例如
FString fName = FPaths::GetBaseFilename(fsTex);
UTexture2D* DiffuseTexture = FCCommonFun::GetLocalTexture(fsTex, TEXT("/***Design/***_Texture/")/*,false,false*/);
FString MaterialBaseName = "M_";
MaterialBaseName += fName;
FString PackageName = "/***Design/***_Material/";
PackageName += MaterialBaseName;
UPackage* Package = CreatePackage(NULL, *PackageName);
FString sMaterialResouce = TEXT("Material'") + PackageName + TEXT(".") + MaterialBaseName + TEXT("'");
UMaterialInterface * ScreenMaterial0 = Cast<UMaterialInterface>(StaticLoadObject(UMaterialInterface::StaticClass(), nullptr, *sMaterialResouce));
if (IsValid(ScreenMaterial0))
{
m_RMaterialMap.Add(ScreenMaterial0);
}
else
{
#if WITH_EDITOR
auto MaterialFactory = NewObject<UMaterialFactoryNew>();
UMaterial* UnrealMaterial00 = (UMaterial*)MaterialFactory->FactoryCreateNew(UMaterial::StaticClass(), Package, *MaterialBaseName, RF_Standalone | RF_Public, NULL, GWarn);
Package->SetDirtyFlag(true);
//make texture sampler
UMaterialExpressionTextureSample* TextureExpression = NewObject<UMaterialExpressionTextureSample>(UnrealMaterial00);
TextureExpression->Texture = DiffuseTexture;
TextureExpression->SamplerType = SAMPLERTYPE_Color;
UnrealMaterial00->Expressions.Add(TextureExpression);
UnrealMaterial00->BaseColor.Expression = TextureExpression;
FAssetRegistryModule::AssetCreated(UnrealMaterial00);
UnrealMaterial00->PreEditChange(NULL);
UnrealMaterial00->PostEditChange();
m_RMaterialMap.Add(UnrealMaterial00);
#else
UMaterialInterface * ScreenMaterial1 = Cast<UMaterialInterface>(StaticLoadObject(UMaterialInterface::StaticClass(), nullptr, TEXT("Material'/Game/GS_Material/NewMaterial.NewMaterial'")));
UMaterialInstanceDynamic* UnrealMaterialDynamic = UMaterialInstanceDynamic::Create(ScreenMaterial1, NULL);
UnrealMaterialDynamic->SetTextureParameterValue("BaseTex", DiffuseTexture);//修改材质实例的参数
m_RMaterialMap.Add(UnrealMaterialDynamic);
FAssetRegistryModule::AssetCreated(UnrealMaterialDynamic);
#endif //WITH_EDITOR
}
Package->FullyLoad();