為Unity3D構(gòu)建程序化的Sprite材質(zhì)系統(tǒng) - Part 1

獨立游戲《FISH 魚》開發(fā)日志系列 - 為Unity3D構(gòu)建程序化的Sprite材質(zhì)系統(tǒng) - Part 1

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

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

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

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

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

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

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

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

FISH Sprite Inspector

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

GIF圖show下:

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

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

FISH Sprite - Pattern Blend Mode

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

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

FISH Sprite - Pattern Blend Opacity

3. Pattern Blend TRS (紋理材質(zhì)的平移旋轉(zhuǎn)和縮放)

TRS Slider
Scene handle

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

Tint Color Blend Mode

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

Tint Color Blend Texture TRS

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

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

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

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

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

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

如果您覺得這篇文章內(nèi)容不錯,請關(guān)注我們的微博

獨立游戲 《FISH 魚》 的微博

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

推薦閱讀更多精彩內(nèi)容