通過腳本訪問和修改材質(zhì)參數(shù)
在檢視面板中,您所看到的所有材質(zhì)參數(shù)都可以通過腳本來訪問,這可以允許您在運行時修改材質(zhì)的行為,利用這一點您可以制作出基于材質(zhì)屬性的動畫效果。
在游戲運行過程中,您可以動態(tài)修改材質(zhì)的數(shù)值屬性、更改顏色,以及更換紋理。在這種工作中最常用到的函數(shù)有這些:

完整的材質(zhì)處理函數(shù)列表可以參考?Material 類腳本參考。
有一點需要注意的是,這些函數(shù)只會設(shè)置當(dāng)前著色器能夠使用的材質(zhì)屬性。這意味著,如果著色器不使用任何紋理,或者根本沒有綁定任何著色器,則調(diào)用?SetTexture?將無效。即使稍后設(shè)置了需要紋理的著色器,也是如此。因此,建議您在設(shè)置任何屬性之前,先設(shè)置著色器。一旦完成設(shè)置后,您就可以在使用同一組紋理和屬性值的著色器之間切換,所有設(shè)定的值都會得到保留。
這些函數(shù)的作用與所有簡單著色器(如舊版著色器)以及除標(biāo)準(zhǔn)著色器以外的內(nèi)置著色器(如粒子、精靈、UI 和無光照著色器)相同。但是,對于使用標(biāo)準(zhǔn)著色器的材質(zhì),在完全修改材質(zhì)之前,您還必須了解一些其他要求。
使用標(biāo)準(zhǔn)著色器編寫腳本的特殊要求
如果要在運行時修改材質(zhì),標(biāo)準(zhǔn)著色器有一些額外的要求,因為標(biāo)準(zhǔn)著色器在幕后實際上是由許多不同著色器合為一體的著色器。
這些不同類型的著色器稱為著色器變體,可以把它考慮為所有著色器功能的組合,其中部分功能處于激活狀態(tài),其余則處于未激活狀態(tài)。
例如,如果您為材質(zhì)設(shè)置了一個法線貼圖,就會激活支持法線貼圖的著色器變體。如果隨后又設(shè)置了高度貼圖,就會激活同時支持法線貼圖和高度貼圖的著色器變體。
這是一種很好的機(jī)制,它意味著當(dāng)您使用標(biāo)準(zhǔn)著色器時,如果某個材質(zhì)中沒有使用法線貼圖,它就不會存在法線貼圖的性能開銷,因為您實際運行的著色器省略了這部分功能的代碼。這也意味著,如果您從不使用某個功能組合(例如“高度貼圖”(HeightMap) 和“發(fā)光”(Emissive) 的組合),則您的構(gòu)建版本中將完全忽略掉該變體;實際上,您通常只會用到標(biāo)準(zhǔn)著色器中極少數(shù)的可能變體。
Unity 會阻止簡單地在構(gòu)建中包含所有可能的著色器變體的行為,因為這將是一個非常大的數(shù)字,可能有數(shù)萬個!這個巨大的數(shù)字不僅因為材質(zhì)檢視面板中每種可能的功能組合方式極其繁多,還因為針對不同渲染方案(例如是否使用 HDR、光照貼圖、GI、霧效等)的每種功能組合存在多種變體。囊括所有這些可能性將導(dǎo)致加載緩慢、內(nèi)存消耗高,并增加構(gòu)建文件尺寸和構(gòu)建時間。
所以 Unity 的替代方案是:通過檢查項目中使用的材質(zhì)資源來追蹤您使用過的著色器變體。無論在項目中加入了哪些標(biāo)準(zhǔn)著色器變體,這些變體都會包含在構(gòu)建中。
這個方案在通過腳本訪問標(biāo)準(zhǔn)著色器材質(zhì)的情況下,存在兩個問題。
1.您必須為所需的標(biāo)準(zhǔn)著色器變體啟用正確的關(guān)鍵字
如果使用腳本來更改材質(zhì),而這種更改會導(dǎo)致材質(zhì)使用標(biāo)準(zhǔn)著色器的另一種不同變體,則必須使用?EnableKeyword?函數(shù)啟用該變體。如果您開始使用一個并未被材質(zhì)使用過的著色器功能,另一個額外的變體就會被啟用起來。例如將法線貼圖分配給先前沒有此貼圖的材質(zhì),或者將初始為零的發(fā)光級別設(shè)置為大于零的值。
用來啟用標(biāo)準(zhǔn)著色器功能的關(guān)鍵字如下:

使用上面的關(guān)鍵字足以讓您的材質(zhì)修改腳本在編輯器運行模式中起效。
但是,由于 Unity 僅通過檢查項目中使用的材質(zhì)來確定要在構(gòu)建中包含哪些變體,因此它不會包含僅在運行時通過腳本使用到的變體。
這就是說,如果您在腳本中為材質(zhì)啟用 _PARALLAXMAP 關(guān)鍵字,但是項目中未使用與該功能組合匹配的材質(zhì),則視差貼圖將無法在最終構(gòu)建中生效(即使在編輯器中看起來正常)。這是因為構(gòu)建過程將會忽略該變體,因為它看起來不是必需的。
2.您必須確保 Unity 在構(gòu)建中包含所需的著色器變體
為此,您需要確保 Unity 知道您要使用該著色器變體,具體方法就是在資源中包含至少一個該類型的材質(zhì)。該材質(zhì)必須應(yīng)用在場景中,或者也可以將其放入?Resources 文件夾,否則該材質(zhì)處于未使用狀態(tài),Unity 仍會在構(gòu)建中忽略它。
通過完成上述兩個步驟,即可在運行時使用標(biāo)準(zhǔn)著色器修改材質(zhì)。
如果您有興趣了解有關(guān)著色器變體的詳細(xì)信息以及如何構(gòu)建自己的變體,請閱讀制作多個著色器程序變體的信息。