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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
|
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class LuaOutlet : MonoBehaviour
{
[System.Serializable]
public class LuaOutInfo
{
public UnityEngine.Object obj;
public string name;
}
public List<LuaOutInfo> infoList = new List<LuaOutInfo>();
}
#if UNITY_EDITOR
[CustomEditor(typeof(LuaOutlet))]
public class LuaOutletEditor : Editor
{
private GUIStyle greenFontStyle;
private GUIStyle redFontStyle;
private static GUIStyle hierarchyItemStyle;
private HashSet<string> cachedNameSet = new HashSet<string>();
private static Dictionary<UnityEngine.Object, string> objectNameDict = new Dictionary<UnityEngine.Object, string>();
static LuaOutletEditor()
{
EditorApplication.hierarchyWindowItemOnGUI += HierarchyItemCB;
}
private static void HierarchyItemCB(int instanceID, Rect selectionRect)
{
var obj = EditorUtility.InstanceIDToObject(instanceID) as GameObject;
if (obj != null && objectNameDict.ContainsKey(obj))
{
Rect r = new Rect(selectionRect);
r.x = r.width - 80;
r.width = 80;
GUI.Label(r, string.Format("=> '{0}'", objectNameDict[obj]), hierarchyItemStyle);
}
}
private void OnEnable()
{
hierarchyItemStyle = new GUIStyle();
hierarchyItemStyle.normal.textColor = Color.green;
hierarchyItemStyle.hover.textColor = Color.cyan;
greenFontStyle = new GUIStyle();
greenFontStyle.fontStyle = FontStyle.Bold;
greenFontStyle.fontSize = 11;
greenFontStyle.normal.textColor = Color.green;
redFontStyle = new GUIStyle();
redFontStyle.fontStyle = FontStyle.Bold;
redFontStyle.fontSize = 11;
redFontStyle.normal.textColor = Color.red;
}
public override void OnInspectorGUI()
{
EditorGUI.BeginChangeCheck();
var outlet = target as LuaOutlet;
cachedNameSet.Clear();
objectNameDict.Clear();
if (outlet.infoList.Count == 0)
{
if (GUILayout.Button("Add LuaOutlet"))
{
outlet.infoList.Add(new LuaOutlet.LuaOutInfo());
}
}
else
{
for (int i = outlet.infoList.Count - 1; i >= 0; i--)
{
var info = outlet.infoList[i];
bool isValid = (info.obj != null && !cachedNameSet.Contains(info.name));
cachedNameSet.Add(info.name);
if (info.obj != null)
{
objectNameDict.Add(info.obj, info.name);
}
EditorGUILayout.Separator();
EditorGUILayout.BeginHorizontal();
EditorGUILayout.LabelField(string.Format("Property:'{0}'", info.name), isValid ? greenFontStyle : redFontStyle);
EditorGUILayout.Space();
if (GUILayout.Button("+"))
{
Undo.RecordObject(target, "add info");
outlet.infoList.Insert(i, new LuaOutlet.LuaOutInfo());
}
if (GUILayout.Button("-"))
{
Undo.RecordObject(target, "remove info");
outlet.infoList.RemoveAt(i);
}
EditorGUILayout.EndHorizontal();
info.name = EditorGUILayout.TextField("Name:", info.name);
info.obj = EditorGUILayout.ObjectField("Object:", info.obj, typeof(UnityEngine.Object), true);
}
}
if (EditorGUI.EndChangeCheck())
{
Undo.RecordObject(target, "change check");
}
}
}
#endif
|