Unity Universal RPで作る、モデルの残像エフェクト
残像の作り方は2種類ある
- モデルを引き延ばして作る
https://qiita.com/flankids/items/49c0c0b28b514a7ad913 - モデルを複製する
https://qiita.com/madoramu_f/items/fada99645cd03fd7f515
今回は、モデルを複製する方法で作る
Unity 2020.3.20f1 でサンプルプロジェクト (https://github.com/madoramu/AfterImage) を起動してみると
Packages/UnityChanToonShaderVer2_Project-release-urp-2.2/Runtime/Shaders/UniversalToonBody.hlsl でエラーが発生したので、
inline void InitializeStandardLitSurfaceDataUTS(float2 uv, out SurfaceData outSurfaceData)
{
outSurfaceData = (SurfaceData)0;
//...
を追加して対処
- やっていることは、
Meshの複製、ボーンの複製 - 今回は分身をモーションさせない
- 分身したモデルに別のマテリアルをくっつけている
残像は英語で「Afterimage」
If your model is not a whole bunch of separate models and not too detailed you can use SkinnedMeshRenderer.BakeMesh to bake a static mesh of your animated model at its current frame.
https://www.reddit.com/r/Unity3D/comments/52uzaw/afterimage_effect_with_3d_models/
SkinnedMeshRenderer.BakeMesh
を使えば、ボーンコピーしなくても済むかも?
BakeMeshやってる人がいた…!
BakeMeshはベイクするメッシュの頂点数等によって処理負荷が変わる可能性があるため使用する際はしっかりと処理負荷を調べたうえで使うことを推奨します。
https://studyworks.hatenablog.com/entry/bakemesh
でしょうね…
やってることはMeshの複製なので、Mesh大量に作る vs ボーンで計算を頑張ってもらう になるのか
ざっくりと、Bakeでつくってみる
左は ModelImport時に、MeshRendererがついているオブジェクト以外を削除するようにOptimizeしたもの
右はそのままのやつ
Boneコピーしたほうがいいのかなぁ
コンピュートシェーダーを使える環境ならGPU Skinningの結果をぶっこ抜いて来て複製出来るけど、スマホの場合はキツイのでボーンコピーで良いと思われ
ボーンバージョン作ってみた
Optimizeされたものはどうしようかな 🤔
あとマテリアルを変えられたりする入り口をつくらないと…
Optimizeされたものは、あきらめてOptimizeを解体することに
if ((m_Animator != null) && m_Animator.isOptimizable)
{
AnimatorUtility.DeoptimizeTransformHierarchy(m_RootGameObject);
m_Transforms = m_RootGameObject.GetComponentsInChildren<Transform>();
}
シェーダーを当ててこんな感じ