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。等设置属性。依据须要设置。

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


无效的程序材质。可是值都已经改动。图也赋上去了,(2014-07-23加入备注。经过測试。这样克隆出一个材质假设改动是不能够使用的。由于这样本身载入错了。改动值的时候也有问题了,仅仅能一个程序材质仅仅能针对一种使用,我研究了下没有好的new出一个新的程序材质的方法,大家有知道的方便告诉下。

)。不知为什么,在ProceduralMaterial和renderer.material的属性也就是正常材质一起改动值的时候会出现这样的情况,

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


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

最后说一下.renderer.sharedMaterial 和renderer.material的差别,我建议使用前者共享材质,可是他在本地开发的时候会出现故障。会影响根材质,这样把自己project中的材质属性就改动了,只是大家能够使用平台推断,在本地project使用后者。公布各个平台使用前者。由于后者每次调用都会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 () {
	
	}
}

这种程序是没有问题的,可是使用改动的都是根材质。这个方案是正确的。肯定没错

版权声明:本文博主原创文章,博客,未经同意不得转载。

posted @ 2015-09-13 11:10  zfyouxi  阅读(790)  评论(0编辑  收藏  举报