UnityでDrivenRectTransformTrackerを使ってRectTransformの特定のプロパティをInspectorから編集できなくする方法です。
やりたいこと
Unityでは、LayoutGroupなどのコンポーネントによりRectTransformの一部のプロパティが制御されている時に、数のように制御中のプロパティがInspectorから編集不可能になります。
DrivenRectTransformTrackerを使うと、自作したコンポーネントでも上図のようにRectTransformのプロパティの一部を編集不可能にすることができます。
本記事ではこれの使い方についてまとめます。
使い方
使い方としては以下のように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が編集不可能になることを確認できます。
また、コンポーネントのコンテキストメニューからTestを実行するとPositionとRotationが更新されることを確認できます。