此函数定义在一个函数库中,方便调用
函数声明:
/获取一个动态材质上的各个参数
UFUNCTION(BlueprintCallable, BlueprintPure, Category = "Material")
static bool GetMaterialParameters(UMaterialInterface* MatInterface, TArray<FMaterialScalarParameter>& OutScalarParameters, TArray<FMaterialVectorParameter>& OutVectorParameters, TArray<FMaterialTextureParameter>& OutTextureParameters);
函数定义:
bool UCarCPPFunctionLibrary::GetMaterialParameters(UMaterialInterface* MatInterface, TArray<FMaterialScalarParameter>& OutScalarParameters, TArray<FMaterialVectorParameter>& OutVectorParameters, TArray<FMaterialTextureParameter>& OutTextureParameters)
{
if (MatInterface)
{
TArray<FMaterialParameterInfo> ScalarParameters;
TArray<FMaterialParameterInfo> VectorParameters;
TArray<FMaterialParameterInfo> TextureParameters;
TArray<FGuid> SGuids;
TArray<FGuid> VGuids;
TArray<FGuid> TGuids;
MatInterface->GetAllScalarParameterInfo(ScalarParameters, SGuids);
//UE_LOG(LogTemp, Warning, TEXT("%d"), ScalarParameters.Num());
MatInterface->GetAllVectorParameterInfo(VectorParameters, VGuids);
MatInterface->GetAllTextureParameterInfo(TextureParameters, TGuids);
for (int32 ParameterIndex = 0; ParameterIndex < ScalarParameters.Num(); ParameterIndex++)
{
FHashedMaterialParameterInfo ParameterInfo(ScalarParameters[ParameterIndex]);
FString SParameterName;
float SParameterValue;
SParameterName = ParameterInfo.GetName().ToString();
FMaterialScalarParameter ScalarParameter;
bool Result = MatInterface->GetScalarParameterValue(ParameterInfo, SParameterValue, true);
ScalarParameter.ParameterName = SParameterName;
ScalarParameter.ParameterValue = SParameterValue;
if (Result)
{
OutScalarParameters.Add(ScalarParameter);
}
}
for (int32 ParameterIndex = 0; ParameterIndex < VectorParameters.Num(); ParameterIndex++)
{
FHashedMaterialParameterInfo ParameterInfo(VectorParameters[ParameterIndex]);
FLinearColor VParameterValue;
FMaterialVectorParameter VectorParameter;
bool Result = MatInterface->GetVectorParameterValue(ParameterInfo, VParameterValue, true);
VectorParameter.ParameterName = ParameterInfo.GetName().ToString();
VectorParameter.ParameterValue = VParameterValue;
if (Result)
{
OutVectorParameters.Add(VectorParameter);
}
}
for (int32 ParameterIndex = 0; ParameterIndex < TextureParameters.Num(); ParameterIndex++)
{
FMaterialParameterInfo ParameterInfo = TextureParameters[ParameterIndex];
FHashedMaterialParameterInfo HParameterInfo = FHashedMaterialParameterInfo(ParameterInfo);
UTexture* TParameterValue;
FMaterialTextureParameter TextureParameter;
bool Result = MatInterface->GetTextureParameterValue(HParameterInfo, TParameterValue, true);
TextureParameter.ParameterName = HParameterInfo.GetName().ToString();
if (Result) {
TextureParameter.ParameterValue = TParameterValue->GetName();
OutTextureParameters.Add(TextureParameter);
}
}
return true;
}
return false;
}