如何通过DOTS修改材质属性以及替换材质与网格
一、DOTS修改材质属性
1.利用 Material Overide Asset
Material Overide Asset是一个Unity资产,可以通过Create创建。
创建后指定要修改的材质,以及对应材质的属性,即可完成这个资源创建。
然后在要修改的预制上添加脚本(Unity内置的)Material Overide,然后指定刚刚创建的Material Overide Asset即可标记这个Prefab对应材质的哪个属性想要被修改。
这时会自动添加要修改的对应属性的DOTS中的Component。比如下图,要修改材质的颜色与金属度属性。
则会给这个Prefab 自动添加上对应的Component。
这个时候,在DOTS系统中,就能通过DOTS中获取组件,修改组件属性的方法来修改对应值达到效果。
这个方法比较笨重,且不够灵活。
2.利用代码创建对应的材质属性的组件
用常规方式创建一个IComponentData组件,重点是给这个组件打上对应的材质属性标签,即可映射为要修改的材质属性组件(类似上图的两个组件)
[MaterialProperty("_Color")]
public struct MyOwnColor : IComponentData
{
public float4 Value;
}
剩下的和普通组件一样,去获取这个组件值,然后就行修改即可修改材质里面的属性。除了Unity提供的内置材质属性外,还可以修改Shader Graph自定义属性。具体操作见官方文档:
二、# 一、DOTS修改替换材质与网格
1.引用材质与网格
因为材质与网格都是托管对象,所以要建立一个托管Component去引用你想要替换上去的材质与网格。
同时,也要建立托管的System(继承SystemBase)来操作这个Component。
2.注册材质与网格到
利用World.GetOrCreateSystemManaged()获取到对应EntitiesGraphicsSystem系统,然后利用RegisterMaterial与RegisterMesh接口分别注册你要替换的材质与网格到Graphics系统中去。同时这两个接口会返回对应BatchMaterialID与BatchMeshID,保存好这个ID。
3.注册材质与网格到
获取到对应Entity的MaterialMeshInfo组件,设置对应的字段值为上面你要替换的值即可完成替换。
运行时,可以看到对应MaterialMeshInfo组件值被成功修改。
总结
修改材质属性,以及替换材质与网格,都需要对相应Graphic组件进行修改。材质属性需要映射到组件,而替换材质与网格,需要进行注册后,再进行替换(也是一种映射)。
要注意的是,由于材质与网格都是托管对象,所以只能用托管ECS的方法进行逻辑处理。但是还是可以利用JOB进行效率提升(虽然不能用Burst了),例如使用Entities.ForEach。
与ISystem的差异见下图