Untiyでゲームを作っていると、敵キャラクターを倒した時などに
と思うことがあります。やっぱり倒した敵が一瞬でパッと消えるとダサいですよね…。しかしこれはシェーダーが絡む問題であり、標準のシェーダーでは実現できないので初心者の方にとっては実装のハードルが高いのではないでしょうか。
そこでここでは、このようなエフェクトをShader GraphとC#スクリプトを使ってなるべく簡単に実装する方法をご紹介しますね。
※なおそもそも「Shader Graphって何?」という方もいらっしゃると思います。Shader Graphについて詳しく知りたい方はまずは下記の記事をご覧ください。
キャラクターが徐々に消えるエフェクトのサンプル
まず、はじめに今回作るエフェクトのサンプルを掲載しておこうと思います。次のGIFをご覧ください。
サンプルでは敵を倒したタイミングでエフェクトが実行されるようにしてあります。エフェクトの種類は色々考えられますが、ここでは簡単に実装できる「ディゾルブ効果」(=徐々に溶けるようにして消えるエフェクト)を採用することにしますね。
Shader GraphとC#スクリプトを使った実装例
ではここからが本題で先ほどのようなエフェクトを実装するための手順をご紹介していきます。主な手順は次の3ステップです。
- Shader Graphでディゾルブ用のシェーダーを作る
- マテリアルにシェーダーを適用して設定する
- マテリアルのパラメータを変更するC#スクリプトを書く
それぞれ詳しく見ていきましょう。
手順1:Shader Graphでディゾルブ用のシェーダーを作る
まずはShader Graphを使ってディゾルブシェーダーを作ります(ここではURPのLitシェーダーを使用します)。Shader Graphの操作方法はここでは省略しますが、次のような簡単なノードで実現できるので参考になさってください。
ポイントはシェーダー設定の「Alpha Clipping」をONにしておくことです。こうすることで透明シェーダーにしなくても疑似的に透明状態を作り出すことができます。
ちなみにこのシェーダーで使っているパラメータは次のとおり。
- Main Texture:テクスチャ画像
- Noise Scale:ディゾルブ効果に使うノイズのスケール
- Progress:ディゾルブ効果の進行度(0~1。ここでは0で透明、1で不透明になるものとする)
特に「Progress」パラメータはこのあとC#スクリプトで制御するので重要です。このパラメータの参照名は「_Progress」としておきましょう。
手順2:マテリアルにシェーダーを適用して設定する
次に新しく作ったマテリアルに先ほどのディゾルブシェーダーを適用して設定を行います。
上の画像を参考に適当に設定してください。
手順3:マテリアルのパラメータを変更するC#スクリプトを書く
最後に、マテリアルのパラメータを変更するC#スクリプトを書いてキャラクターが徐々に出現もしくは消滅するようにします。
using System.Collections.Generic; using UnityEngine; using DG.Tweening; public sealed class DissolveEffect : MonoBehaviour { [SerializeField] Renderer[] renderers = { }; [SerializeField, Min(0)] float effectDuration = 1f; [SerializeField] Ease effectEase = Ease.Linear; [SerializeField] string progressParamName = "_Progress"; List<Material> materials = new List<Material>(); Sequence sequence; void Start() { GetMaterials(); } public void DissolveIn() { sequence = DOTween.Sequence().SetLink(gameObject).SetEase(effectEase); foreach (Material m in materials) { m.SetFloat(progressParamName, 0); sequence.Join(m.DOFloat(1, progressParamName, effectDuration)); } sequence.Play(); } public void DissolveOut() { sequence = DOTween.Sequence().SetLink(gameObject).SetEase(effectEase); foreach (Material m in materials) { m.SetFloat(progressParamName, 1); sequence.Join(m.DOFloat(0, progressParamName, effectDuration)); } sequence.Play(); } void GetMaterials() { foreach (Renderer r in renderers) { foreach (Material m in r.materials) { materials.Add(m); } } } }
キャラクターを徐々に出現させたい場合はDissolveIn関数、逆に徐々に消滅させたい場合はDissolveOut関数を外部から呼び出してください。
ちなみにここではパラメータを徐々に変更するためにDOTweenというアセットを使っています。DOTweenの使い方については以下の記事で詳しく解説していますので、併せてご覧いただければと思います。
おわりに
以上、キャラクターが徐々に消える(もしくは出現する)エフェクトを実装する方法をご紹介しました。
こういう部分は細かいところではありますが、ゲームのクオリティをアップさせるためには地味に重要になってくると思います。ぜひ上記のやり方を参考にしていただき、ゲームのクオリティアップにつなげて頂ければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。