Unity在运行时(代码中)设置材质的渲染模式(RenderingMode)

本文介绍了如何在Unity中通过代码设置材质的渲染模式,包括不透明、镂空、隐现和透明等四种模式,并提供了具体实现的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原文链接:http://www.cnblogs.com/jarvisniu/p/5504788.html

Unity中,有些少数情况下我们需要用代码来创建材质。比如说在材质非常多,而仅仅是纹理不一样的时候。

而用代码创建的材质是没有对应的资源文件的,我们也就无法使用Inspector来设置它的Rendering Mode。

 

关于Rendering Mode,许我稍作介绍:

材质(Material)的属性检视面板(Inspector)里的第一项为渲染模式(RenderingMode)

渲染模式总共有四种:

渲染模式

意思

适用对象举例

说明

Opaque

不透明

石头

适用于所有的不透明的物体

Cutout

镂空

破布

透明度不是0%就是100%,不存在半透明的区域。

Fade

隐现

物体隐去

Transparent的区别为高光反射会随着透明度而消失。

Transparent

透明

玻璃

适用于像彩色玻璃一样的半透明物体,高光反射不会随透明而消失。

 

有时候我们需要在程序代码(Script)中设置材质的渲染模式,这时候我们该怎么做呢?这时候可以通过添加以下代码来实现。

复制代码
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<MeshRenderer> ().material.color = new Color (1, 0, 0, 0.5f);
    SetMaterialRenderingMode (GetComponent<MeshRenderer> ().material, RenderingMode.Transparent);
}

注意:测试前先在目标物体后放置一个其他物体,如果未添加代码前不可以看到后面物体,而添加之后可以了,那么就表示此代码设置RenderingMode成功。

成功和不成功的结果是这样的:

### 如何在 Unity 中更改材质球的渲染模式Unity 中,可以通过编程方式来修改材质球的 `Rendering Mode` 属性。这通常涉及到访问并调整材质对象的相关设置。 对于 Standard Shader 材质而言,在脚本中可以利用特定的方法实现这一功能。下面是一个具体的例子: #### 修改 Material 的 Rendering Mode 方法 定义一个函数用于设定材质渲染模式,此操作会直接影响到该材质所应用的对象外观表现形式[^2]。 ```csharp using UnityEngine; public static class MaterialExtensions { public enum RenderingMode { Opaque, Cutout, Fade, Transparent } /// <summary> /// 设置材质渲染模式. /// </summary> /// <param name="material">要修改的材质.</param> /// <param name="mode">目标渲染模式.</param> public static void SetMaterialRenderingMode(this Material material, RenderingMode mode) { switch (mode) { case RenderingMode.Opaque: material.SetInt("_Mode", 0); material.SetOverrideTag("RenderType", ""); break; case RenderingMode.Cutout: material.SetInt("_Mode", 1); material.SetOverrideTag("RenderType", "TransparentCutout"); break; case RenderingMode.Fade: material.SetInt("_Mode", 2); material.SetOverrideTag("RenderType", "Fade"); break; case RenderingMode.Transparent: material.SetInt("_Mode", 3); material.SetOverrideTag("RenderType", "Transparent"); break; } material.DisableKeyword("_SPECULARHIGHLIGHTS_OFF"); material.DisableKeyword("_GLOSSYREFLECTIONS_OFF"); bool shouldEnableSpecular = mode != RenderingModeOpaque && mode != RenderingModeCutout; string specularState = shouldEnableSpecular ? "" : "_SPECULARHIGHLIGHTS_OFF"; material.EnableKeyword(specularState); string reflectionsState = shouldEnableSpecular ? "" : "_GLOSSYREFLECTIONS_OFF"; material.EnableKeyword(reflectionsState); } } ``` 这段代码展示了如何创建一个扩展方法 `SetMaterialRenderingMode` ,它接受一个枚举参数指定新的渲染模式,并据此更新 `_Mode` 和其他相关属性以适应不同的透明度效果需求。 #### 应用实例 当希望在一个场景启动就改变多个网格渲染器下的材质颜色及其渲染模式为例: ```csharp void Start() { MeshRenderer[] meshes = GetComponentsInChildren<MeshRenderer>(); foreach (var renderer in meshes) { var mat = renderer.material; mat.color = new Color(1, 0, 0, 0.5f); // 更改颜色为半透明红色 // 调用自定义静态类中的方法来更改编译模式 mat.SetMaterialRenderingMode(MaterialExtensions.RenderingMode.Transparent)[^3]; } } ``` 上述代码片段会在游戏开始运行候遍历所有的子物体上的 `MeshRenderer` 组件,然后逐一将其对应的材质的颜色设为带有 alpha 值(即部分透明)的红色,并且将这些材质切换成透明 (`Transparent`) 渲染模式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值