【Unity】足元に波紋を作る

投稿者: | 2021-01-19

歩いた時に足元に波紋が出るようにしてみました。

まずシェーダーグラフでPlaneオブジェクトに広がる輪を表示させます。

Timeノードで、輪を広げる時に使う増え続ける値を得ます。これはシーンが始まってからの値ですが、Planeオブジェクトが生成されたときの時間を引くと、常に0から始まるようにできます。今回は遅延も付けられるようにしました。

この他にSpaceをObjectにしたPositionノードから位置を得て、中心からの距離を計算します。

この距離の値と、Timeノードからの値を調整した値をComparisonノードで比べます。左のComparisonでは距離が時間からの値以上であればTrueを出力します。右のComparisonでは、距離が時間からの値に0.3足した値以下であればTrueを出力します。0.3が線の太さです。

Andノードを使って、この2つの真偽値がともにTrueだったときにTrueを出力するようにします。

この値をさらにBranchノードにつなぎます。Branchノードでは入力がTrueのときとFalseのときで出力を変えられます。Trueのときは0~1の値、Falseのときは0を出力するようにしました。

この値をマスターのAlphaにつなげると、輪の部分以外は透明になります。

BranchのTrueには時間からの値を調整した値を入れます。4倍しているのは不透明度が変化するスピードを変えるためです。これを2から引くことで減り続ける値にしてから0~1に固定します。

不透明度を徐々に変えたいので、マスターの右上の歯車マークを開いて、Surface TypeをTransparentにしています。Preserve Specular Lightingのチェックを外して、透明部分に反射光を表示しないようにしています。Alpha Clippingのチェックを入れて、Thresholdは低い値にしました。

スタート時間や遅延をプロパティにしているので、このシェーダーグラフを設定したマテリアルで値を変えられます。

このマテリアルをPlaneオブジェクトにつけてプレハブ化します。Planeオブジェクトは大きさを調整して、メッシュレンダラーでCast ShadowsをOffにしています。新規スクリプトも付けています。

スクリプトでは、Startメソッドでマテリアルにスタート時間を設定して、2秒後に削除されるようにしています。

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

public class Ripple2 : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        Material mat = GetComponent<MeshRenderer>().material;
        mat.SetFloat("Start", Time.time);
        
        Destroy(gameObject, 2f);
    }

}

また、このPlaneオブジェクトをインスタンス化するためのスクリプトも作って、シーン上の空のゲームオブジェクトに追加しました。スクリプトには上のプレハブをアタッチしています。

スクリプトでは、インスタンスのゲットメソッドと、Planeオブジェクトをインスタンス化して波紋を出すメソッドを定義しました。

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


public class RippleFactory2 : MonoBehaviour
{
    [SerializeField] Ripple2 ripple2;

    static RippleFactory2 instance;
    public static RippleFactory2 GetInstance()
    {
        return instance;
    }

    // Start is called before the first frame update
    void Start()
    {
        instance = this;
    }

    public void Step(Vector3 pos)
    {
        Instantiate(ripple2, pos, Quaternion.identity);
    }
}

そして、プレイヤーのスクリプトの、歩きや着地で足音がなるときなどに、このメソッドを呼んでいます。

// FirstPersonController

// ...

    // 足音を出すとき等
    Step();
}

void Step()
{
    Vector3 pos = transform.position;
    pos.y -= 0.6f;
    RippleFactory2.GetInstance().Step(pos);
}

これで、足音に合わせて波紋が出るようになりました。

コメントを残す

メールアドレスが公開されることはありません。