這篇部落格講述了我為UE4建構Ghost Mesh Plugin的開發過程。
Ghost Mesh Plugin已經在Github上開源,傳送門。
我已經制作了一個視訊用于講解該插件的使用方法,傳送門。
開發背景及成果
在許多動作(ACT)遊戲或者角色扮演(RPG)遊戲中,為了視覺效果,有時會讓角色生成殘影(Ghost Mesh),例如:
(以上截圖來源自真三國無雙7·猛将傳)
殘影效果有若幹種方法可以實作:
- 一種方法是在後期進行中加入前一段時間的
,主要通過Shader來實作。這種方法的優點在于可以生成很密集的殘影而不用太擔心效能,缺點則在于生成的殘影不夠真實(殘影無法與場景中的光進行互動)。RenderTarget
- 另一種方法則是簡單粗暴的直接在場景中生成一個與目前的Skeletal Mesh同樣姿勢的模型。這種方法的優點在于簡單粗暴并且真實,缺點則在于對效能有要求,無法大量生成。
Ghost Mesh Plugin使用的是上述第二種方法,在使用插件時,開發者需要提供一個目前的
Skeletal Mesh Component
作為參數傳入,然後就會在場景中生成一個同樣姿勢的Ghost Mesh,效果如下:
GhostMeshActor
GhostMeshActor
在建構插件的最初始階段,原本是為了便宜從事,是以一開始打算的實作方法是在Actor裡添加
PoseableMeshComponent
來實作殘影。但是由于UE4中的
UComponent
裡面無法添加
TimeLine
以及
LifeSpan
等屬性,是以最後還是選擇生成一個Actor。
在生成GhostMeshAcor後,需要調用其
MakePoseBySkeletalMesh()
函數(在Blueprint中的FriendlyName為”
Pose Mesh Actor
“),傳入一個
SkeletalMeshComponent
作為參數。在執行這個函數後,生成的
GhostMeshActor
就會擁有和該
SkeletalMeshComponent
一樣的Pose。
OnSpawned
事件
OnSpawned
在開發中遇到的另一個問題是殘影的材質。殘影通常要有自己的材質,并且經常伴随着淡入淡出的表現。
是以考慮到這種的開發情況,以及需要适配所有的
Skeletal Mesh
在
GhostMeshActor
裡面設定了一個
OnSpawn()
函數,類型是
BlueprintImplementableEvent
,可以在BP中進行重寫。
在項目中,可以建構一個繼承自GhostMeshActor的BP,選擇重寫OnSpawn函數,便可以進行Ghost Mesh Actor出生後的邏輯。
下圖是GhostMesh淡出的邏輯:
後續開發展望
目前的插件已經可以實作針對于殘影的大部分功能,但是有不足的地方就在于性能。日後估計有可能添加一個生成一個StaticMesh的功能。
但是如果生成StaticMesh,那麼無法照顧到殘影的布料細節,是以還在糾結。
各位有興趣,可以直接下載下傳該Plugin使用。
<全文完>