Post Processing Stack V2の効果をスクリプトから動的に変更する - いんでぃーづ の記事内で言及されているManipulating the Stack · Unity-Technologies/PostProcessing Wiki · GitHub では、エフェクト設定のenabled をtrue
にしています。これにならって...
C#
1 // Update is called once per frame
2 void Update ( ) {
3 distance = Vector3 . Distance ( this . transform . position , player . transform . position ) ;
4
5 //ppsの変更部分です
6 var grain = ScriptableObject . CreateInstance < Grain > ( ) ;
7 grain . enabled . Override ( true ) ;
8 grain . intensity . Override ( 1 ) ;
9 PostProcessManager . instance . QuickVolume ( pps . layer , 1 , grain ) ;
10 }
としてみてはいかがでしょうか。
なおPostProcessEffectSettingsの変更履歴 を見てみますと、設定を新規作成した時のenabled
について、従来は「value
をfalse
、overrideState
はデフォルトのまま(つまりfalse
)」だったのを「value
をfalse
、overrideState
をtrue
」に変更したようです。
いんでぃーづさんの記事だとenabled
には手を付けていないようですが、おそらくいんでぃーづさんが実験された当時はこの変更が加わっていなかったんじゃないかと思います。ですのでenabled
はオーバーライドされず、元々のプロファイルの設定が引き継がれてオンのままとなり、エフェクトがちゃんと表示されたのだと説明できそうです。
一方、現行バージョンでは最初からoverrideState
がtrue
になっており、かつvalue
がfalse
に設定されていますので、デフォルトではenabled
がオフの状態でオーバーライドされてしまうようです。ですので明示的にenabled
をオンにするか、あるいはオーバーライドをオフにするかしないとエフェクトが消えてしまうみたいですね。
余談ですが、Grain
やPostProcessVolume
を毎フレーム新規生成する必要はないように思います。ですので...
C#
1 using System ;
2 using System . Collections ;
3 using System . Collections . Generic ;
4 using UnityEngine ;
5 using UnityEngine . Rendering . PostProcessing ;
6
7 public class Enemypps : MonoBehaviour {
8
9 [ SerializeField ]
10 private GameObject pps ;
11 [ SerializeField ]
12 private GameObject player ;
13 [ SerializeField ]
14 private float distance ;
15
16 private Grain grain ;
17 private PostProcessVolume postProcessVolume ;
18
19 // Use this for initialization
20 void Start ( ) {
21
22 pps = GameObject . Find ( "pps" ) ;
23 player = GameObject . Find ( "FirstPersonCharacter" ) ;
24
25 foreach ( Transform childTransform in pps . transform )
26 {
27 if ( childTransform . gameObject . layer == LayerMask . NameToLayer ( "PPS" ) )
28 {
29 if ( childTransform . gameObject . activeSelf )
30 {
31 pps = childTransform . gameObject ;
32 }
33 }
34 }
35
36 // StartのタイミングでGrainとPostProcessVolumeを作っておく
37 grain = ScriptableObject . CreateInstance < Grain > ( ) ;
38 grain . enabled . Override ( true ) ;
39 grain . intensity . Override ( 1 ) ;
40 postProcessVolume = PostProcessManager . instance . QuickVolume ( pps . layer , 1 , grain ) ;
41 }
42
43 // Manipulating the Stackのサンプルコードにならって
44 // 不要になったPostProcessVolumeを削除するようにしました
45 // マニュアルにもわざわざ大きい文字で
46 //
47 // Important: Don't forget to destroy the volume and the attached profile
48 // when you don't need them anymore!
49 //
50 // なんて書いてありますので、削除はきっちりやっておいた方がよさそうですね
51 private void OnDestroy ( )
52 {
53 RuntimeUtilities . DestroyVolume ( this . postProcessVolume , true , true ) ;
54 }
55
56 // Update is called once per frame
57 void Update ( ) {
58 distance = Vector3 . Distance ( this . transform . position , player . transform . position ) ;
59
60 // distanceが大きいほどGrainの強度が高くなるようにしてみました
61 // 距離1mで強度1だときつすぎるように感じたので、0.2倍して穏やかにしています
62 grain . intensity . value = this . distance * 0.2f ;
63 }
64 }
とでもした方が効率的な気がします。
また「インスペクターの値も特に書き換わった様子はありません」とおっしゃっていますが、QuickVolume
はボリュームを新規作成する機能のようで、既存のボリュームには手を付けないものと思われます。ですので、もともと設置しておいたボリュームの設定値が変化していないのは正常な挙動でしょうね。
既存の設定値を書き換える場合、マニュアルのProfile Editing の節で解説されている手順に従うのがよさそうです。
C#
1 using System ;
2 using System . Collections ;
3 using System . Collections . Generic ;
4 using UnityEngine ;
5 using UnityEngine . Rendering . PostProcessing ;
6
7 public class Enemypps : MonoBehaviour {
8
9 [ SerializeField ]
10 private GameObject pps ;
11 [ SerializeField ]
12 private GameObject player ;
13 [ SerializeField ]
14 private float distance ;
15
16 private Grain grain ;
17 private PostProcessProfile postProcessProfile ;
18
19 // Use this for initialization
20 void Start ( ) {
21
22 pps = GameObject . Find ( "pps" ) ;
23 player = GameObject . Find ( "FirstPersonCharacter" ) ;
24
25 foreach ( Transform childTransform in pps . transform )
26 {
27 if ( childTransform . gameObject . layer == LayerMask . NameToLayer ( "PPS" ) )
28 {
29 if ( childTransform . gameObject . activeSelf )
30 {
31 pps = childTransform . gameObject ;
32 }
33 }
34 }
35
36 // ppsから既存のPostProcessVolumeを取得し...
37 var postProcessVolume = pps . GetComponent < PostProcessVolume > ( ) ;
38
39 // そこからプロファイルを取得する
40 // ここで「sharedProfile」を使うとボリュームが参照しているプロファイル自体が取得されるのに対し、
41 // 「profile」を使うと必要に応じてプロファイルが複製されるので、もし他のボリュームが同じプロファイルを
42 // 共有していたとしても、影響が波及しなくなるようです
43 // また「sharedProfile」に対して変更を加えると、その内容がプロファイルアセットに保存されるため
44 // プレイモードを終了しても変更した設定は元に戻らないそうです
45 // ここは「profile」の方を使うのが妥当かな...と思いますが、マニュアルのOwned profile editingの手順には
46 //
47 // It is your responsibility to destroy the profile when you don't need it anymore
48 //
49 // とありますので、注意書き通りこの複製プロファイルが不要になったら削除してやるべきでしょう
50 postProcessProfile = postProcessVolume . profile ;
51
52 // プロファイルからGrain設定を取得する
53 // すでにインスペクター上でGrainは追加済みだと思いますが、もしなければ追加するようにしました
54 if ( ! postProcessProfile . TryGetSettings ( out grain ) )
55 {
56 grain = postProcessProfile . AddSettings < Grain > ( ) ;
57 }
58 grain . enabled . Override ( true ) ;
59 grain . intensity . overrideState = true ;
60 }
61
62 private void OnDestroy ( )
63 {
64 // 複製されたプロファイルはOnDestroy時に削除する
65 // DestroyProfileの第2引数をtrueにすると、プロファイル中の設定オブジェクトも全部処分してくれるようです
66 // それら設定オブジェクトも、プロファイルが複製された時に新しく作られた複製品ですので
67 // 削除してしまうべきでしょう
68 RuntimeUtilities . DestroyProfile ( postProcessProfile , true ) ;
69 }
70
71 // Update is called once per frame
72 void Update ( )
73 {
74 distance = Vector3 . Distance ( transform . position , player . transform . position ) ;
75 grain . intensity . value = distance * 0.2f ;
76 }
77 }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/14 04:34
2020/10/14 08:36