Unity 3D 的 Shader 運行時狀態及渲染模式問題

Unity 中的 Shader 有四種渲染模式,分別是:html

——Opaque(不透明)
——Cutout(鏤空)
——Fade(隱現)
——Transparent(透明)

以前我遇到一個需求,須要給特定的遊戲物體添加一個冰凍的效果,可是給個人 Shader
是一個徹底冰凍的 Shader,並且沒法經過參數調整它的顏色值。以後個人同事告訴我可
以經過修改渲染模式更改物體自己的Alpha值實現,因此第一步我尋找了網上關於修改運
行時 Shader 渲染模式的代碼,以下。
http://www.voidcn.com/article...數組

而後就是簡單的代碼操做,以下。函數

//獲取目標身上的渲染組件
       var renderer = GetComponentsInChildren<Renderer>();
       // 創建一個冰凍數組 第二個數組元素是事先找好的冰凍特效
       Material[] frostMatetials = new Material[2] { renderer.material,
        frostEffect };
       //添加冰凍特效到人物身上的數組中
       renderer.materials = frostMatetials;
       //實例化一個渲染模式變量
       var fadeMode = SetMaterialRenderingMode.RenderingMode.Fade;
       //根據網上的方法更改你的 Shader 渲染模式爲 Fade
           
      SetMaterialRenderingMode.SetMaterialRenderingModeMethod(
      renderer.materials[0],fadeMode);

因爲 Color 的 Alpha 值是隻讀的不能修改,可是 Color 是能夠修改的,因此要獲取目標
物體 Color 的 RGB 值,而後實例一個 Color 用構造函數更改成你想要的 Alpha 值。以下:spa

Color currentcolor03 = new Color
        {
            a = 0.8f,
            r = renderer.materials[0].color.r,
            g = renderer.materials[0].color.g,
            b = renderer.materials[0].color.b
        };
        //替換目標 Color 屬性就能夠實現了

其實這個方法不是很好,主要是由於所給的 Shader 不能修改屬性值,後來我拿到了能夠更改
屬性值的Shader,事情就變得簡單了許多。code

圖片描述

這是我拿到的材料,能夠經過材料找到材料中包含的 Shader,裏面能夠看到每一個值所對應的參數。htm

圖片描述

這樣的話修改就只須要經過調用方法 Material.SetFloat(); 及其相似方法,括號裏面是兩個
參數一個是 String 類型的參數,表示經過 String 獲取想要改變的參數,第二個是更改的值。遊戲

這期間我遇到一個問題,最後找了好久發現是編譯器的問題,我在用第一種方法的時候,若是正常
狀況下能夠修改渲染模式,而且我用了三個 Color 來依次替換實現了漸變效果,可是若是我在
Hierarchy 面板中選中這個物體那麼正在改變的物體就會忽然變回更改以前的默認狀態,或者如
果你預先選中了這個將要更改的物體他也會出現一樣的效果,就是不能在編譯狀態下選中這個遊
戲物體,不能在 Inspector 面板中查看他的渲染狀態,最後我得出了一個運行時渲染的詞語來
描述這個行爲,
若是你在運行時更改了遊戲物體 Shader 的渲染模式,那麼查看他的渲染模式會致使他的渲染模
式屬性重置。圖片

相關文章
相關標籤/搜索