今回はUnity用の無料シェーダーであるlilToonに関するニッチな話題で、タイトルの通り
lilToonでディゾルブ効果を使う方法
を分かりやすくまとめてみるという内容になっております。
私はゲーム開発でlilToonをよく使っており、最近になって敵キャラクターを登場させるときにディゾルブ効果(=キャラクターがジワっと現れたり消えたりするエフェクト)の機能を使ってみようかなと思いました。しかしやり方がかなり分かりづらく、情報もほとんどなかったのでこの機能を使いこなせるようになるまでに結構悪戦苦闘したんですよ。
そこでここでは皆さんが同じような苦労をしなくても済むように、lilToonでディゾルブ効果を使う方法をまとめておきますね。
前提:lilToonを導入しよう
まずはじめにlilToonについて簡単に説明しておくと、lilToonはUnity用の超高性能な無料シェーダーです。アニメ風の表現からリアル寄りの表現まで幅広く対応しており、しかもUnityのバージョンやレンダリングパイプラインにも左右されにくいので色々なプロジェクトで活用することができます。
lilToonの基本的な使い方については以前の記事で詳しくご紹介していますので、まだlilToonを使ったことがないよという方はまずはそちらをご覧いただければと思います。
以下の説明はlilToonを既に導入しており、基本的な使い方が分かっているものとして行いますのでその点にご留意ください。
lilToonでディゾルブ効果を使う方法
ではここからが本題で、lilToonでディゾルブ効果を使う方法について解説していきます。
ディゾルブ効果(Dissolve Effect)とは?
ディゾルブ効果とは下のGIFのように、キャラクターが徐々に溶けて消える(または逆に徐々に現れる)ようなエフェクトのことです。
なかなかかっこいいエフェクトで、ファンタジーからSFまで色々なテーマのゲームで使えるので使いこなせるようになると便利です。
マテリアルの設定方法
lilToonでディゾルブ効果を使うためには、まずlilToonを適用したマテリアルの設定を行う必要があります。まずマテリアルの描画モードを「カットアウト」または「半透明」にしておき、そのうえで「詳細設定」タブ→拡張設定の中にある「Dissolve」を展開すると下記のようなパラメータがあることが分かると思います。
それぞれの意味をザックリ説明すると次のとおりです。
- Dissolve ドロップダウン:
ディゾルブ効果の種類を指定します。ここでは「透明度」を使います。デフォルトだと「None」になっていると思うので変更しましょう。 - 範囲:
ディゾルブ効果をどの程度適用するか。値を大きくするとディゾルブ効果が進行し、一定以上になるとマテリアルが見えなくなります。 - マスク:
ディゾルブ効果に適用するマスクの形状を定義するテクスチャ。一般的にノイズテクスチャを使うといい感じのディゾルブ効果になりますが、そのほかのテクスチャを使ってもいいです。テクスチャのRチャンネルが使用されます。 - ノイズ:
ディゾルブ効果にディテールを追加するためのマスクテクスチャです。↑のマスクテクスチャが登録されていれば、この項目のテクスチャを設定しなくても構いません。右側の数値を大きくするとディゾルブ効果がきめ細かくなります。こちらもテクスチャを登録した場合はRチャンネルが使用されます。 - 色:
ディゾルブ効果の色です。発光色を指定することもでき、その場合はポストプロセスのブルーム(Bloom)と合わせるときれいに光るディゾルブになります。
とりあえずディゾルブの種類を指定する項目を「透明度」に変更し、ついでにマスクと色をお好みで設定しておきましょう。
試しに「範囲」のスライダーを動かしてみて、値に応じてキャラクターが消えたり現れたりすればマテリアルの設定は成功です。
lilToonでディゾルブ効果を使うためのC#スクリプト
次にランタイム(=つまりゲーム上)でディゾルブ効果の進行度合いを操作するにはC#スクリプトを書くかAnimation Clipを作ってアニメーション的に制御する必要があります。ここでは前者のスクリプトを使う方法をご説明します。
C#スクリプトでディゾルブを制御する方法では、マテリアルのプロパティをC#スクリプトから書き換えるやり方を知っていると便利です。この方法については下記の記事で詳しく解説していますので、よくわかんないよという方はそちらも併せてご覧ください。
さてそれを踏まえたサンプルスクリプトは次のとおりです。
using System.Collections;
using UnityEngine;
public class lilToonDissolveController : MonoBehaviour
{
[SerializeField]
MeshRenderer meshRenderer;
[SerializeField]
float duration = 1f;
[SerializeField]
Vector4 defaultValue = new(1, 0, -1, 0.1f);
[SerializeField]
Vector4 targetValue = new(1, 0, 1, 0.1f);
readonly string paramName = "_DissolveParams";
int paramId;
Material material;
void Start()
{
material = meshRenderer.material;
paramId = Shader.PropertyToID(paramName);
SetMaterialValue(defaultValue);
}
public void StartDissolve()
{
StartCoroutine(Dissolve());
}
IEnumerator Dissolve()
{
if(duration <= 0f)
{
SetMaterialValue(targetValue);
yield break;
}
float time = 0;
float progress = defaultValue.z;
float changeAmount = (targetValue.z - defaultValue.z) / duration;
while (time < duration)
{
progress += changeAmount * Time.deltaTime;
SetMaterialValue(new Vector4(1, 0, progress, 0.1f));
time += Time.deltaTime;
yield return null;
}
}
void SetMaterialValue(Vector4 value)
{
material.SetVector(paramId, value);
}
}
このC#スクリプトのポイントは次のとおり。
- lilToonのディゾルブ効果のパラメータ名は「_DissolveParams」
- パラメータの型はVector4
- x:ディゾルブの種類を指定(「透明度」の場合は1)
- z:ディゾルブ効果の範囲(←これが重要)
- w:ディゾルブ効果のぼかし量
lilToonのディゾルブ効果を制御するパラメーターは型がVector4で、そのx,z,wにそれぞれ適切な値を入れないと動作しないのが一番わかりづらいところです。逆に言えばその部分さえ分かればあとは大したことありません。
おわりに
以上、lilToonでディゾルブ効果を使うための方法について解説しました。今回ご説明したディゾルブ効果だけでなくlilToonには色々な機能があって楽しいので、ぜひ皆さんも使いこなせるようになって頂ければと思います。
この記事がUnityでのゲーム開発のお役に立てば幸いです。