Unity エディタではゲームを編集する Edit Mode とテストプレイをする Play Mode が実行できます。
自作コンポーネントのメンバ変数の値は Inspector ウィンドウに表示されるフィールドでそれぞれ編集できたり、ゲーム実行時にスクリプトから変更することが想定できます。
Edit Mode でも Play Mode でもメンバ変数の値が変更されたことを検知する方法として、プロパティと OnValidate を組み合わせる検証を行ったので、今回はそういう風に検知できるよというひとつのパターンを紹介します。
ランタイム時に変更を受け取る方法
プロパティの setter で処理します。
Edit Mode では private であっても SerializeField ならばメンバ変数を直接変更するため、setter は呼ばれませんが、前述の OnValidate が呼ばれるので、そこでイベント処理を行います。
OnValidate は Inspector からの編集時
プロパティの setter で全て処理したいと思ってしまったため視野が狭くなっていたので、その備忘録のようなものなのですが、 Inspector ウィンドウのフィールドからの編集は SerializeProperty を用いるため getter, setter のプロパティではなく実体を持つ変数が直接変更されます。
そのため、プロパティの setter は呼び出されません。ここで、メンバ変数ではなくそのプロパティを SerializeProperty に渡せないかと迷走してしまいました。
2つの機能を組み合わせたほうがシンプルなときもある
考えてみたら、外部スクリプトから変更される際はプロパティ経由なので setter を用い、 Inspector ウィンドウ経由ならば OnValidate を用い、どちらからも同じ関数を呼び出せば、問題ないであろうことに気づきました。
これは、当たり前と思う人には、当たり前のことです。
だけど、視野が狭くなり、全てプロパティの setter 経由で値を変更させる方法を調べないとと思い込んでしまうと意外と抜け出しづらいかもしれません。
今回は運よく、プロパティと OnValidate どちらもトリガーとすれば良いことに気づけましたが、迷走しているときは意外に気づかないかもしれません。
コメント
コメントを投稿