UnityのPostProcessingStackのプロファイルとボリュームをスクリプトから操作する

今回はUnityのPostProcessingStackのプロファイルとボリュームをスクリプトから操作をしてみたいと思います。

PostProcessProfileはポストプロセスの設定ファイルでPostProcessVolumeはPostProcessProfileを設定するコンポーネントです。

ポストプロセスに関してとそれぞれの設定の仕方については

UnityのPostProcessing機能のV2について
UnityのPostProcessing機能のV2について見ていきます。

を参照してください。

今回行う事は、

スクリプトでPostProcessVolumeコンポーネントをゲーム中にゲームオブジェクトに取り付けエフェクトを追加する事。

作成済みのPostProcessProfileの設定をゲーム中にスクリプトから変更する事。

の2点です。

スポンサーリンク
スポンサーリンク

他のゲームオブジェクトを配置

ポストプロセスの効果を確認する為にいくつか他のゲームオブジェクトをヒエラルキー上に配置しておきます。

ヒエラルキー上で右クリック→3D Object→Planeを選択し、TransformのScaleのXYZを全て10にします。

スタンダードアセットのThirdPersonControllerプレハブをヒエラルキー上に配置します。

これで地面とその上を動くキャラクターが配置されました。

今回はポストプロセスの効果を確認するだけなので適当にゲームオブジェクトを配置してください。

次にMain Cameraゲームオブジェクトを選択し、インスペクタのAdd ComponentからFollow Targetを追加し、TargetにThirdPersonControllerをドラッグ&ドロップします。

これでキャラクターの動きに合わせてカメラが移動します。

さらにAdd ComponentからRendering→Post-Process Layerを取り付けます。

LayerにはPostProcessレイヤーを設定します(レイヤーが存在しない時は作成してください)。

メインカメラにPostProcessLayerコンポーネントを取り付ける

LayerはPostProcessVolumeコンポーネントに設定したレイヤーと同じレイヤーを指定します。

今回はPostProcessVolumeはスクリプトから作成するのでその設定するゲームオブジェクトに、あとでPostProcessレイヤーを設定します。

スクリプトからPostProcessVolumeを取り付ける

スクリプトからPostProcessVolumeをゲームオブジェクトに取り付けエフェクトを発生させてみます。

ヒエラルキー上で右クリック→Create Emptyを選択し、名前をCreatePostProcessVolumeとします。

CreatePostProcessVolumeゲームオブジェクトのレイヤーをPostProcessに設定します。

次に新しくCreatePostProcessVolumeスクリプトを作成し取り付けます。

スクリプトからPostProcessVolumeを取り付けるゲームオブジェクト

StartメソッドでScriptableObject.CreateInstanceを使ってBloomのインスタンスを作成します。

作成したbloomインスタンスのenableのOverrideでtrueを設定しエフェクトを有効にします。

bloomのintensityのOverrideで20fを設定しBloom効果の強度を設定します。

Bloomの設定が終わったらPostProcessManager.instance.QuickVolumeメソッドを使ってPostProcessVolumeに設定をします。

QuickVolumeの引数は第1引数がPostProcessVolumeのレイヤーで今回はgameObject.layerでCreatePostProcessVolumeゲームオブジェクトに設定されたレイヤーを指定し、第2引数ではPostProcessVolumeの優先度を指定し、第3引数は設定する効果を指定します。

作成したボリュームは使わなくなったら削除する必要があるみたいなので、OnDestroyメソッドの中でRuntimeUtilities.DestroyVolumeメソッドを使って作成したボリュームの削除を行っています。

DestroyVolumeの第1引数はPostProcessVolume、第2引数は指定したボリュームを削除するかどうか、第3引数はボリュームのゲームオブジェクトを削除するかどうかのようです。

PostProcessVolumeが追加されたかどうか確認する

スクリプトが出来たのでUnityを実行してポストプロセスの効果が出るかどうか確認してみましょう。

スクリプトからPostProcessVolumeが取り付けられたか確認

上のようにPostProcessVolumeがスクリプトから追加され効果が出ているのを確認出来ます。

ただしCreatePostProcessVolumeゲームオブジェクトにPostProcessVolumeコンポーネントは追加されていません。

ここら辺はAddComponentでPostProcessVolumeコンポーネントを追加するのではなく、QuickVolumeメソッドを使って追加したからかもしれません。

スクリプトからPostProcessProfileの設定値を変更する

次はあらかじめPostProcessVolumeに設定しているPostProcessProfileの設定値をゲーム中にスクリプトから変更してみます。

先ほど作ったCreatePostProcessVolumeゲームオブジェクトのインスペクタでチェックを外し無効にしておきます。

ヒエラルキー上で右クリック→3D Object→Post-process Volumeを選択します。

これでPostProcessVolumeコンポーネントが設定されたゲームオブジェクトが作成されます。

次にAssetsフォルダ内で右クリック→Create→Post-processing Profileを選択します。

作成されたNew Post-processing Profile.assetファイルを選択し、インスペクタのAdd effect…ボタンを押してVignette、Bloom、Grainの効果を加えます。

スクリプトから操作するPostProcessProfileの設定

BloomはenableのOffボタンを押して無効にしておきます。

あとでスクリプトからこれらの設定値を変更します。

設定が終わったらPost-process VolumeゲームオブジェクトのPostProcessVolumeコンポーネントのProfileに今作成したNew Post-processing Profile.assetファイルをドラッグ&ドロップします。

新しくOverridePostProcessスクリプトを作成しPost-process Volumeゲームオブジェクトに取り付けます。

インスペクタでPostProcessVolumeコンポーネントを設定出来るようにし、同じゲームオブジェクトに取り付けたPostProcessVolumeコンポーネントを設定します。

StartメソッドでpostProcessProfile.GetSetting()でPostProcessVolumeに設定したPostProcessProfileのBloomを取得しています。

この時注意が必要なのがprofileとsharedProfileの違いです。

  • profileで取得した場合はこのボリュームのみ適用されUnityの実行を停止するとプロファイルは元の設定値に戻ります。
  • sharedProfileにすると同じプロファイルを使用している全てのボリュームにも適用され、Unityの実行を停止してもプロファイルに加えた変更値がそのままになります(AssetsフォルダのPostProcessProfileが更新される)。
  • プロファイルの効果を取得するにはGetSettingsメソッドを使います。

    プロファイルに新しいエフェクトを追加するにはAddSettingsメソッドを使います。

    を使用しますがPostProcessProfileをsharedProfileで取得していると何やらエラーが出てきます。(^_^;)

    実行中に変更した設定値を元に戻すためにもpostProcessProfile.profileで取得でいいかも?

    エフェクトが存在するかどうかは、HasSettingsメソッドを使います。

    を使います。

    またエフェクトが存在した場合にそのエフェクトのインスタンスを取得するにはTryGetSettingsメソッドを使います。

    エフェクトを削除する場合はRemoveSettingsを使います。

    OnDestroyメソッドで作成したプロファイルの削除をしています。

    ゲーム中にPostProcessProfileが更新されるか確認

    機能が出来たのでUnityを実行して確認してみます。

    スクリプトで変更した効果が現れました。

    スクリプトからPostProcessProfileの設定値を変更したサンプル

    以下がスクリプトからPostProcessProfileの設置値を変更する前の状態です。

    スクリプトでPostProcessProfileを変更する前

    以下がスクリプトからPostProcessProfileの設定値を変更した後の状態です。

    Vignetteが削除され、BloomとGrainの設定値が変更され、新しくMotion Blurの効果が追加されています。

    スクリプトでPostProcessProfileの設定を変更した後

    参考サイト

    Unityマニュアル―Manipulating the Stack―

    コメント

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