在Unity5.x 中,金属度是相对而言是最关键的一个可调整参数。 我们在Unity 中模拟现实生活中的东西,很多时候都需要控制它们的金属度。 金属度测试案例:循环生成多排3D 球体,通过C#代码修改球体身上Shader 的金属度相关参数。 四种情况: 第一排:金属度01,平滑度0; 第二排:金属度01,平滑度1; 第三排:金属度0,平滑度01; 第四排:金属度1,平滑度01。 代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Metallic : MonoBehaviour {
public GameObject prefab;
void Start () {
//金属度0~1,平滑度0;
for(int i = 0; i <= 10; i++)
{
Vector3 pos = new Vector3(i, 0, 0);
GameObject go = GameObject.Instantiate(prefab, pos, Quaternion.identity);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Metallic", i \* 0.1f);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Glossiness", 0);
}
//金属度0~1,平滑度1;
for (int i = 0; i <= 10; i++)
{
Vector3 pos = new Vector3(i, 0, -1);
GameObject go = GameObject.Instantiate(prefab, pos, Quaternion.identity);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Metallic", i \* 0.1f);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Glossiness", 1);
}
//金属度0,平滑度0~1;
for (int i = 0; i <= 10; i++)
{
Vector3 pos = new Vector3(i, 0, -2);
GameObject go = GameObject.Instantiate(prefab, pos, Quaternion.identity);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Metallic", 0);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Glossiness", i \* 0.1f);
}
//金属度1,平滑度0~1
for (int i = 0; i <= 10; i++)
{
Vector3 pos = new Vector3(i, 0, -3);
GameObject go = GameObject.Instantiate(prefab, pos, Quaternion.identity);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Metallic", 1);
go.GetComponent<MeshRenderer>().material.SetFloat("\_Glossiness", i \* 0.1f);
}
}
}
代码中Shader参数的值可以对照Unity官方的着色器压缩包里的代码来书写: [ 案例分析: 金属度不高的,但是平滑度高(如第三排):瓷器,塑料,玻璃等 金属度高,但是平滑度低(如第一排):磨砂金属,金属等 金属度总结: 1.两个参数 Metallic 有两个参数,贴图和滑块条,滑块条控制的参数是01。 金属度贴图是一张黑白图,就是用这些黑到白的颜色,存储01 相关的信息值。 滑块条是调整的整体,调整的时候,整个模型都是统一的一种效果; 贴图则可以分区域控制金属度的高与低,使得模型金属效果更有层次。