有些效果是用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。等设置属性,根据需要设置。

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

unity模型怎么给材质球贴图 unity给材质球赋贴图_System

无效的程序材质,但是值都已经修改,图也赋上去了,(2014-07-23添加备注,经过测试,这样克隆出一个材质如果修改是不可以使用的,因为这样本身加载错了,修改值的时候也有问题了,只能一个程序材质只能针对一种使用,我研究了下没有好的new出一个新的程序材质的方法,大家有知道的方便告诉下。),不知为什么,在ProceduralMaterial和renderer.material的属性也就是正常材质一起修改值的时候会出现这种情况,

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

unity模型怎么给材质球贴图 unity给材质球赋贴图_unity模型怎么给材质球贴图_02

这样就会显示出来,这个只影响界面参数显示,不影响实际效果,但是看着那个无效的程序材质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 () {
	
	}
}



这样的程序是没有问题的,但是使用修改的都是根材质,这种方法是正确的,肯定没错