首页 > 其他分享 >UE4成批处理透明材质

UE4成批处理透明材质

时间:2022-12-13 14:38:19浏览次数:41  
标签:透明 int32 ArrayTransCompoent Num pragma UE4 材质 成批处理


项目中需要控制成批的物体的透明度,但是默认的时候他又不能是透明的,对,项目的要求就这么诡异。

然而却没有找到设置材质的BlendMode的功能,于是只有换了一种办法,物体需要透明时更换为透明材质,默认的时候使用初始的材质,当然我也不会为了每个材质单独再建一个透明材质,这工作量想想都不科学。这里,只是为自己的解决方案作了一个记录,算不上实用。


1.创建一个透明材质,作为通用的资源,并创建三个变量,一个主纹理,一个主颜色,一个透明度值就够了

UE4成批处理透明材质_UE4

2.默认材质,我们也需要将他的主纹理或者主颜色定义为变量,方便后面获取,比如这里截图的就是一个主颜色变量,我这里名称都统一为MainColor,MainTexture

UE4成批处理透明材质_UE4_02

3.在C++中定义一些公开变量,具体作用有注释,比如我们开始创建的透明材质也可以会通过这个赋值

/** 模型透明标签 */
UPROPERTY(EditDefaultsOnly, Category = "Transparency")
FName TransCompontTag;
/** 材质透明参数名称 */
UPROPERTY(EditDefaultsOnly, Category = "Transparency")
FName TransMaterialPar;
/** 材质主纹理的参数名称 */
UPROPERTY(EditDefaultsOnly, Category = "Transparency")
FName TransMaterialTex;
/** 材质主纹理的参数名称 */
UPROPERTY(EditDefaultsOnly, Category = "Transparency")
FName TransMaterialColor;
/** 透明材质 */
UPROPERTY(EditDefaultsOnly, Category = "Transparency")
UMaterialInterface* TransMaterial;

4.创建StaticMeshComponent数组,默认材质的TMap,透明材质的TMap,还有当前是否为透明状态

/*透明模型*/
TArray<UStaticMeshComponent*> _ArrayTransCompoent;
/** 默认材质 */
TMap<FString,UMaterialInterface*> _MapDefaultMaterials;
/** 透明材质 */
TMap<FString, UMaterialInstanceDynamic*> _MapTransMaterials;
/** 是否透明 */
bool _IsTrans=false;


5.创建一个函数,通过开始的透明材质创建UMaterialInstanceDynamic,并获取默认材质的主纹理或者主颜色赋值给透明材质,效果虽然没默认材质那么多效果,也不至于一片全白,然后参数传一个float值来控制透明度,操作中就可以用滑动条来控制,

#pragma region 设置物体透明度
void SetCompoentTrans(const float value)
{

#pragma region 通过标签获取需要透明的物体
if (_ArrayTransCompoent.Num() == 0)
{
TArray<AActor*> _TempArrayOutActors;
UGameplayStatics::GetAllActorsOfClass(GetWorld(), AStaticMeshActor::StaticClass(), _TempArrayOutActors);
for (int32 i = 0; i < _TempArrayOutActors.Num(); i++)
{
UStaticMeshComponent* _TempStaticMesh = Cast<AStaticMeshActor>(_TempArrayOutActors[i])->StaticMeshComponent;
TArray<FName> _TempArrayComTags = _TempStaticMesh->ComponentTags;
for (int32 j = 0; j < _TempArrayComTags.Num(); j++)
{
if (_TempArrayComTags[j] == TransCompontTag)
{
_ArrayTransCompoent.Add(_TempStaticMesh);
break;
}
}
}
}
#pragma endregion

#pragma region 利用TMap将透明物体的材质存储起来
if (_MapDefaultMaterials.Num()==0)
{
for (int32 i = 0; i < _ArrayTransCompoent.Num();i++)
{
TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
{
FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName()+"@"+FString::FromInt(j);
_MapDefaultMaterials.Add(_TempStringKey, _TempArrayMaterials[j]);
}
}
}
#pragma endregion

if (value>0.97f)
{
#pragma region 设置默认材质
if (_IsTrans)
{
for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
{
TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
{
FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
_ArrayTransCompoent[i]->SetMaterial(j, _MapDefaultMaterials[_TempStringKey]);
}
}
_IsTrans = false;
}
#pragma endregion
}
else
{
if (!_IsTrans)
{
#pragma region 创建透明材质
if (_MapTransMaterials.Num() == 0)
{
for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
{
TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
{
FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
UMaterialInstanceDynamic*_TempMaterialID = _ArrayTransCompoent[i]->CreateDynamicMaterialInstance(0, TransMaterial);

UTexture* _TempOutTexture;
if (_MapDefaultMaterials[_TempStringKey]->GetTextureParameterValue(TransMaterialTex, _TempOutTexture))
{
_TempMaterialID->SetTextureParameterValue(TransMaterialTex, _TempOutTexture);
}
/*else
{
_TempOutTexture = Cast<UTexture>(StaticLoadObject(UTexture::StaticClass(), NULL, TEXT("/Game/Texture/Transparent/Tex_Transparent")));
}
_TempMaterialID->SetTextureParameterValue(TransMaterialTex, _TempOutTexture);*/
FLinearColor _TempOutColor;
if (_MapDefaultMaterials[_TempStringKey]->GetVectorParameterValue(TransMaterialColor, _TempOutColor))
{
_TempMaterialID->SetVectorParameterValue(TransMaterialColor, _TempOutColor);
}

_MapTransMaterials.Add(_TempStringKey,_TempMaterialID);
}
}
#pragma endregion
}
else
{
#pragma region 设置透明材质
for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
{
TArray<UMaterialInterface*> _TempArrayMaterials = _ArrayTransCompoent[i]->GetMaterials();
for (int32 j = 0; j < _TempArrayMaterials.Num(); j++)
{
FString _TempStringKey = _ArrayTransCompoent[i]->GetAttachmentRootActor()->GetName() + "@" + FString::FromInt(j);
_ArrayTransCompoent[i]->SetMaterial(j, _MapTransMaterials[_TempStringKey]);
}
}
#pragma endregion
}
_IsTrans = true;
}
for (int32 i = 0; i < _ArrayTransCompoent.Num(); i++)
{
_ArrayTransCompoent[i]->SetScalarParameterValueOnMaterials(TransMaterialPar, value);
}
}
}
#pragma endregion

UE4成批处理透明材质_UE4_03



标签:透明,int32,ArrayTransCompoent,Num,pragma,UE4,材质,成批处理
From: https://blog.51cto.com/u_15911199/5934031

相关文章

  • UE4读取本地XML文件
    其实这里读取XML也是利用了Tinyxml来读取xml,主要是讲Tinyxml放在UE4中,遇到的一点点坑1.先给出Tinyxml链接:​​http://www.grinninglizard.com/tinyxml/​​,可以下载他的工......
  • UE4读取scv文件 -- 数据驱动游戏性元素
    官方文档链接:​​http://docs.unrealengine.com/latest/CHN/Gameplay/DataDriven/index.html​​略懒,稍微麻烦重复的工作,总希望能找人帮忙一起做,但是有人对于稍微一点点的......
  • UE4 读取本地图片
    参考链接:​​https://answers.unrealengine.com/questions/235086/texture-2d-shows-wrong-colors-from-jpeg-on-html5-p.html​​我这里,不能将图片全放工程之中,需要在外部......
  • UE4实现闪烁效果
    官网文档链接:​​http://docs.unrealengine.com/latest/CHN/Engine/Rendering/Materials/ExpressionReference/Math/index.html?utm_source=editor&utm_medium=docs&utm_ca......
  • UE4利用Save Game创建全局变量
    因为盲目的做了一个UE4的项目,没有用到UE4的无缝加载,我只能在一个个关卡中手动切换,然后每次的数据都会重置,这对于项目来说,造成了体验感的极度下降。然而我查了一下怎样在UE4......
  • UE4帧动画Matineed
    发一句牢骚,ue4除了渲染好一点,其他操作都没有unity便利,最近需要在项目中,调几个简单的动画使用到了Matineed,相当不好用。也可能是unity转ue4,有先入为主的观念,哈哈,nevermind.1......
  • UE4 GAS插件入门学习记录1——初步认识及使用
    ​引言本系列文章内容仅为个人学习记录,使用UE的版本为4.27,如有侵权请联系我学习来源及各参考文档:GASDocumentation_Chinese原文地址:tranek/GASDocumentation翻译地......
  • UE4 WebUI插件使用指南
    在开发数字孪生应用程序的时候,除了三维场景展示之外,也需要开发丰富和酷炫的2D页面。使用UE4的UMG开发图表显得比较笨拙。而通过Web插件允许开发者创建丰富的基于WebHTML5......
  • 38、blender的fbx导出,以及fbx重新导入寻找材质贴图
    -z向前,y向上。  “应用变换”选项要勾选。 选择“useembedded materials""by base texturename""projectwide"然后点击“search andremap"可以根......
  • UE4学习笔记23——【动画】Mixamo自动绑骨并导入虚幻4
    P61.Mixamo自动绑骨并导入虚幻4P61需要插件“MixamoAnimationRetargeting”(200多块......)(这节课就简单听听,以后用到了再看)(桥豆麻袋!不用买这个插件,这节课的东西也能......