FishPlayer

一个喜欢摸鱼的废物

0%

使用 State Object 暂存 property drawer 的状态。

最近在做红点功能,path是用string挂在UI物体上的。UI同学那边想要一个按钮可以切换path在inspector是可编辑或不可编辑的状态。
最开始毫无思路,因为本身path是一个string,我自然不可以它身上记录这个编辑与否的状态。后来想着能不能把这个状态存在path的protperty drawer上。问了下导师,可行,但是没法直接存。

思路

创建一个object存储这个状态,这个object存入editor的state object里。
在Property drawer进行绘制的时候获取/更新这个object。

代码

代码很简单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43

public class UITagDrawer : PropertyDrawer
{
// the object for string state
class EditingState
{
public bool IsEditing = false;
}

public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
{
/***/

// get state object
EditingState state = GUIUtility.GetStateObject(typeof(EditingState), GUIUtility.GetControlID(FocusType.Passive)) as EditingState;

using (new EditorGUILayout.HorizontalScope(style))
{
Rect editButtonRect = new Rect(position.x, position.y, 16f, 16f);
if (GUI.Button(editButtonRect, "E"))
{
// well since it's a class we dun need to set it back :>
state.IsEditing = !state.IsEditing;
}

if (GUILayout.Button("X", GUILayout.Width(18)))
{
state.IsEditing = !state.IsEditing;
}
if (state.IsEditing)
{
// show text field
tagStr = EditorGUILayout.TextField(tagStr);
}
else
{
// show lable
EditorGUILayout.LabelField(tagStr);
}
}

}
}