文章目录
1、UMaterialInterface
UMaterialInterface
继承自UObject,是一个比较底层的材质类,从名字也能看出来,他是个接口类(但是并非虚基类),基本上它的作用就是多态。
- 场景一:统一处理不同类型的材质
假设有一个函数需要处理各种材质,无论是母材质还是材质实例,则可以用UMaterialInterface来作为形参:void SetMaterial(UMaterialInterface* Material);
- 场景二:材质数组
存储一个材质数组,其中可以包含不同类型的材质,可以使用UMaterialInterface
数组:TArray<UMaterialInterface*> MaterialArray;
- 场景三:组件材质设置
许多组件(如UMeshComponent
)使用UMaterialInterface
作为材质的类型参数,这是在暗示可以给静态网格体组件设置不同类型的材质,比如UMaterialInstence
、UMaterialInstanceDynamic
、甚至是直接把母材质给它UMaterial
UMaterialInterface* Material = LoadObject<UMaterialInterface>(nullptr, TEXT("Path/To/Your/Material")); MeshComponent->SetMaterial(0, Material);
2、UMaterialInstance及其子类
2.1 UMaterialInstance
UMaterialInstance
是 UMaterialInstanceConstant
和 UMaterialInstanceDynamic
的基类。它主要用于在不修改基础材质(UMaterial
)的情况下,创建带有特定参数的材质实例。
2.2 UMaterialInstanceConstant
UMaterialInstanceConstant
是一种材质实例,其参数在编辑器中设置,并在运行时保持不变。它非常适合需要在多个对象之间共享相同参数的情况。
**示例:**在编辑器中创建 UMaterialInstanceConstant
,然后将其应用于多个对象:
UMaterialInstanceConstant* MaterialInstance = LoadObject<UMaterialInstanceConstant>(nullptr, TEXT("Path..."));
StaticMeshComponent->SetMaterial(0, MaterialInstance);
使用场景
- 需要共享相同材质参数的多个对象
- 材质参数在运行时不需要改变的情况
2.3 UMaterialInstanceDynamic
UMaterialInstanceDynamic
是一种允许在运行时动态修改材质参数的材质实例。
示例:创建一个动态材质实例,并在运行时修改其参数:
// 创建动态材质实例
UMaterialInstanceDynamic* DynamicMaterialInstance = UMaterialInstanceDynamic::Create(BaseMaterial, this);
// 修改材质参数
DynamicMaterialInstance->SetVectorParameterValue("Color", FLinearColor::Red);
// 将动态材质应用于组件
StaticMeshComponent->SetMaterial(0, DynamicMaterialInstance);
使用场景:
- 需要在运行时根据游戏逻辑或用户交互动态改变材质参数的情况。
- 实现动态效果,例如变色、动画、参数变化等。