Unity中使用C#脚本控制物体Material的透明度

实现方法

工程中遇到了这样的问题,需要进行调整物体的透明度。
通过查找资料发现,需要将Object的Rendering Mode调整为Fade才可以进行透明度a的调整。

因此,调整物体的透明度分为两步骤:

修改Rendering Mode
修改material的color属性

将物体调成实体也是同样的操作

代码如下,夹带了一些VRTK的手柄监视,就不删去了。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using VRTK;
using UnityEngine.Animations;

public class Car_boom : MonoBehaviour
{
    public GameObject carboom;
    public GameObject driver;
    public VRTK_ControllerEvents controllerEvents;
    public bool judge = false;

    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;
        }
    }    

    // Start is called before the first frame update
    void Start()
    {
        driver = GameObject.Find("Gengon001");
        controllerEvents = GetComponent<VRTK_ControllerEvents>();
        //Setup controller event listeners
        GetComponent<VRTK_ControllerEvents>().StartMenuPressed += new ControllerInteractionEventHandler(DoStartMenuPressed);
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    private void DoStartMenuPressed(object sender, ControllerInteractionEventArgs e)
    {
        if(!judge)//透明
        {
            //透明与renderingmode
            SetMaterialRenderingMode(driver.GetComponent<MeshRenderer>().material,RenderingMode.Fade);
            Color cr = driver.GetComponent<MeshRenderer>().material.color;
            cr.a = 100f/255f;
            driver.GetComponent<MeshRenderer>().material.color = cr;

            judge = true;
        }
        else//实体
        {
            //透明与renderingmode
            SetMaterialRenderingMode(driver.GetComponent<MeshRenderer>().material,RenderingMode.Opaque);
            Color cr = driver.GetComponent<MeshRenderer>().material.color;
            cr.a = 255f/255f;
            driver.GetComponent<MeshRenderer>().material.color = cr;

            judge = false;
        }
        
    }


    
}
### 如何在 Unity 中通过脚本动态调整材质透明度 为了实现在 Unity 中动态控制物体透明度,可以采用如下方式: #### 创建带有透明度功能的 Shader 首先,在 Unity 编辑器内新建一个名为 `TransparencyShader` 的着色器文件。对于希望实现简单透明效果的情况,可以选择基于 Unlit 或者 Standard 表面着色器作为基础模板,并在此基础上加入 Alpha 通道的支持。 ```csharp // TransparencyShader.shader 文件内容示例 (Unlit 版本) Shader "Custom/TransparencyShader" { Properties { _MainTex ("Texture", 2D) = "white" {} _AlphaValue ("Alpha Value", Range(0,1)) = 1.0 } SubShader { Tags { "RenderType"="Transparent" "Queue"="Transparent"} Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag sampler2D _MainTex; float _AlphaValue; struct appdata_t { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 pos : SV_POSITION; }; v2f vert(appdata_t v) { v2f o; o.pos = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag(v2f i) : COLOR { fixed4 col = tex2D(_MainTex, i.uv); col.a *= _AlphaValue; // 控制最终颜色的alpha值 return col; } ENDCG } } } ``` 此段代码定义了一个简单的未照明(unlit)着色器,其中 `_AlphaValue` 属性用于接收外部传入的透明度数值[^2]。 #### 使用 C# 脚本更改 Material 的属性 接着,可以通过编写一段 C# 脚本来访问并修改已分配给 GameObject 上渲染组件所使用的材质对象及其内部存储的颜色或纹理等资源。下面是一个例子展示了怎样利用此类方法去实时更新指定游戏对象表面材料的不透明程度。 ```csharp using UnityEngine; public class ChangeMaterialOpacity : MonoBehaviour { public Renderer objectRenderer; // 渲染器引用 private Material materialInstance; // 材质实例 void Start() { if(objectRenderer != null){ materialInstance = objectRenderer.material; }else Debug.LogError("请为该脚本设置有效的渲染器"); } /// <summary> /// 设置目标材质的新透明度 /// </summary> /// <param name="newOpacity">取值范围应在 [0,1]</param> public void SetNewOpacity(float newOpacity) { if(materialInstance.HasProperty("_AlphaValue")) { materialInstance.SetFloat("_AlphaValue", Mathf.Clamp(newOpacity, 0f, 1f)); } else { Debug.LogWarning("当前材质并不支持 '_AlphaValue' 参数."); } } } ``` 上述代码片段提供了一种机制,允许开发者通过调用 `SetNewOpacity()` 方法来自由设定任意合法范围内(即介于 0 和 1 之间)的目标透明级别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值