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 () {

	}
}

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

unity程序材质ProceduralMaterial使用,布布扣,bubuko.com

时间: 2024-10-19 14:06:05

unity程序材质ProceduralMaterial使用的相关文章

如何降低Unity程序的Drawcall

[如何降低Unity程序的Drawcall] Unity can combine a number of objects at runtime and draws them together with a single draw call. This operation is called “batching” 每帧能够有多少batch依赖于cpu.每个drawcall提交多少个三角形,对cpu压力变化不大,但是每帧有多少个drawcall则影响很明显. 一.Dynamic Batching.

关于Unity程序在IOS和Android上显示内嵌网页的方式

近期因为有须要在Unity程序执行在ios或android手机上显示内嵌网页.所以遍从网上搜集了一下相关的资料.整理例如以下: UnityWebCore 从搜索中先看到了这个.下载下来了以后发现这个的原理好像是通过调用浏览器内核.然后将网页渲染到mesh的方式完毕的. 但遗憾的是仅仅支持windows桌面版本号.但还是发出来大家假设有须要能够下载  下载地址: http://pan.baidu.com/s/1nt3FVkd unity-webview 这个是在github上找到的. 是一个kei

[Unity菜鸟] 材质

1. 材质定义: 2. 把材质都改成支持透明通道 因为物体太多了,比如树跟房子材质必须用不一样的.所以办法还是你得改每个材质的Shader,都改成支持透明通道的. 在Project的搜索窗口输入t: material 然后材质就都出来了. 然后全部选定,把shader 改成Particle/Alpha blended,全选改不了是因为你全选的材质里面存在着用不同shader的材质 [Unity菜鸟] 材质

一台主机多开Unity程序,显示在多个显示器上

记录一个坑. 最近项目需要,一台主机带多台显示器,然后运行多个Unity程序. 1.连接显示器,设置为扩展模式. 2.编写代码, using UnityEngine; public class MyDisplay : MonoBehaviour { [SerializeField] public int displayIndex; //显示器编号 void Awake() { if (Display.displays.Length > 1) { Display.displays[displayI

Unity透明材质Batch

NO Batch  ? 游戏场景中存在大量例子的时候,DrallCall的压力很大,但是遍历一遍之后发现,为啥一样的粒子特效竟然没有合并,why?经过很多测试后发现,如果把透明材质的修改为非半透明的,就可以合并,这就让我很奇怪了?Unity提供了材质动态合并的功能,虽然限制很多,但是对于透明材质的合并,Unity似乎给了一个很玄乎的答案: Semitransparent shaders most often require objects to be rendered in back-to-fr

Unity自发光材质制作——做游戏里的液晶显示屏,荧光对象可以用到

材质以及效果都是在Unity里实现的,纹理是在Photoshop里做的,所以也会说到Photoshop软件的操作方法,自发光或者是荧光效果还不错

Unity程序协同问题,传送时屏幕变黑变亮的解决,常规操作的行为集合

在unity中运行某段程序时往往需要运行另外一段不相干但是却对功能上有需求的程序,比如进行场景传送,在传送点处,点击I键,屏幕慢慢变黑,场景传送到另外一个场景,场景又慢慢变亮.这里首先涉及两个物体,一个是传送触发器物体,点击I键,过一段时间后进行场景传送,另外一个就是遮罩物体,这里使用UGUI中的Panel,变黑和变亮主要修改它的透明度.达成上诉效果可以使用到以下几种方式:一,将panel物体作为触发器物体的参数物体,触发其物体执行panel中的代码,或者直接对panel物体进行操作.二,消息传

unity, 在材质上指定render queue

材质球inspector面板在debug模式下可以看到Custom Render Queue一项: 其默认值为-1,表示使用相应shader的render queue设置. 也可以人为将其改为其它值,例如2000(opaque)或3000(transparent)等. 但严重不建议这样做,因为这使得材质的渲染顺序与shader不一致,容易让人困惑.

Unity反射材质制作——镜中花,水中月,但是非镜面效果哟

只需导入两张纹理图片,然后在Unity中做相应设置就可以了,果然这个软件很强大,都不带写代码的.做游戏特效越来越简单,是好事,还是坏事