検索してもできないという情報ばかりひっかかりますね...
どうやら配列などに対してPropertyAttribute
を付加しても、PropertyDrawer
のOnGUI
は個々の配列要素についてのプロパティ描画処理を担当することになるようです。すでに「Size」の部分は終わってしまって、描画させないようにはできないかもしれません。
「表示位置をSizeのところにかぶせるように表示させて」というのは名案だと思ったのですが、どうやらこちらも困難なようです。
描画は上から順に行われるようなので、後からSizeの上に何か重ね描きすることは可能そうでした。
ですが各コントロールのマウス操作判定も上から順に行われるようですので、たとえ真上にボタンを置いたつもりでもSizeフィールドの方が入力を受け取ってしまうみたいです。
この入力受け付け優先権を変更する方法も見つけられませんでした。
いい解決策をお出しできず不本意ですが、Sizeフィールドに重ねて「絶対いじるな」とでも脅しを表示してやるなんてどうですかね?
結局書き換えることはできてしまうので「ReadOnlyLength」にはできませんでしたが...
確実に変更できないようブロックしたいとなるとizmktrさんの案になるか、あるいは特定のクラス専用のPropertyDrawer
にして表示内容全体をコントロールするかでしょうか。でもそれだと任意の変数に属性を付けるだけでいいという便利さは得られませんよね...
C#
1using System.Text.RegularExpressions;
2using UnityEditor;
3using UnityEngine;
4
5[CustomPropertyDrawer(typeof(ReadOnlyLengthAttribute))]
6public class ReadOnlyLengthDrawer : PropertyDrawer
7{
8 private static readonly Regex ArrayFirstElementPattern = new Regex(".+\.Array\.data\[0\]", RegexOptions.Compiled);
9 private static readonly GUIStyle WarningLabelStyle = new GUIStyle(GUI.skin.label) {alignment = TextAnchor.MiddleCenter};
10
11 public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
12 {
13 if (ArrayFirstElementPattern.IsMatch(property.propertyPath))
14 {
15 var maskRect = position;
16 maskRect.y -= EditorGUIUtility.singleLineHeight + EditorGUIUtility.standardVerticalSpacing;
17 var gray = (byte)(EditorGUIUtility.isProSkin ? 56 : 194);
18 EditorGUI.DrawRect(maskRect,new Color32(gray, gray, gray, 192));
19 GUI.Label(maskRect, "Don't modify the size!", WarningLabelStyle);
20 }
21
22 EditorGUI.PropertyField(position, property, label, true);
23 }
24}
![図](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/ad6b9d0093834241a6d2267c262d61b9.png)
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/21 14:33