Unity 3D動態修改Shader狀態,使物體透明等等


Unity動態改Shader狀態透明


本文提供全流程,中文翻譯。

Chinar 堅持將簡單的生活方式,帶給世人!

(擁有更好的閱讀體驗 —— 高分辨率用戶請根據需求調整網頁縮放比例)



Chinar —— 心分享、心創新!

助力快速完成 Shader 的動態修改

為新手節省寶貴的時間,避免采坑!


Chinar 教程效果:
這里寫圖片描述



全文高清圖片,點擊即可放大觀看 (很多人竟然不知道)


1

Change Matirials Shader —— 改變材質着色狀態


一個簡單的小例子,沒什么可說的

可以很簡便的完成一個物體材質 Shader 的動態更改

舉個栗子黑白88

using UnityEngine;


/// <summary>
/// 枚舉Shader4種狀態類型
/// </summary>
public enum RenderingMode
{
    Opaque,
    Cutout,
    Fade,
    Transparent,
}


/// <summary>
/// 測試類:用於動態修改Shader
/// </summary>
public class Chinar : MonoBehaviour
{
    public GameObject CubeGameObject; //需要改變Shader的物體
    public float      Speed = 15f;    //時間插值


    void Update()
    {
        transform.Rotate(Vector3.up, Speed * Time.deltaTime);
    }


    /// <summary>
    /// 綁定按鈕:改變Shader狀態
    /// </summary>
    public void ChangeShader()
    {
        //設置材質的顏色為半透明的顏色/材質有貼圖,那么貼圖也必須是半透明的才能看到效果
        CubeGameObject.GetComponent<MeshRenderer>().material.color = RandomColor();
        SetMaterialRenderingMode(CubeGameObject.GetComponent<MeshRenderer>().material, RenderingMode.Transparent);
    }


    /// <summary>
    /// 隨機顏色
    /// </summary>
    /// <returns> Color </returns>
    private Color RandomColor()
    {
        float r     = Random.Range(0f, 1f);
        float g     = Random.Range(0f, 1f);
        float b     = Random.Range(0f, 1f);
        float a     = Random.Range(0f, 0.5f); //這里隨機透明度
        Color color = new Color(r, g, b, a);
        return color;
    }


    /// <summary>
    /// 具體處理材質Shader函數
    /// </summary>
    /// <param name="material"></param>
    /// <param name="renderingMode"></param>
    public 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;
        }
    }
}

2

Change Matirials Shader —— 改變材質着色狀態


不明白的請下載Demo

簡單易懂,拿了就用!
舉個栗子黑白88
簡單易懂游戲中動態修改Shader狀態的例子、實現透明
這里寫圖片描述


支持

May Be —— 搞開發,總有一天要做的事!


擁有自己的服務器,無需再找攻略!

Chinar 提供一站式教程,閉眼式創建!

為新手節省寶貴時間,避免采坑!


先點擊領取 —— 阿里全產品優惠券 (享受最低優惠)


1 —— 雲服務器超全購買流程 (新手必備!)

2 —— 阿里ECS雲服務器自定義配置 - 購買教程(新手必備!)

3—— Windows 服務器配置、運行、建站一條龍 !

4 —— Linux 服務器配置、運行、建站一條龍 !





Chinar


END

本博客為非營利性個人原創,除部分有明確署名的作品外,所刊登的所有作品的著作權均為本人所擁有,本人保留所有法定權利。違者必究

對於需要復制、轉載、鏈接和傳播博客文章或內容的,請及時和本博主進行聯系,留言,Email: ichinar@icloud.com

對於經本博主明確授權和許可使用文章及內容的,使用時請注明文章或內容出處並注明網址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM