Unity 2019.3中爲Sprite新引入的“Secondary Texture”中比較特殊的“Normal Map”和“Mask Texture”的用法詳解

目錄

一、”Normal Map“的用法

二、”Mask Texture“的用法

三、如何在代碼中動態獲取或者設置2D精靈(Sprite)的“Mask Texture”和“Normal Map”?


在Unity的2D光照系統中,2D精靈(Sprite)可以通過添加“Secondary Texture”來豐富精靈(Sprite)的表現形式,一個2D精靈(Sprite)允許添加最多8個”Secondary Texture“,而其中有兩類比較特殊的貼圖,一個是”Normal Map“,另一個就是”Mask Texture“,它們之所以特殊,就是因爲它們是2D光照系統中定義好行爲的貼圖(Texture),通過給2D精靈(Sprite)添加”Normal Map“或者”Mask Texture“可以增強2D精靈(Sprite)在2D光照下的表現形式,具體說明可以參見我的另一篇原創技術博客。下面我們將分別講解”Normal Map“和”Mask Texture“的詳細用法。

在使用”Normal Map“和”Mask Texture“之前需要明確一點:這裏提到的”Normal Map“和”Mask Texture“是作爲”Secondary Texture“賦給2D精靈(Sprite),並且需要配合Unity官方提供的2D光照系統才能發揮作用,和3D遊戲中類似的概念沒有關係。比如,3D遊戲中也有法線貼圖(Normal Map)的概念,不過和這裏的法線貼圖(Normal Map)無關,雖然在概念上無關,但是在製作方法上是一樣的。

 

一、”Normal Map“的用法


1、爲2D精靈(Sprite)創建專屬的法線貼圖(Normal Map):我們要使用第三方的軟件才能爲2D精靈(Sprite)創建專屬的法線貼圖(Normal Map),創建2D精靈(Sprite)使用的法線貼圖(Normal Map)和創建3D模型(Model)使用的法線貼圖(Normal Map)的步驟是一樣的。創建法線貼圖(Normal Map)的軟件有很多,比如:xNormalSpriteIlluminator等。這些軟件的具體用法可以上網搜,網上的資源一大堆。

2、將創建好的法線貼圖(Normal Map)賦給2D精靈(Sprite):具體方法請參見官方文檔其中有兩點需要特別注意,第一點就是將製作好的法線貼圖(Normal Map)導入到Unity編輯器中的時候,圖片資源在Inspector面板上的“Texture Type”屬性應該選擇“Sprite (2D and UI)”,而不是“Normal map”(如果想要知道原因,可以參見我的另一篇原創技術博客),第二點就是在Sprite Editor中爲2D精靈(Sprite)添加法線貼圖(Normal Map)的時候,“Secondary Texture”的“Name”屬性值不能亂寫,必須用2D光照系統指定的字符串常量,即“_NormalMap”,我們可以通過點擊輸入框後面的下拉列表來選擇這個字符串常量(如果想要知道原因,可以參見我的另一篇原創技術博客)。

3、設置2D精靈(Sprite)的法線貼圖(Normal Map),讓它在場景中發揮作用:經過上面兩個步驟之後,我們還需要設置一個關鍵的屬性,否則我們無法看到2D精靈(Sprite)添加法線貼圖(Normal Map)之後的效果,這個關鍵的屬性就是“Light 2D”組件的“Use Normal Map”屬性,我們需要勾選這個屬性(默認沒有勾選),勾選這個屬性之後會有新的屬性出現,它們是用來設置2D精靈(Sprite)添加法線貼圖(Normal Map)之後的表面效果。這個時候我們纔可以在Unity官方提供的2D光照下看到2D精靈(Sprite)添加法線貼圖(Normal Map)之後的效果了,那種“圖像表面的凹凸感和光影效果”都呈現出來了

 

 

二、”Mask Texture“的用法


1、爲2D精靈(Sprite)創建專屬的”Mask Texture“:和法線貼圖(Normal Map)一樣,“Mask Texture”也不能在Unity編輯器中創建,必須要藉助第三方的軟件來創建。這樣的軟件有很多,幾乎所有的圖形編輯軟件都可以,比如:PhotoShop、GIMP等等。雖然“Mask Texture”的形狀可以是多種多樣的,不過我們最常用的形狀還是2D精靈(Sprite)本身的形狀,所以創建“Mask Texture”最常見的步驟就是將2D精靈(Sprite)使用的圖片導入到圖形編輯軟件之後,再按照要求,將圖片的RGBA四個通道調節到我們需要的數值,一般來說RGBA四個通道的值不一定都要設置,項目中用到哪個通道就設置哪個通道的值,在項目中同一時刻同一個光源只會使用到其中一個通道的數值,不過不同的光源可以使用不同通道的數值(如果想要了解“Mask Texture”的作用以及作用的原理可以參見我的另一篇原創技術博客)。綜上所述,我們在爲2D精靈(Sprite)創建專屬的”Mask Texture“的時候,核心的操作就是編輯“Mask Texture”圖片的RGBA四個通道的數值,按照項目的要求,使用哪個通道就設置哪個通道的數值。

2、將創建好的”Mask Texture“賦給2D精靈(Sprite):具體方法請參見官方文檔其中有兩點需要特別注意,第一點就是將製作好的”Mask Texture“導入到Unity編輯器中的時候,圖片資源在Inspector面板上的“Texture Type”屬性應該選擇“Sprite (2D and UI)”,而不是“Default”(如果想要知道原因,可以參見我的另一篇原創技術博客),第二點就是在Sprite Editor中爲2D精靈(Sprite)添加”Mask Texture“的時候,“Secondary Texture”的“Name”屬性值不能亂寫,必須用2D光照系統指定的字符串常量,即“_MaskTex”,我們可以通過點擊輸入框後面的下拉列表來選擇這個字符串常量(如果想要知道原因,可以參見我的另一篇原創技術博客)。

3、設置2D精靈(Sprite)的”Mask Texture“,讓它在場景中發揮作用:我們會發現,即使我們通過上面兩個步驟爲2D精靈(Sprite)成功添加”Mask Texture“後也可能不會達到我們預期的效果,原因是我們還需要做一些額外的設置我們需要設置的點有以下幾個:
(1)“2D Renderer”資源文件的Inspector面板上的“Light Blend Styles”欄目下預定義的4個Style屬性(目前預定義的是4個Style,我們不能添加,但是不排除後面的版本會添加更多的預定義Style,或者允許我們自己添加Style),我們並不需要對4個預定義的Style屬性都進行設置,用到哪個Style就設置哪個Style,至於如何指定用到哪個Style,見下面的(2)。關於前面提到的“Light Blend Styles”欄目和它下面Style屬性值的詳細講解,可以參見官方文檔我們如果想要精靈(Sprite)上添加的“Mask Texture”發揮作用,那麼前面提到的Style屬性下的“Mask Texture Channel”這個子屬性的屬性值就不能設置成“None”(默認是None),應該從“Mask Texture”圖片的RGBA四個通道中選擇一個發揮作用的通道(其中的原理可以參見我的另一篇原創技術博客)。

(2)指定我們使用的Style(指定“Mask Texture”圖片RGBA四個通道中的某一個通道發揮作用的屬性“Mask Texture Channel”就是在Style屬性下設置的):指定哪個Style發揮作用的屬性是充當光源的遊戲物體上掛載的“Light 2D”組件中的“Blend Style”屬性,這個屬性可選的值就是(1)中提到的“Light Blend Styles”欄目下Style屬性值的“Name”子屬性設置的值,“Blend Style”屬性值選擇了哪個“Name”值,那麼這個“Name”值對應的Style纔會發揮作用(如果想要了解這個作用的原理,可以參見我的另一篇原創技術博客)。

通過上面幾個步驟的設置,“Mask Texture”這個時候纔算是開始發揮作用了。如果想要詳細瞭解“Mask Texture”的作用,可以參見我的另一篇原創技術博客

 

 

三、如何在代碼中動態獲取或者設置2D精靈(Sprite)的“Mask Texture”和“Normal Map”?


其實爲2D精靈(Sprite)添加“Mask Texture”和“Normal Map”的方法有兩種第一種就是上面介紹的通過“Sprite Editor”窗口中的“Secondary Texture”選項進行添加,這種方法是我們常用的方法,相比於第二種方法這種方法屬於”全局設置“,不過這種方法有一個缺陷,就是我們無法在代碼中動態獲取或者設置2D精靈(Sprite)的“Mask Texture”和“Normal Map”。第二種就是通過新建的Material爲2D精靈(Sprite)添加“Mask Texture”和“Normal Map”,方法就是新建一個Material,這個Material默認使用的是“Sprite-Lit-Default”這個Shader,這個Shader有三個屬性,分別是”Diffuse”、“Mask”和“Normal Map”,其中“Mask”和“Normal Map”屬性就是用來設置2D精靈(Sprite)的“Mask Texture”和“Normal Map”的地方,設置好對應的貼圖後,將這個新建的Material拖到2D精靈(Sprite)這個遊戲物體”Sprite Renderer“組件的”Material“屬性中就可以了,通過這種方法爲2D精靈(Sprite)添加的”Mask Texture“和”Normal Map“就可以在代碼中進行動態獲取或者動態設置,具體代碼如下:

using UnityEngine;

public class MaskTextureAndNormalMap : MonoBehaviour 
{
	private SpriteRenderer sr;

	// Use this for initialization
	private void Start () 
	{
		sr = GetComponent<SpriteRenderer>();
		print(sr.material.GetTexture("_MainTex"));    // 永遠返回null,通過sr.sprite獲取
		print(sr.material.GetTexture("_MaskTex"));    // 只用通過新建一個Material,使用Sprite-Lit-Default這個Shader,然後通過Shader的"Mask"屬性賦值"Mask Texture"才能獲取到,如果通過“Texture Editor”的“Secondary Texture”添加“Mask Texture”,那麼就獲取不到,只會返回Null、
		print(sr.material.GetTexture("_NormalMap"));  // 只用通過新建一個Material,使用Sprite-Lit-Default這個Shader,然後通過Shader的"Normal Map"屬性賦值"Normal Map"才能獲取到,如果通過“Texture Editor”的“Secondary Texture”添加“Normal Map”,那麼就獲取不到,只會返回Null、

		// 動態設置貼圖的方法
		// sr.material.SetTexture("_MaskTex", Texture類型的對象);    // 設置精靈(Sprite)的“Mask Texture”,不過要求和上面獲取方法一樣。
		// sr.material.SetTexture("_NormalMap", Texture類型的對象);  // 設置精靈(Sprite)的“Normal Map”,不過要求和上面獲取方法一樣。

		// 上面字符串常量"_MainTex"、"_MaskTex"和"_NormalMap"是寫死的,因爲這些字符串常量表示Shader中定義的變量的變量名,Sprite-Lit-Default這個Shader中定義的變量名就是這樣的。

		// 綜上所述,如果我們想要通過代碼動態操作精靈(Sprite)的“Mask Texture”和“Normal Map”,那麼就只能通過新建一個Material,使用Sprite-Lit-Default這個Shader,然後再利用這個Shader的“Mask Texture”和“Normal Map”屬性爲精靈(Sprite)賦予對應的貼圖。
		//		  如果我們不需要通過代碼動態操作精靈(Sprite)的“Mask Texture”和“Normal Map”,那麼我們還是建議使用“Sprite Editor”的“Secondary Texture”爲精靈(Sprite)賦予對應的貼圖。
		// 注意:如果使用“Sprite Editor”的“Secondary Texture”爲精靈(Sprite)賦予“Mask Texture”或者“Normal Map”,那麼再通過新建一個Material,使用Sprite-Lit-Default這個Shader對應的“Mask”屬性和“Normal Map”屬性爲精靈(Sprite)賦予對應的貼圖,這個操作不會起作用,因爲前者方法賦予的貼圖的優先級大於後者方法賦予的貼圖的優先級。
	}
}

對於上面的兩種方法,有幾點需要我們注意:
(1)通過第二種方法爲2D精靈(Sprite)添加的”Mask Texture“和”Normal Map“的圖片資源同樣需要設置成”Sprite (2D and UI)“的類型;

(2)通過第二種方法爲2D精靈(Sprite)添加的”Mask Texture“和”Normal Map“在添加到Shader對應的屬性中的時候,對應的貼圖屬性是沒有辦法調節的,即使調節了也沒有效果(這些屬性有”Tiling“和”Offset“);

(3)如果我們通過上面第一種方法爲2D精靈(Sprite)設置了”Mask Texture“或者”Normal Map“,那麼再通過上面第二種方法對同一個2D精靈(Sprite)設置”Mask Texture“或者”Normal Map“就不會起作用了,因爲第一種方法設置的”Mask Texture“和”Normal Map“的優先級更高,2D精靈(Sprite)會選擇優先級更高的貼圖使用。

(3)第一種方法是通過”Sprite Editor“爲2D精靈(Sprite)添加”Mask Texture“或者”Normal Map“,這屬於”全局設置“的方法,以後我們再將2D精靈(Sprite)拖入到場景中,它就擁有”Mask Texture“或者”Normal Map“了,而第二種方法是通過單獨的Material爲2D精靈(Sprite)添加”Mask Texture“或者”Normal Map“,這屬於”個體設置“的方法,以後我們再將2D精靈(Sprite)拖入到場景中,它不會擁有”Mask Texture“或者”Normal Map“,除非我們爲這個2D精靈(Sprite)賦予修改後的Material。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章