【Unity】シェーダーをスクリプトで制御してみよう!

Unity

今回の記事では、前回作ったDissolveシェーダーをスクリプトで制御できるようにしていきます。

前回の記事↓

スクリプト

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Blog_Dissolve : MonoBehaviour
{
    public MeshRenderer mr;
    public float dissolveRate = 0.0125f; //変化量
    public float refreshRate = 0.025f; //変化速度

    private Material mrMaterial;

    bool isDissolving;
    bool isReviving;

    float counter = 0;

    void Start()
    {
        //マテリアルが適用されていたら変数に格納
        if (mr.material != null) 
        {
            mrMaterial = mr.material;
        }
    }

    
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space) && !isReviving && !isDissolving)
        {
            Debug.Log("dissolving");
            StartCoroutine(DissolveCo());

        }

        if (Input.GetKeyDown(KeyCode.R) && !isDissolving && !isReviving)
        {
            Debug.Log("dissolving");
            StartCoroutine(ReviveCo());

        }
    }

    IEnumerator DissolveCo()
    {
        
        isDissolving = true;

        while (mrMaterial.GetFloat("_DissolveAmount") < 1)
        {
            counter += dissolveRate;
            mrMaterial.SetFloat("_DissolveAmount", counter);

            yield return new WaitForSeconds(refreshRate);
        }

        isDissolving = false;
    }

    IEnumerator ReviveCo()
    {
       
        isReviving = true;

        while (mrMaterial.GetFloat("_DissolveAmount") > 0)
        {
            counter -= dissolveRate;
            mrMaterial.SetFloat("_DissolveAmount", counter);

            yield return new WaitForSeconds(refreshRate);
        }

        isReviving = false;
    }
}

スペースでオブジェクトは消えて、Rで再び現れます。

このスクリプトをオブジェクトにアタッチしましょう。

アタッチしたらスクリプトの中の項目にそれぞれ必要な値やメッシュを入れます。

Mr:「Mesh renderer」を入れましょう。

Dissolve Rate: 変化量

Refresh Rate: コルーチンの1周期時間

スクリプトの説明

このスクリプトの重要なところはココ

 while (mrMaterial.GetFloat("_DissolveAmount") < 1)
        {
            counter += dissolveRate;
            mrMaterial.SetFloat("_DissolveAmount", counter);

            yield return new WaitForSeconds(refreshRate);
        }

このDissolveシェーダーは「0」から「1」までの間の値の変化で溶ける演出を行っています。

「Counter」に「dissolveRate」を足していき、その「Counter」の値をシェーダーグラフで設定した「_DissolveAmount」というリファレンスに代入し、_DissolveAmountを変化させていきます。

このコルーチンを目的の値(0か1)になるまで繰り返していくだけです。

SetFloatの中に書いてあるリファレンス名がシェーダーで設定してあるものと一緒じゃないとダメなので注意をしてください。

mrMaterial.SetFloat(“_DissolveAmount“, counter);

まとめ

このようにシェーダーの値をスクリプトで制御し敵を倒したときや出現させるときにこの演出を行うことができます。

演出が豪華になるだけでもゲームの見栄えはいいのでこれからもいろいろ試していきたいですね。

コメント

タイトルとURLをコピーしました