在Unity中,有些少数情况下我们需要用代码来创建材质。比如说在材质非常多,而仅仅是纹理不一样的时候。
而用代码创建的材质是没有对应的资源文件的,我们也就无法使用Inspector来设置它的Rendering Mode。
关于Rendering Mode,我稍作介绍:
材质(Material)的属性检视面板(Inspector)里的第一项为渲染模式(RenderingMode)。
渲染模式总共有四种:
有时候我们需要在程序代码( )中设置材质的渲染模式,这时候我们该怎么做呢?这时候可以通过添加以下代码来实现。
public enum RenderingMode
{
Opaque,
Cutout,
Fade,
Transparent,
}
public static void SetMaterialRenderingMode(Material material, RenderingMode renderingMode)
{
switch (renderingMode)
{
case RenderingMode.Opaque:
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = -1;
break;
case RenderingMode.Cutout:
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.Zero);
material.SetInt("_ZWrite", 1);
material.EnableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 2450;
break;
case RenderingMode.Fade:
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.SrcAlpha);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.EnableKeyword("_ALPHABLEND_ON");
material.DisableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
case RenderingMode.Transparent:
material.SetInt("_SrcBlend", (int)UnityEngine.Rendering.BlendMode.One);
material.SetInt("_DstBlend", (int)UnityEngine.Rendering.BlendMode.OneMinusSrcAlpha);
material.SetInt("_ZWrite", 0);
material.DisableKeyword("_ALPHATEST_ON");
material.DisableKeyword("_ALPHABLEND_ON");
material.EnableKeyword("_ALPHAPREMULTIPLY_ON");
material.renderQueue = 3000;
break;
}
}
使用方法:
void Start()
{
// 设置材质的颜色为半透明的颜色才能看到效果,如果材质有贴图,那么贴图也必须是半透明的
GetComponent().material.color = new Color(1, 0, 0, 0.5f);
SetMaterialRenderingMode(GetComponent().material, RenderingMode.Transparent);
}
注意:测试前先在目标物体后放置一个其他物体,如果未添加代码前不可以看到后面物体,而添加之后可以了,那么就表示此代码设置RenderingMode成功。
成功和不成功的结果是这样的:
继续阅读与本文标签相同的文章
迅雷CEO陈磊:不认为Libra能够替代央行
-
GSMA首席执行官洪曜庄:5G时代中国在引领
2026-05-14栏目: 教程
-
猎户星空CEO傅盛:现在是AI发展最好时期,家庭服务机器人前景可期
2026-05-14栏目: 教程
-
5G远程驾驶和微公交首秀互联网大会
2026-05-14栏目: 教程
-
学宏程序编程,这些知识必不可少!
2026-05-14栏目: 教程
-
华为准备卖出“落后”的5G,多家美企极力竞争!任正非格局太大!
2026-05-14栏目: 教程
