首页 > 代码库 > unity程序材质ProceduralMaterial使用

unity程序材质ProceduralMaterial使用

有些效果是用substance的材质,但是材质上的属性无法用平常的Material方法调用,需要ProceduralMaterial去调用,

using UnityEngine;
using System.Collections;

public class TestProceduralMaterial : MonoBehaviour {
	public GameObject TestCube;
	public Texture2D tex;
	public ProceduralMaterial materialItem;
	void Start () {
		ProceduralMaterial substance = Object.Instantiate(materialItem) as ProceduralMaterial;//加载一个程序材质

		TestCube.renderer.sharedMaterial = substance;
		TestCube.renderer.sharedMaterial.SetTextureScale("_MainTex" , new Vector2(3,3));//改变uv,这是正常材质的方法
		ProceduralPropertyDescription[] inputs = substance.GetProceduralPropertyDescriptions();
		foreach(ProceduralPropertyDescription input in inputs)//获得程序材质的属性,有的属性不知道是什么名字的时候可以用这个获得所有属性名字和类型
		{
			Debug.Log("input type = "+input.type +"   input name = "+input.name);
		}
		substance.SetProceduralBoolean("Battens",true);//设置bool
		substance.SetProceduralFloat("Battens_Amount_X",6f);//设置float
		substance.SetProceduralColor("Wood_Color",new Color(0.8f,0.5f,0.2f));//设置颜色
		substance.SetProceduralTexture("Input",tex);//设置贴图
		substance.RebuildTextures();//这句话是必须的应用所有修改。
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

当然还有SetProceduralEnum,SetProceduralVector。等设置属性,根据需要设置。

我在加载的时候会出现这个问题


无效未知的程序材质,但是值都已经修改,图也赋上去了,不知为什么,在ProceduralMaterial和renderer.material的属性也就是正常材质一起修改值的时候会出现这种情况,

我是为了同一个材质在不同的物体上有不同的参数,才去这样设置Object.Instantiate(materialItem) as ProceduralMaterial;//加载一个程序材质,这样保证不修改主材质球的属性,可以在不同物体上使用同一个substance通过调整值去实现不同的效果,如果我不使用这句话Object.Instantiate,去加载就没事了,显示正常,但是这样只能一个材质球对应一个物体,其他的物体再次这样使用这个材质球的时候,修改参数的时候修改的是主材质球,这样物体就全变了,变成你最后一次修改的参数效果。


这样就会显示出来,这个只影响界面参数显示,不影响实际效果,但是看着那个无效的程序材质invalid Procedural Material有些不爽,不知自己的值是否正确,是否自己想要的,我通过测试确实参数都相应的修改了,有哪位大侠知道请告知小弟,

最后说一下.renderer.sharedMaterial 和renderer.material的区别,我建议使用前者共享材质,但是他在本地开发的时候会出现问题,会影响根材质,这样把自己工程中的材质属性就修改了,不过大家可以使用平台判断,在本地工程使用后者,发布各个平台使用前者,因为后者每次调用都会new一个材质出来,太耗内存了。

using UnityEngine;
using System.Collections;

public class TestProceduralMaterial : MonoBehaviour {
	public GameObject TestCube;
	public Texture2D tex;
	public Material materialItem;
	void Start () {


		TestCube.renderer.sharedMaterial = materialItem;
		TestCube.renderer.sharedMaterial.mainTextureScale = new Vector2(3,3);//改变uv,这是正常材质的方法
		ProceduralMaterial substance = TestCube.renderer.sharedMaterial as ProceduralMaterial;//得到该物体的程序材质
		ProceduralPropertyDescription[] inputs = substance.GetProceduralPropertyDescriptions();
		foreach(ProceduralPropertyDescription input in inputs)//获得程序材质的属性,有的属性不知道是什么名字的时候可以用这个获得所有属性名字和类型
		{
			Debug.Log("input type = "+input.type +"   input name = "+input.name);
		}
		substance.SetProceduralBoolean("Battens",true);//设置bool
		substance.SetProceduralFloat("Battens_Amount_X",6f);//设置float
		substance.SetProceduralColor("Wood_Color",new Color(0.8f,0.5f,0.2f));//设置颜色
		substance.SetProceduralTexture("Input",tex);//设置贴图
		substance.RebuildTextures();//这句话是必须的应用所有修改。
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

这样的程序是没有问题的,但是使用修改的都是根材质