1.新建插件
2.在项目里新建一个C++类继承自UMaterialExpression,放在插件文件夹里
3.在.h文件里加上
#include "UObject/ObjectMacros.h"
#include "MaterialExpressionIO.h"
#include "MaterialCompiler.h"
UPROPERTY(meta = (RequiredInput = "false", ToolTip = "Defaults to 'ConstA' if not specified"))
FExpressionInput A;
UPROPERTY(meta = (RequiredInput = "false", ToolTip = "Defaults to 'ConstB' if not specified"))
FExpressionInput B;
UPROPERTY(EditAnywhere, Category = UMyMaterialExpression, meta = (OverridingInputProperty = "A"))
float ConstA;
UPROPERTY(EditAnywhere, Category = UMyMaterialExpression, meta = (OverridingInputProperty = "B"))
float ConstB;
#if WITH_EDITOR
virtual int32 Compile(class FMaterialCompiler* Compiler, int32 OutputIndex) override;
virtual void GetCaption(TArray<FString>& OutCaptions) const override;
virtual FText GetKeywords() const override { return FText::FromString(TEXT("+")); }
#endif // WITH_EDITOR
4.在.cpp里面实现
#if WITH_EDITOR
int32 UMyMaterialExpression::Compile(class FMaterialCompiler* Compiler, int32 OutputIndex)
{
// if the input is hooked up, use it, otherwise use the internal constant
int32 Arg1 = A.GetTracedInput().Expression ? A.Compile(Compiler) : Compiler->Constant(ConstA);
// if the input is hooked up, use it, otherwise use the internal constant
int32 Arg2 = B.GetTracedInput().Expression ? B.Compile(Compiler) : Compiler->Constant(ConstB);
return Compiler->Add(Arg1, Arg2);
}
void UMyMaterialExpression::GetCaption(TArray<FString>& OutCaptions) const
{
FString ret = TEXT("Hello Material");
FExpressionInput ATraced = A.GetTracedInput();
FExpressionInput BTraced = B.GetTracedInput();
if (!ATraced.Expression || !BTraced.Expression)
{
ret += TEXT("(");
ret += ATraced.Expression ? TEXT(",") : FString::Printf(TEXT("%.4g,"), ConstA);
ret += BTraced.Expression ? TEXT(")") : FString::Printf(TEXT("%.4g)"), ConstB);
}
OutCaptions.Add(ret);
}
#endif // WITH_EDITOR
这里的命名有一点讲究
如果命名是MaterialExpression+后缀的话
这里会显示后缀名
然而如果是其他名称的话
这里则会全部显示
然而这个名称则是由这里控制
这是Add的框架,想做什么去\Runtime\Engine\Private\Materials\MaterialExpressions.cpp里面抄