多维子材质是指一个模型的不同部分分别用了不同的材质,在UE4中打开模型编辑器界面,就能看到模型的材质组成,如下图,在LOD0的Sections栏看到该模型(StarterContent中的SM_Door)由两个材质部分组成。
MaterialSlot表示该部分使用的某个材质槽的材质,材质槽可以由我们自己编辑,如下图,在默认材质槽后面又新建了一个材质槽,并命名为MySlot,只要将上面的MaterialSlot替换为MySlot就可以使用MySlot材质槽中的材质。获取和设置模型的材质就是通过修改材质槽的材质实现的。
像这种含多维子材质的模型,在编辑器中只要将材质拖到模型相应的部分就可以准确替换该部分的材质,但是在运行时无法检测到鼠标下对应的是哪部分的材质,因为在编辑器中有保存额外的数据用于检测,而运行时没有。
物体检测的数据都保存在FHitResult结构中,该结构中有个变量PhysMaterial,用于保存材质对应的物理材质,在物理仿真时会用到,测试后发现如果模型的不同部分包含不同的物理材质,返回的PhysMaterial相应变化 ,因此可以利用物理材质来实现多维子材质的替换。实现一个函数ReplaceMaterialUnderCursor(UMaterialInterface* InMaterial)用于替换材质,基本的思路是:
1、替换材质事件触发时通过GetHitResultUnderCursor检测鼠标下的组件,如果是UStaticMeshComponent就继续。
2、遍历该组件(模型)含有的材质个数,如果是1则使用SetMaterial(0, InMaterial),到此结束;如果超过1个继续。
3、保存组件的材质到数组中,用于完成后恢复材质;然后创建动态材质实例,并设置不同的物理材质,物理材质可以使用序号作为名称来区分,最后将材质实例赋予模型不同部分。
4、再次使用LineTraceSingle检测一次,这次能检测到物理材质,获取物理材质名称(即序号)就能知道要替换的是哪部分材质。
5、将上一步获取到的序号处材质替换为新的材质,其他部分恢复原始材质。
下面是具体实现
1、通过GetHitResultUnderCursor检测鼠标下