Unity | ShaderGUI
內(nèi)容偏多 前看目錄

效果
主要是使用的時候方便簡單,
特效使用過程使用最頻繁的是設(shè)置不同的疊加模式,所以制作4個大按鈕。

這里只介紹方法,Shader不能提供
自定義著色器GUI(ShaderGUI)
有時候著色器中會包含一些數(shù)據(jù)類型,而內(nèi)置的Unity材質(zhì)編輯器無法很好表達這些數(shù)據(jù)類型。Unity提供了兩種方法來使用戶可以定義自己的方法來覆蓋著色器屬性的默認方式。用戶可以通過這個功能來定義自定義控件和數(shù)據(jù)范圍。
兩種方法:
通過重新編寫UnityEditor的ShaderGUI類來實現(xiàn)
直接使用MaterialPropertyDrawers來實現(xiàn)
其中,第一種方法類似于傳統(tǒng)的unity編輯器擴展的方法,首先需要一個自定義編輯器的著色器,然后使用ShaderGUI類進行代碼編寫。
第二個部分是直接在Shader文件中使用Unity給我們設(shè)置好的一些預(yù)命令(MaterialProperty)來實現(xiàn)編輯器的擴展。Unity官方文檔給出了詳細的案例參考,這里就不詳細展開,貼上官方的鏈接。

2. 創(chuàng)建GUI 文件
找到 Editor文件夾 創(chuàng)建一個測試的文件

定義測試的功能
回到Shader文件里,在底部增加我們的GUI文件

效果

可以看到目前是正確顯示的。那我們正式開始編輯功能。
功能開發(fā)
1. 貼圖顯示
前實現(xiàn)顯示貼圖的功能,我們把Shader內(nèi)的貼圖屬性,映射到GUI里。
效果

增加基礎(chǔ)貼圖顏色調(diào)整
擴展 TexturePropertySingleLine 的使用方法?
主要是處理,材質(zhì)屬性和GUI屬性綁定

接下來顯示貼圖UV偏移和平鋪
效果

我們希望平鋪和偏移是在貼圖下方點,不要和貼圖同樣開頭。
使用?indentLevel++來控制縮進
效果

我們希望做一個功能,增加貼圖才顯示對應(yīng)的屬性。這樣保持Shader界面的整潔。
這里有一個新的方法,判斷貼圖是否為空,
如果空不顯示對應(yīng)的屬性,如果為空顯示我們的屬性條件。
這里把我們上面的貼圖屬性也優(yōu)化一下。
使用判斷 如果為空,就或者貼圖,不為空繪制貼圖的屬性。
效果

這是倆種效果對比。

2. 整合資源
可以看到目前的輸入類型資源有點多,有點亂,我們整理一下輸入數(shù)據(jù)

GUIContent ? 類型的數(shù)據(jù)是綁定,?
MaterialProperty ? 是獲取到Shader的屬性
那我們規(guī)劃整合一下
把GUIContent ? ?的屬性放到一個類里,公開屬性
調(diào)用的時候,使用這個類獲取數(shù)據(jù)
這樣我們就把 貼圖整合到 4 個區(qū)域
3. 整合成4個區(qū)域

代碼
擴展 m_MatEditor.RangeProperty(Alpha, "Alpha");
使用這樣的方法可以減少代碼。
效果

4. 法線貼圖
上面可以在主貼圖的右邊增加顏色屬性,目前想做法線增加一個控制法線強度的屬性。 Unity 沒有我們自定義一個方法。
定義屬性
我們顯示到主貼圖里。
前自定義一個繪制UI的方法
調(diào)用法線貼圖

效果


折疊功能
我們需要定義一個函數(shù) 繪制我們的折疊欄
1. 折疊屬性
定義一個 bool類型 的變量,控制折疊。
使用 if控制顯示
測試

2. 裝飾欄
定義一個函數(shù),繪制裝飾欄
我們在調(diào)用這個函數(shù)
效果

3. 區(qū)域功能
如果我們在給我們的區(qū)域設(shè)置一個顯示框,怎么處理。

只需要設(shè)置一個HelpBox

代碼

基礎(chǔ)設(shè)置功能
1. 按鈕功能
定義一個按鈕
定義Shader 屬性的方法 ?設(shè)置材質(zhì)的屬性
在OnGUI 函數(shù)里調(diào)用
效果

2. 枚舉按鈕
這個Shader 是給特效使用的Shader ,特效經(jīng)常使用的是設(shè)置材質(zhì)的疊加模式。
所以我們制作一個設(shè)置疊加模式的按鈕。
Shader 定義設(shè)置疊加模式
關(guān)聯(lián)對應(yīng)的屬性

Shader就處理完 ,到GUI文件里定義屬性,
綁定屬性

前把我們的需要設(shè)置的屬性暴露出來。
效果

開始處理按鈕,
這是一個枚舉類型的數(shù)據(jù),我們需要轉(zhuǎn)換成按鈕使用。
前設(shè)置顯示 文字,這里我們設(shè)置 4種,一種是基礎(chǔ),一種Alpha混合 ?疊加, 疊加忽略Alpha的
我們還需要把枚舉類型轉(zhuǎn)換成數(shù)值, 比如 0 普通, 1 混合 2 疊加 3 疊加(忽略Alpha)
定義一個函數(shù),我們獲取材質(zhì)里的疊加模式。設(shè)置
定義一個函數(shù),繪制我們的按鈕,增加功能
把我們的功能增加到 ?OnGUI 函數(shù)里
效果


開關(guān)功能
1. 單開關(guān)功能
想給Shader增加一個開關(guān)的GUI怎么制作,
前定義一個開關(guān)變量,
使用 開關(guān)的屬性,定義對應(yīng)的數(shù)值,
效果

2. 開關(guān)有屬性
如果有屬性我們就使用if來判斷, 需要顯示的數(shù)據(jù)。
3. 宏開關(guān)
使用判斷來材質(zhì)是否開啟宏開關(guān)
這是使用判斷開啟,
這是判斷貼圖是否開啟,顯示對應(yīng)的宏開關(guān)。

示例 :開啟宏
Shader 使用 2張貼圖一張做Mask 使用。
Shader 定義變量
關(guān)鍵字顯示
全代碼
GUI腳本增加代碼
我們需要獲取到材質(zhì)里的關(guān)鍵字,所以我們前想要定義一個材質(zhì)類型
show函數(shù) 增加我們需要的變量
處理關(guān)鍵字邏輯
效果


全代碼
資料
LWGUI船新版本 重新定義ShaderGUI - 知乎 (zhihu.com)
不會代碼也能擁有!ShaderGUI_嗶哩嗶哩_bilibili
Unity - 腳本 API:編輯器圖形用戶界面 (unity3d.com)
小學(xué)二年級都會寫的ShaderGUI - 知乎 (zhihu.com)