えんじにあ雑記!

開発していて学んだことをまとめていきます!

【Unity】Componentの値をInspectorView上で編集不可能にする

Componentの値をInspectorViewで編集不可能にする方法を解説する記事です。

概要

セーフエリアに合わせて自動的にRectTransformの値を調節してくれるようなコンポーネントを実装している場合、RectTransformの値はそのコンポーネントのみによって操作されるべきで、実装者の不用意な修正はできないようにしたい。という要望があるかと思います。

今回はそういった際にComponentをInspectorView上から編集不可能にする方法の説明です。

実装解説

UnityEngine.Objectに定義されたhideFlagsにビットフラグを設定することで編集不可能にすることができます。

以下はRectTransformを編集不可能にするサンプルコードです。

private void OnValidate()
{
    var rectTr = transform as RectTransform;
    rectTr.hideFlags = HideFlags.NotEditable;
}

hideFlagsにはほかにも値があり、それぞれの挙動に関しては下記のブログなどが参考になります。

qiita.com

Component破棄時の対応

RectTransformを編集不可能にするコンポーネントを誤ってつけてしまった場合、Remove Componentを行いますが、一度設定したhideFlagsは適切にリセットしなければ編集不可能のままになってしまいます。

Remove Componentされたタイミングを検知するため、[ExecuteAlways]を使用して対処することが可能です。

using UnityEngine;

// PlayMode以外でもOnDestroyが呼び出されるように
[ExecuteAlways]
public class AutoExpand : MonoBehaviour
{
    private void OnValidate()
    {
        var rectTr = transform as RectTransform;
        rectTr.hideFlags = HideFlags.NotEditable;
    }

    private void OnDestroy()
    {
#if UNITY_EDITOR
        var rectTr = transform as RectTransform;
        rectTr.hideFlags = HideFlags.None;
#endif
    }
}