為Unity3D構建程序化的Sprite材質系統 - Part 1

獨立游戲《FISH 魚》開發日志系列 - 為Unity3D構建程序化的Sprite材質系統 - Part 1

在過去的一周里,5.23-5.31,我所做的主要工作是,為FISH里的Sprite定制特殊的程序化的效果。FISH場景當中,石頭是很重要的一部分,如何利用有限的資源,盡量少的存儲空間,去實現最豐富的效果,是我們需要達到的目標。

(上圖為13年版本的FISH第一個場景)

FISH場景里的石頭基本上采取的設計思路是:形式盡量相同,或者自相似,類似分形的邏輯;色彩上可以有多重變化,這樣即便形狀相似,也不會覺得太單調。在13年的FISH的版本中,所有的石頭,都是直接在PS里繪制完成,石頭的繪制,用了很多PS里的圖層組混合模式(Blending Option)來完成,本身就是一種程序化的繪制方式。參見火星網的專訪

(上圖為PS里石頭的涂層疊加屬性繪制方法)

因此我們在想,既然石頭本身就是程序化的方式繪制出來的,為何不把這套流程搬進Unity里,這樣就能夠減少2d材質的用量,做到精簡游戲呢,相當于直接在Unity里畫出來這些石頭。當然,隨便一想就知道,要把PS里的豐富的涂層混合選項(Blending Option)搬進Unity很定很費事兒,并且,偏離了我們做游戲的初衷,因此

先分析一下目前石頭是怎么畫的,然后看哪些特征是可以畫在PS里的,哪些特征是需要大量改變的,區分出這些,比較有利于我們在unity里用最少的力氣實現相應的功能。因此簡化一下PS里的工作流,大致可以得到下面這個表。

所以基本上,我們能夠方便的調整的就是,1. 石頭的基本色,2. 石頭的疊加的紋理材質,3.石頭的混合顏色(Tint Color),4.以及Tint Color是如何和原本的石頭進行過渡的。

因此在明確了這些需求之后,我們就就設計了Sprite的工具。基本的Inspector是長這個樣子的。

FISH Sprite Inspector

基本上就是2部分組成:Pattern Blend (紋理材質疊加)和Tint Blend (混合顏色疊加)。

GIF圖show下:

1. Pattern Blend Mode(紋理材質混合模式)

這個功能可以讓我們方便的切換紋理材質和基本的sprite 是如何混合的,和PS里圖層混合模式是一個原理。

FISH Sprite - Pattern Blend Mode

2. Pattern Blend Opacity (紋理材質疊加透明度)

這個功能可以方便的控制紋理材質的透明度,石頭的紋理一般都是非常細膩的,往往透明度無法設的太高,需要調整到合適的值才能獲得整體上比較好的效果。

FISH Sprite - Pattern Blend Opacity

3. Pattern Blend TRS (紋理材質的平移旋轉和縮放)

TRS Slider
Scene handle

4.Tint Color Blend Mode (混合顏色的混合模式)

Tint Color Blend Mode

5. Tint Color Blend Texture TRS (混合顏色的混合材質,以及其平移旋轉縮放)

Tint Color Blend Texture TRS

基本上就是這些功能,沒有用到太高級的東西。大概講一下實現:

1. Shader部分主要是使用了一些多重編譯關鍵字,來支持Sprite對應的Shader功能,Pattern Blend 開關,Tint Blend開關,以及二者對應的混合模式都是由不同的shader_feature 關鍵字定義的,可以方便的在對應的mono腳本中使用Material.EnableKeyword(string k)來實現相應功能的開關。另外需要注意的是,關鍵字是有數量限制的,每一組關鍵字組合都會被編譯成一個獨立的shader,如果用了太多的關鍵字,就會導致shader加載時間過長。這這個工具里,我使用了一個Shader文件,但是因為里面用了4組關鍵字,一共有2*4*2*4=64種組合,因此實際上這個shader最后需要被編譯成64個不同的版本, 也因此,不同的功能組合實際上使用的是不同的material,因此無法batching在一起。而因為此,使用同一材質的Sprite,他們無法設置獨立的?[是否使用Pattern]?[Pattern Blend Mode] [是否使用Tint] [Tint Blend Mode] 這些選項。這點需要注意。

2. shader中的其他的參數的修改,例如TRS,透明度等是通過MaterialPropertyBlock來實現的。Sprite往往需要共享材質,在確定了上面所說的關鍵字組合后,往往同一類石頭會使用同一個材質,而每個石頭具體的材質參數是獨立的。MaterialPropertyBlock可以通過SpriteRender的Renderer.GetPropertyBlock來獲取。通過設置每個Renderer的MaterialPropertyBlock,能夠方便的為使用同一個材質的sprite指定不同屬性,同時獲得較高的性能。

3. 由于MaterialPropertyBlock本身[不支持]?序列化,因此Mono腳本中需要把材質參數進行序列化,然后在腳本的Start()中,進行設置。

目前的問題是,由于使用了大量復雜的像素shader操作,因此可以想象在平板上的性能不會太好。由于這個是一個面向設計師的工具,sprite的特效在runtime基本不需要改變,因此未來可以考慮,將生成的特效渲染一次到材質上,然后再使用。動態的加載和釋放這些rendertexture應該會更高效。當然這個功能略有些復雜,目前還是先暫時不考慮。

基本上暫時想到這么多,之后的DevLog 里,我會講講如何讓這個系統變得更加易用,如何克服上面提到的無法獨立設置shader feature 的問題,另外還會展示,如何用這個工具,結合關卡設計的考慮來進行創作。

如果您覺得這篇文章內容不錯,請關注我們的微博

獨立游戲 《FISH 魚》 的微博

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,619評論 6 539
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,155評論 3 425
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,635評論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,539評論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,255評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,646評論 1 326
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,655評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,838評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,399評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,146評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,338評論 1 372
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,893評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,565評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,983評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,257評論 1 292
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,059評論 3 397
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,296評論 2 376

推薦閱讀更多精彩內容