ikoan unity 開発メモ

Unityに関するアレコレを日々つづっていこうと思います

ゲームの敵が消滅するようなシェーダーなど

環境

Unity2018.3.0f2

概要

確かテラバトルなどで、敵を倒した際に消えていくエフェクトってありますよね。
サラサラと敵が粉末のようになって消えていくアレです。
アレを以前から実装したいなーと思っており、何か難しく考えすぎててできないなーって思ってたのですが、なんかやってみたら普通にできたので記事を書いてみました

実装方法

まずはシェーダーでサラサラと消えていく部分を実装します。
とりあえず汎用性を考えずに右上から順に右に流れていくものとします。
一応、各ピクセルごとにランダムな値を算出して、その値を流れていく強さに変換することでいい感じにしてますが、ノイズテクスチャ用意してもいいかもしれません。
下記シェーダーはその名残があります。


※編集画面でインデント揃えたら、保存したら逆にずれたよ。。。動作がよくわからない。

uv値から算出しているので、元画像が一枚絵であるならば各敵ごとに動きの変化はないと思いますが、ノイズテクスチャを利用した方が確実かもしれません、と思いましたが、アトラス化されても、消えていく元画像の位置によっては、ノイズテクスチャの参照場所が変わるので、どちらでも変わらないかもしれません。

このシェーダーをマテリアルにセットし、_Paramを変化させて動作させたのが下記動画になります。
f:id:ikoans:20190108202620g:plain

消えるところや消える順序、_Paramへの値のセットなどはいい感じに対応していただければと思います。

さらに改良

さて、一応サラサラと消えるようにはできましたが、これだとテクスチャのサイズで切れてしまいます。
あまり美しくないですね。
そのために、消える対象のテクスチャとメッシュを改良・再生成します。
今回はUnityのPlaneを基準にメッシュを再構築しています。SpriteやQuadを使う場合、このままでは動かないと思いますのでご注意ください。、

広げるサイズは1.5倍としてます。なんとなくです。随時適当に変更していただければと思います。
また、今回は先ほども書いた通りUnityのPlaneを修正しています。
vertexの位置が大きい数字の方がuvの値が小さいという、よくわからない仕様になっているのを初めて知りました。
ここも自身のプロジェクトで使用される場合は気をつけてもらえればと思います。

修正した動作は下のgifのようになります。
f:id:ikoans:20190108204015g:plain

いい感じに四角できれずに消えていますね。
RenderTextureで再描画した画像に謎の黒帯があると思います。
これは元Terxtureがwrapモードでテクスチャの端まで描画情報がある場合に表示されるみたいです。
回避方法は元テクスチャの端を1ドット何も描画しないとかでしょうか。
アンチエイリアスが悪さしているなら、そこらへんの設定を変更すればどうにかなるかもしれません。

補足

シェーダーが書き込んでいるのはバッファだし、バッファの基準?になるであろうメッシュだけ幅を広げればうまくいくかな、と思ったら、そんなことはなく、テクスチャも再構築しないと思った通りの動作にはなりませんでした。
理由はわかりませんが・・・・。
誰かわかる人教えてください。
とはいえ、パーツアニメするような敵の場合は、どちらにしろRenderTexture化してどうにかするのかな、と思うので、それなりに実用性はあるかと思います。

また、敵画像、どこかのサイト様からいただいたものなのですが、どこだか忘れました。。。
本当に申し訳ありません・・・・。