【Unity】Shader Graphで「キャラクターが徐々に消えるエフェクト」を作る方法

徐々に消えるエフェクトの作り方 Unity

Untiyでゲームを作っていると、敵キャラクターを倒した時などに

キャラクターが徐々に消えるようにしたい

と思うことがあります。やっぱり倒した敵が一瞬でパッと消えるとダサいですよね…。しかしこれはシェーダーが絡む問題であり、標準のシェーダーでは実現できないので初心者の方にとっては実装のハードルが高いのではないでしょうか。

そこでここでは、このようなエフェクトをShader GraphとC#スクリプトを使ってなるべく簡単に実装する方法をご紹介しますね。


※なおそもそも「Shader Graphって何?」という方もいらっしゃると思います。Shader Graphについて詳しく知りたい方はまずは下記の記事をご覧ください。

【Unity】Shader Graphが楽しすぎる!基本的な使い方を紹介
今回はUnityのShader Graphの使い方を解説する記事です。 私はしばらく前までシェーダーについて 作り方がよく分からん 自作できれば表現の幅が広がりそうだけどなんか大変そうだ などと思っていました。 ...

キャラクターが徐々に消えるエフェクトのサンプル

まず、はじめに今回作るエフェクトのサンプルを掲載しておこうと思います。次のGIFをご覧ください。

敵が徐々に消えるエフェクトの例

(画像クリックでGIF再生)

サンプルでは敵を倒したタイミングでエフェクトが実行されるようにしてあります。エフェクトの種類は色々考えられますが、ここでは簡単に実装できる「ディゾルブ効果」(=徐々に溶けるようにして消えるエフェクト)を採用することにしますね。

Shader GraphとC#スクリプトを使った実装例

ではここからが本題で先ほどのようなエフェクトを実装するための手順をご紹介していきます。主な手順は次の3ステップです。

  1. Shader Graphでディゾルブ用のシェーダーを作る
  2. マテリアルにシェーダーを適用して設定する
  3. マテリアルのパラメータを変更する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アセット】DOTweenの使い方完全ガイド!超人気アセットを使いこなそう
今回はUnityユーザーの皆さんならおそらくご存じの神アセット「DOTween」の使い方を丁寧にご紹介するという内容です。 DOTweenは非常に人気が高いアセットなので既に持っていらっしゃる方も多いかと思いますが、正直なところ「使い...

おわりに

以上、キャラクターが徐々に消える(もしくは出現する)エフェクトを実装する方法をご紹介しました。

こういう部分は細かいところではありますが、ゲームのクオリティをアップさせるためには地味に重要になってくると思います。ぜひ上記のやり方を参考にしていただき、ゲームのクオリティアップにつなげて頂ければと思います。

この記事がUnityでのゲーム開発のお役に立てば幸いです。