インスペクタで値を変更した際、実行時だけではなくエディターでも GameObject の状態を変更したい場合があります。
using UnityEngine; public class Test : MonoBehaviour { [SerializeField] CanvasGroup CanvasGroup; [SerializeField] bool Checked; #if UNITY_EDITOR void OnValidate() { CanvasGroup.blocksRaycasts = Checked; } #endif }
このコードは、Checked の値を変更すると、CanvasGroup の入力許可 / 禁止を Checked と同じ値にする、と単純なものです(警告を誘発するためのテストコードなので、実用性は置いといて)。
このコードは確かに期待通りの動きをします。が、その際 Console ウィンドウに警告を出しまくります。
今回の例のような CanvasGroup に限らず、RectTransform の値を変更…という割とやりがちなパターンでも警告は表示されてしまいます。
unity2018 のあたりかららしいですが、unity2020.3 でも発生しました。(おそらく 2021 も)
無視しても害はないのですが、あまりに大量に表示されるため困ってしまう場合は、コードを次のように書き換えると警告を出さないようになります。
パターン1
using UnityEngine; public class Test : MonoBehaviour { [SerializeField] CanvasGroup CanvasGroup; [SerializeField] bool Checked; #if UNITY_EDITOR private void OnValidate() { UnityEditor.EditorApplication.delayCall += _OnValidate; } private void _OnValidate() { UnityEditor.EditorApplication.delayCall -= _OnValidate; if(this == null) return; CanvasGroup.blocksRaycasts = Checked; } #endif }
パターン2
[ExecuteInEditMode] public class Test : Monobehaviour { [SerializeField] CanvasGroup CanvasGroup; [SerializeField] bool Checked; bool changed; #if UNITY_EDITOR private void OnValidate() { changed = true; } #endif private void LateUpdate() { if (changed) { CanvasGroup.blocksRaycasts = Checked; changed = false; } }
おすすめはパターン1
パターン1は記述の変更も少なく、負荷もそのままなのでオススメです。
パターン2はエディタでも常に Update を実行してしまうのと、いちいちフラグ管理を強要されるのがマイナス点。