【Unity】Unityで発光の制御(PostProcess・bloomをスクリプトで制御)

EDMのライブのような演出がしたいなぁと思って今いろいろと作成しています。

ライブといったら曲に合わせた光の演出は欠かせないですよね。

今回は曲に合わせたという部分は一旦置いといて(次回書いていこうと思います)光の演出について書こうと思います。

 

光の演出といってもいろいろあるのですが、私が実現したかったのは音の大きさによってオブジェクトの発光の強さを動的に制御していきたいというものです。

イメージで言うとネオン看板の光の強さをゲームプレイ中に変えていくみたいなものです。

今回もさまざまな方が詳しい記事を書かれているのでわかりやすかった記事をかいつまんでいきます。

 

(下準備)

 

まず今回やることをわかりやすくするために環境をつくって置いたほうがいいと思います。

メインカメラのBackgroundを黒に変更

DirectionalLightを非アクティブに変更

しておくと良いと思います。

他作業中だったのでいろいろあるアセットとかオブジェクトは無視してください

f:id:graphicalpoxy:20190429133140p:plain

 

オブジェクトを光らせる

 

オブジェクトを光らせるといったらこれを読めばだいたいわかる!

特に光のにじみとHDRの部分以下は読んでおくと良いです。

tsubakit1.hateblo.jp

 

余計なことは呪文だと思って簡単にどうすれば光らせることができるかというと

  • オブジェクト付けるのマテリアルにEmissionをチェック

f:id:graphicalpoxy:20190429134529p:plain

 

とりあえずこれで発光はするのですが・・・思ってたのと違いますよね

 

そこでカメラの効果であるBloom効果というのをつけて(後述します)

Intensityという値をいじるといい感じでもやができて発光感が一気に増します。

Bloom効果のありなしの比較画像を作ったので載せておきます。

とりあえずここでは光らせたいオブジェクトのマテリアルにEmissionのチェックをして置いてください。

f:id:graphicalpoxy:20190429135013p:plain

 

 

Bloom効果をPostProcessingでつける

おそらくBloom効果をカメラに付ける場合はほとんどの場合StandardAssetのEffectから行っていることが多いと思います。

しかしここではちょっと新しいものを使ってみたいと思います。

PostProcessingです。これを選んだ心としましては、新しくて他にもいろいろと効果をつけることができるのでこっちのほうがこれから役に立つかなと思いましたのでこれを使ってみました。

 

PostProcessingを使うには新たにインストールしないといけません。

はい、ここに記載されていることをすべてやってください笑

qiita.com

私もいろいろ調べて実装させていっているのですがこの記事が一番だと思います。

 

おそらくインストールして

  • カメラにPostProcessLayer
  • 空のオブジェクトにPostProcessVolume

がアタッチされた状態になったと思います。

次に

PostProcessVolumeのAdd effectからBloomを選択

Intensityにチェック、数値をいじる

 

f:id:graphicalpoxy:20190429140558p:plain

すると発光の強さを変更できることを確認できたと思います。

つまりこのIntensityの値をスクリプトから動かすことが出来ればゲーム内で動的に発光の強さを変更できるということです。

 

 

 

スクリプトでPostProcess・BloomのIntensityを変更する

 

正直ここからが本題です。

なぜかというとGetComponent<PostProcessVolume>でいじれないからです。

これが出来ればどんなに時間をつぶさずに済んだか・・・

ただすごく簡単だったのでみなさんは私の3時間ぐらいを3分で越えていってください。

今回もスクリプトを例として載せるのですがとにもかくにもおまじないが多いので気をつけてください。

今回は左クリックで明るく、右クリックで暗くするスクリプトです。

こちらをPostProcessVolumeのついたオブジェクトに付けてください。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
//ここ必須
using UnityEngine.Rendering.PostProcessing;

public class EmissionTest : MonoBehaviour
{
    Bloom bloom;

    // Start is called before the first frame update
    void Start()
    {
        //おまじない1:Bloomのところを変えると他の効果でも応用化
        bloom = ScriptableObject.CreateInstance<Bloom>();
    }

    // Update is called once per frame
    void Update()
    {

        //左クリック
       if (Input.GetMouseButton(0))
        {
            set();
        }
       //右クリック
        if (Input.GetMouseButton(1))
        {
            setback();
        }
    }
    //発光(強)関数
    private void set()
    {
        //おまじない2:書き換えOKにしている?これがないと何度も変更できない
        bloom.enabled.Override(true);
        //変更したい項目に任意の数値を渡す
        bloom.intensity.Override(10f);
        //おまじない3:QuickVolume(PostProcessのレイヤー番号,Priority,効果)
        PostProcessManager.instance.QuickVolume(gameObject.layer, 1, bloom);
    }
    //発光(弱)関数(略)
    private void setback()
    {
        bloom.enabled.Override(true);
        bloom.intensity.Override(1f);
        PostProcessManager.instance.QuickVolume(gameObject.layer, 1, bloom);
    }
}

 

まず要点だけ説明すると

  • using UnityEngine.Rendering.PostProcessingは必須

そういうものだと覚えてください、おまじないとは別ですね。

  • おまじない1

bloom = ScriptableObject.CreateInstance<Bloom>();

GetCompornentとしたいところですが、上記のようにするらしいです。

  • おまじない2

bloom.enabled.Override(true);

これを入れないと何度も変更することが出来ませんでした。

個人的には書き換えOKにしているのかなと思っています。

書き換えるごとに書き換えNGになるからこの文言をいれないといけないのかなと

  • おまじない3

一番よくわからない、ないと動かなかった

QuickVolume(PostProcessのレイヤー番号,Priority,効果)

Priorityは1にしとけばうごく

 

  • (書き換えは関数にする?)

ここは私だけの問題だと思うのですが、Update内で今回の関数部分を書いておりまして、動的に動く変数をOverrideに入れたのですが全然動いてくれいなかったという問題がありました。

そこで今回のように関数にさせてUpdateでその関数を実行させるとなんかうまくいきました。

 

次回は音楽データについて記事にしたいと思います。そして今回の発光と音楽データを紐付けてライブっぽい演出を実現させたいと思います。