【Unity】RectTransformの特定のプロパティをInspectorから編集できなくするDrivenRectTransformTracker

UnityでDrivenRectTransformTrackerを使ってRectTransformの特定のプロパティをInspectorから編集できなくする方法です。

やりたいこと

Unityでは、LayoutGroupなどのコンポーネントによりRectTransformの一部のプロパティが制御されている時に、数のように制御中のプロパティがInspectorから編集不可能になります。

編集不可能

DrivenRectTransformTrackerを使うと、自作したコンポーネントでも上図のようにRectTransformのプロパティの一部を編集不可能にすることができます。

docs.unity3d.com

本記事ではこれの使い方についてまとめます。

使い方

使い方としては以下のようにDrivenRectTransformTracker.Addを呼ぶだけです。

using UnityEngine;

[ExecuteInEditMode]
[RequireComponent(typeof(RectTransform))]
public class Example : MonoBehaviour
{
    private DrivenRectTransformTracker _tracker;
    [SerializeField] private RectTransform rectTransform;

    private void Awake()
    {
        rectTransform = GetComponent<RectTransform>();
    }

    private void OnEnable()
    {
        Execute(Vector2.zero, Quaternion.identity);
    }

    private void OnDisable()
    {
        _tracker.Clear();
    }

    private void Execute(Vector2 diffAnchoredPosition, Quaternion diffRotation)
    {
        // DrivenRectTransformTrackerにAddしたプロパティは編集不可能になる
        // 値を書き換える前にはDrivenRectTransformTrackerをクリアして再登録
        _tracker.Clear();
        _tracker.Add(this, rectTransform, DrivenTransformProperties.AnchoredPosition
                                           | DrivenTransformProperties.Rotation);
        
        // 値を適当に書き換える
        rectTransform.anchoredPosition += diffAnchoredPosition;
        rectTransform.rotation *= diffRotation;
    }
    
    // ContextMenuから実行できるように
#if UNITY_EDITOR
    [UnityEditor.MenuItem("CONTEXT/Example/Test")]
    private static void Test(UnityEditor.MenuCommand command)
    {
        var component = (Example)command.context;
        component.Execute(Vector2.one, Quaternion.AngleAxis(1, Vector3.up));
    }
#endif
}

コメントにも書いていますが、このコンポーネントから値を書き換える前には一度DrivenRectTransformTracker.ClearをしてからDrivenRectTransformTracker.Addしなおす必要があります。

動作確認

これを適当なuGUIのGameObjectにアタッチすると、PositionとRotationが編集不可能になることを確認できます。

PositionとRotationを編集不可能に

また、コンポーネントコンテキストメニューからTestを実行するとPositionとRotationが更新されることを確認できます。

値を更新

参考

docs.unity3d.com