MMD聯(lián)動Unity學習日志 Vol.10 Visual Effect Graph

前言

? ??之前官方達哥講得Visual Effect Graph有很多東西并沒有吃透,筆記也沒寫全,這期做一回補充。Visual Effect Graph這里簡稱VFX,一般還簡稱VEG,Up這里暫不進行修改。

VFX功能詳細
????Block(塊)

Attribute是改變塊的屬性
Composition 是同類塊的合成方式
Overwrite(覆蓋),后者覆蓋前者的結(jié)果
Add(附加),兩者相加的結(jié)果
Multiply(乘算),兩者相乘的結(jié)果(之前是Scale)
Blend(混合),從前者到后者的結(jié)果
Random是混數(shù)的方法,有Off,Per Component,Uniform三種
Off是關(guān)閉亂數(shù)
Uniform是統(tǒng)一在設(shè)置的范圍內(nèi)
Per Component 是每個組件

????Context間的差異
(Context是一個場景,描述的是一個應用程序環(huán)境的信息,即上下文,代表與操作系統(tǒng)的交互的一種過程。之前Up強行翻譯為文本是不準確的,下面不進行翻譯)
Initialize 是給粒子初始的一個參數(shù)
Update 是每一幀都給粒子進行參數(shù)更新
Quad Output 將塊放在這里的效果和Update基本是一致的,那使用的時機是,Update是要存放許多變量在里面做計算,所以這種情況下將塊放在這里比較適合。另外,如果你有額外的粒子特效要分別輸出不同的Output,這時就可考慮把塊放在不同的Output里面。

????System(模版)
從創(chuàng)建節(jié)點里可以添加System模版


模版是可以將已經(jīng)做好的粒子特效結(jié)構(gòu)保存下來,反復復用的。
Static Mesh Output,這是一個靜態(tài)模版,它有點類似Unity里面的Mesh Renderer,你可以看到它也有網(wǎng)格,紋理變形等參數(shù)。


具體操作
????我們新建一個空的粒子系統(tǒng)。

????Spawn里面加一個ConstantSpawnRate。Output里面的MainTexture換成Default-ParticleSystem,Initialize里面加一個Set Velocity,可以看到有一點出來了,將Y設(shè)為1,可以看到粒子向上噴出。再加一個Set Lifetime的塊,將參數(shù)設(shè)置為2。再加一個Set Size的塊。這里我們點擊整個Initialize的Context(文本),可以在Inspector里面看到整個文本內(nèi)的所有參數(shù)及其參數(shù)類型,所占內(nèi)存的字節(jié)數(shù),如果粒子使用等比例的話,建議使用單個軸(Channels),這樣可以節(jié)省資源,這是非常重要的。如果想要顏色不一樣,再加一個Set Color的塊。
????Update可以做一些中立的處理,一些扭曲動態(tài)之類的動作。比如加一個Gravity的塊,它默認Y的值是-9.81。你會發(fā)現(xiàn)在Initialize里面就沒有Gravity的塊,因為這個只能在Update文本里做到。
????我們將Blackboard(黑板)打開,點擊加號增加一個color的參數(shù),給Exposed打勾,改個容易記住的名字,將它和Set Color的節(jié)點相連。在Inspector里可以看到顏色參數(shù)被暴露出來,可以在外面進行調(diào)整。
????先將Gravity禁用,將Set Velocity Random的Random設(shè)為Per Component,將Min的XYZ值設(shè)為-1,Max的XYZ值設(shè)為1。將Rate設(shè)為100,Capacity設(shè)為3000。
????我們在外面添加一個Get Velocity,將輸出節(jié)點向外拖到Set Color塊上,我的Velocity的值每一個都不一樣,正好可以填充Color的XYZ的值,這看來就像一塊色餅。

????如果你要判斷粒子特效大概多久你要做額外的處理。這時我們先在外面添加一個Get Position的節(jié)點,從輸出向外拖出,然后我們在搜索框里面輸入Distance(Sphere),我們希望使用距離的方式作比對(圓形的方式),所以這個坐標拿來作比對就會知道離原本的中心是多少,我們將Get?Position輸出的節(jié)點切換到Position。我們再添加一個Compare的節(jié)點,做一個比較,到這里就有點像邏輯的運算。將Distance節(jié)點輸出的distance與Compare節(jié)點的Left連接。我們的distance的值就會與未連接的Right進行比較,Condition里面是比較的方式。

Equal(等于)
NotEqual(不等于)
Less(小于)
LessOrEqual(小于等于)
Greater(大于)
GreaterOrEqual(大于等于)
????我們設(shè)置為Greater,將Right設(shè)置為1,意思就是我們的值大于1時,節(jié)點可以產(chǎn)生作用。我們將Compare節(jié)點的輸出res向外拖動,這時能顯示出我們可以使用的節(jié)點,而不用一味的右鍵來創(chuàng)建節(jié)點。我們選擇Operator>Logic>Branch,我們點擊齒輪圖標,選擇Color,再點一次齒輪,切換到參數(shù)設(shè)置。如果我們剛才的值大于1,這里會判斷為True,否則為False。我們將True后面的顏色設(shè)置為紅色,將False后面的顏色設(shè)置為綠色。我們將它的輸出連接到Set Color塊上,它會替換到剛才的顏色效果。
????我們退回到未替換的狀態(tài),在Update里面再加一個新的Set Color塊,接Branch的輸出連接到新的SetColor塊上。如果我們還要保留之前的彩虹的色塊,我們要外面新建一個Get color,連接到Branch的False節(jié)點上。

????我們可以再打開黑板,添加一個Color參數(shù)并將它暴露出去。將Color連接到Branch的True節(jié)點上。再用黑板添加一個Float參數(shù)同樣暴露出去,命名為Power,將它和Compare的Right節(jié)點連接。我們在外面調(diào)整顏色和參數(shù),來觀察效果。
這樣一個很基礎(chǔ)的VEG就完成了,你會發(fā)現(xiàn)到全部是為了計算出最后的值,然后喂給塊里面的某一個參數(shù),這個參數(shù)就是要對粒子產(chǎn)生某種影響,改變粒子的樣子,主體上是從上往下執(zhí)行,但旁邊有很多節(jié)點來影響里面的值。有了這樣的概念可以延伸出很多不一樣的玩法。

????到這里我們所有的東西都是手動制作的,但是Unity額外還支持很多第三方的格式,比如Point Cache(點緩存)。我們還是以這個為例子,先將Set Velocity禁用。添加Set Position from Map的塊,假設(shè)你已經(jīng)有一個外部資源,它是一個很龐大的圖或者資源結(jié)構(gòu),你就可通過這個節(jié)點來把它導入。我們在外面添加Point Cache節(jié)點,它可以讀取Point Cache Asset文件(比如官方的UnityLogo2x文件),我們假設(shè)導入的PC2文件有position位置信息,將它與SetPosition from Map的塊的Attribute Map相連,我們可以看到Unity的Logo。我們把Update的Set Color禁用,Initialize里面Set Size的值設(shè)為0.5,切掉顏色連接的節(jié)點。提升Rate和Capacity的容量值。

我們可以在Output塊上右擊選擇Convert Output,將輸出塊轉(zhuǎn)換成其它輸出類型,比如Point Output可以將輸出變成點。這時如果變?yōu)辄c狀時可能會造成閃爍,你可以再添加一個Subpixel Anti-Aliasing,讓它去柔和邊緣。

Unity官方VFX原教程在下面
