Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit 81b7748

Browse files
author
mob-sakai
committedJun 4, 2018
release
2 parents ee165da + 24dc59b commit 81b7748

29 files changed

+843
-82
lines changed
 

‎Assets/Coffee/EditorExtensions/InjectablePropertyDrawer/Editor/PropertyDrawerInjector.cs

+81-26
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,69 @@
66

77
namespace Coffee.EditorExtensions
88
{
9-
static class PropertyDrawerInjector
9+
public static class PropertyDrawerInjector
1010
{
11-
const BindingFlags bfAll = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
12-
static readonly Type typeScriptAttributeUtility = Type.GetType("UnityEditor.ScriptAttributeUtility, UnityEditor");
13-
static readonly Type typeDrawerKeySet = Type.GetType("UnityEditor.ScriptAttributeUtility+DrawerKeySet, UnityEditor");
14-
static readonly MethodInfo miBuildDrawerTypeForTypeDictionary = typeScriptAttributeUtility.GetMethod("BuildDrawerTypeForTypeDictionary", bfAll);
15-
static readonly FieldInfo fiDrawerTypeForType = typeScriptAttributeUtility.GetField("s_DrawerTypeForType", bfAll);
11+
//################################
12+
// Constant or Static Members.
13+
//################################
14+
const BindingFlags kBfAll = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
15+
static readonly Type s_TypeScriptAttributeUtility = Type.GetType("UnityEditor.ScriptAttributeUtility, UnityEditor");
16+
static readonly Type s_TypeDrawerKeySet = Type.GetType("UnityEditor.ScriptAttributeUtility+DrawerKeySet, UnityEditor");
17+
static readonly MethodInfo s_MiBuildDrawerTypeForTypeDictionary = s_TypeScriptAttributeUtility.GetMethod("BuildDrawerTypeForTypeDictionary", kBfAll);
18+
static readonly FieldInfo s_FiDrawerTypeForType = s_TypeScriptAttributeUtility.GetField("s_DrawerTypeForType", kBfAll);
19+
static readonly FieldInfo s_FiDrawer = s_TypeDrawerKeySet.GetField("drawer", kBfAll);
20+
static readonly FieldInfo s_FiType = s_TypeDrawerKeySet.GetField("type", kBfAll);
1621

22+
23+
//################################
24+
// Public Members.
25+
//################################
1726
/// <summary>
18-
/// Inject property drawer on load method.
27+
/// Gets [Type -> DrawerType] dictionary.
1928
/// </summary>
20-
[UnityEditor.InitializeOnLoadMethod]
21-
static void InjectPropertyDrawer()
29+
public static IDictionary drawerTypeForType
30+
{
31+
get
32+
{
33+
if (_s_DicDrawerTypeForType == null)
34+
{
35+
// Get [Type -> DrawerType] dictionary from ScriptAttributeUtility class.
36+
_s_DicDrawerTypeForType = s_FiDrawerTypeForType.GetValue(null) as IDictionary;
37+
if (_s_DicDrawerTypeForType == null)
38+
{
39+
s_MiBuildDrawerTypeForTypeDictionary.Invoke(null, new object[0]);
40+
_s_DicDrawerTypeForType = s_FiDrawerTypeForType.GetValue(null) as IDictionary;
41+
}
42+
}
43+
44+
return _s_DicDrawerTypeForType;
45+
}
46+
}
47+
48+
/// <summary>
49+
/// Gets all loaded types in current domain.
50+
/// </summary>
51+
public static Type[] loadedTypes
2252
{
23-
// Get [Type -> DrawerType] dictionary.
24-
IDictionary dicDrawerTypeForType = fiDrawerTypeForType.GetValue(null) as IDictionary;
25-
if (dicDrawerTypeForType == null)
53+
get
2654
{
27-
miBuildDrawerTypeForTypeDictionary.Invoke(null, new object[0]);
28-
dicDrawerTypeForType = fiDrawerTypeForType.GetValue(null) as IDictionary;
55+
if (_s_LoadedTypes == null)
56+
{
57+
_s_LoadedTypes = AppDomain.CurrentDomain.GetAssemblies()
58+
.SelectMany(x => x.GetTypes())
59+
.ToArray();
60+
}
61+
return _s_LoadedTypes;
2962
}
63+
}
3064

31-
// Get all types in current domain.
32-
Type[] loadedTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes()).ToArray();
3365

66+
/// <summary>
67+
/// Inject property drawer on load method.
68+
/// </summary>
69+
[UnityEditor.InitializeOnLoadMethod]
70+
public static void InjectPropertyDrawer()
71+
{
3472
// Find all drawers.
3573
foreach (var drawerType in loadedTypes.Where(x => x.IsSubclassOf(typeof(GUIDrawer))))
3674
{
@@ -39,36 +77,53 @@ static void InjectPropertyDrawer()
3977
foreach (InjectablePropertyDrawer attr in attrs)
4078
{
4179
// Inject drawer type.
42-
InjectPropertyDrawer(loadedTypes, dicDrawerTypeForType, drawerType, attr);
80+
InjectPropertyDrawer(drawerType, attr);
4381
}
4482
}
4583
}
4684

4785
/// <summary>
4886
/// Inject property drawer.
4987
/// </summary>
50-
/// <param name="types">All types in current domain.</param>
51-
/// <param name="dic">[Type -> DrawerType] dictionary.</param>
5288
/// <param name="drawerType">CustomPropertyDrawer type.</param>
5389
/// <param name="attr">InjectablePropertyDrawer attribute.</param>
54-
static void InjectPropertyDrawer(Type[] types, IDictionary dic, Type drawerType, InjectablePropertyDrawer attr)
90+
public static void InjectPropertyDrawer(Type drawerType, InjectablePropertyDrawer attr)
5591
{
5692
// Create drawer key set.
57-
object keyset = Activator.CreateInstance(typeDrawerKeySet);
58-
typeDrawerKeySet.GetField("drawer", bfAll).SetValue(keyset, drawerType);
59-
typeDrawerKeySet.GetField("type", bfAll).SetValue(keyset, attr.type);
93+
object keyset = Activator.CreateInstance(s_TypeDrawerKeySet);
94+
s_FiDrawer.SetValue(keyset, drawerType);
95+
s_FiType.SetValue(keyset, attr.type);
6096

6197
// Inject drawer type.
62-
dic[attr.type] = keyset;
98+
drawerTypeForType[attr.type] = keyset;
6399

64100
// Inject drawer type for subclass.
65101
if (attr.useForChildren)
66102
{
67-
foreach (var type in types.Where(x => x.IsSubclassOf(attr.type)))
103+
foreach (var type in loadedTypes.Where(x => x.IsSubclassOf(attr.type)))
68104
{
69-
dic[type] = keyset;
105+
drawerTypeForType[type] = keyset;
70106
}
71107
}
72108
}
109+
110+
/// <summary>
111+
/// Gets the drawer type for type.
112+
/// </summary>
113+
/// <returns>The drawer type.</returns>
114+
/// <param name="type">The type.</param>
115+
public static Type GetDrawerType(Type type)
116+
{
117+
return drawerTypeForType.Contains(type)
118+
? s_FiDrawer.GetValue(drawerTypeForType[type]) as Type
119+
: null;
120+
}
121+
122+
123+
//################################
124+
// Private Members.
125+
//################################
126+
static IDictionary _s_DicDrawerTypeForType;
127+
static Type[] _s_LoadedTypes;
73128
}
74129
}

‎Assets/Coffee/EditorExtensions/InjectablePropertyDrawer/Editor/UnityEventDrawerEx.cs

+106-51
Original file line numberDiff line numberDiff line change
@@ -13,100 +13,147 @@ namespace Coffee.EditorExtensions
1313
[InjectablePropertyDrawer(typeof(UnityEventBase), true)]
1414
public class UnityEventDrawerEx : UnityEventDrawer
1515
{
16-
const BindingFlags bfAll = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
17-
static readonly FieldInfo fiReorderableList = typeof(UnityEventDrawer).GetField("m_ReorderableList", bfAll);
18-
static readonly FieldInfo fiCalls = typeof(UnityEventBase).GetField("m_Calls", bfAll);
19-
static readonly FieldInfo fiRuntimeCalls = Type.GetType("UnityEngine.Events.InvokableCallList, UnityEngine").GetField("m_RuntimeCalls", bfAll);
20-
static GUIStyle styleToggle;
21-
static GUIStyle styleBg;
22-
23-
static bool foldStatus { get { return UnityEventDrawerExSettings.instance.foldStatus; } set { UnityEventDrawerExSettings.instance.foldStatus = value; } }
24-
25-
static readonly Dictionary<Type, FieldInfo> fiDelegateMap = new Dictionary<Type, FieldInfo>();
26-
16+
//################################
17+
// Constant or Static Members.
18+
//################################
19+
const BindingFlags kBfAll = BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static | BindingFlags.FlattenHierarchy;
20+
static readonly FieldInfo s_FiReorderableList = typeof(UnityEventDrawer).GetField("m_ReorderableList", kBfAll);
21+
static readonly FieldInfo s_FiCalls = typeof(UnityEventBase).GetField("m_Calls", kBfAll);
22+
static readonly FieldInfo s_FiRuntimeCalls = Type.GetType("UnityEngine.Events.InvokableCallList, UnityEngine").GetField("m_RuntimeCalls", kBfAll);
23+
24+
25+
26+
//################################
27+
// Public Members.
28+
//################################
29+
/// <summary>
30+
/// Gets the height of the property.
31+
/// </summary>
32+
/// <returns>The property height.</returns>
33+
/// <param name="property">Property.</param>
34+
/// <param name="label">Label.</param>
2735
public override float GetPropertyHeight(SerializedProperty property, GUIContent label)
2836
{
29-
ReorderableList ro = fiReorderableList.GetValue(this) as ReorderableList;
37+
// Get the ReorderableList for default drawer.
38+
ReorderableList ro = s_FiReorderableList.GetValue(this) as ReorderableList;
3039
if (ro == null)
3140
{
3241
base.GetPropertyHeight(property, label);
33-
ro = fiReorderableList.GetValue(this) as ReorderableList;
42+
ro = s_FiReorderableList.GetValue(this) as ReorderableList;
3443
}
3544

45+
// If persistent calls is empty, display it compactry.
3646
bool isEmpty = property.FindPropertyRelative("m_PersistentCalls").FindPropertyRelative("m_Calls").arraySize == 0;
3747
ro.elementHeight = isEmpty
3848
? 16
3949
: 16 * 2 + 11;
4050

41-
return foldStatus
51+
// If drawer is folded, skip drawing runtime calls.
52+
return s_FoldStatus
4253
? base.GetPropertyHeight(property, label) + GetRuntimeCalls(property).Count * 17
4354
: base.GetPropertyHeight(property, label);
4455
}
4556

57+
/// <summary>
58+
/// Raises the GU event.
59+
/// </summary>
60+
/// <param name="position">Position.</param>
61+
/// <param name="property">Property.</param>
62+
/// <param name="label">Label.</param>
4663
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
4764
{
65+
// Draw background and toggle.
4866
var RuntimeCalls = GetRuntimeCalls(property);
49-
float height = foldStatus
67+
float height = s_FoldStatus
5068
? RuntimeCalls.Count * 17 + 16
5169
: 16;
5270
var r = new Rect(position.x + 2, position.y + position.height - height, position.width - 4, height);
5371
DrawRuntimeCallToggle(r, RuntimeCalls.Count);
5472

73+
// Draw UnityEvent using default drawer.
5574
base.OnGUI(position, property, label);
5675

57-
if (foldStatus)
76+
// If drawer is folded, skip drawing runtime calls.
77+
if (!s_FoldStatus)
78+
{
79+
return;
80+
}
81+
82+
// Draw runtime calls.
83+
r = new Rect(r.x + 16, r.y + 15, r.width - 16, 16);
84+
EditorStyles.objectField.fontSize = 9;
85+
foreach (var invokableCall in RuntimeCalls)
5886
{
59-
r = new Rect(r.x + 16, r.y + 15, r.width - 16, 16);
60-
EditorStyles.objectField.fontSize = 9;
61-
foreach (var c in RuntimeCalls)
87+
// Get delegate object from InvokableCall.
88+
Type type = invokableCall.GetType();
89+
FieldInfo fiDelegate;
90+
if (!s_FiDelegateMap.TryGetValue(type, out fiDelegate))
6291
{
63-
DrawDelegate(r, GetDelegate(c));
64-
r.y += r.height + 1;
92+
fiDelegate = type.GetField("Delegate", kBfAll);
93+
s_FiDelegateMap.Add(type, fiDelegate);
6594
}
66-
EditorStyles.objectField.fontSize = 11;
95+
Delegate del = fiDelegate.GetValue(invokableCall) as Delegate;
96+
97+
// Draw delegate.
98+
DrawDelegate(r, del);
99+
r.y += r.height + 1;
67100
}
101+
EditorStyles.objectField.fontSize = 11;
68102
}
69103

70-
static Delegate GetDelegate(object invokableCall)
71-
{
72-
Type type = invokableCall.GetType();
73-
FieldInfo fiDelegate;
74-
if (!fiDelegateMap.TryGetValue(type, out fiDelegate))
75-
{
76-
fiDelegate = type.GetField("Delegate", bfAll);
77-
fiDelegateMap.Add(type, fiDelegate);
78-
}
79104

80-
return fiDelegate.GetValue(invokableCall) as Delegate;
81-
}
105+
//################################
106+
// Private Members.
107+
//################################
108+
109+
static bool s_FoldStatus { get { return UnityEventDrawerExSettings.instance.foldStatus; } set { UnityEventDrawerExSettings.instance.foldStatus = value; } }
82110

83-
static void DrawRuntimeCallToggle(Rect rect, int count)
111+
static readonly Dictionary<Type, FieldInfo> s_FiDelegateMap = new Dictionary<Type, FieldInfo>();
112+
113+
static GUIStyle s_StyleToggle { get; set; }
114+
115+
static GUIStyle s_StyleBg { get; set; }
116+
117+
/// <summary>
118+
/// Draws the runtime call toggle.
119+
/// </summary>
120+
/// <param name="position">Position.</param>
121+
/// <param name="count">Runtime call count.</param>
122+
static void DrawRuntimeCallToggle(Rect position, int count)
84123
{
85-
if (styleBg == null)
124+
// Cache style.
125+
if (s_StyleBg == null)
86126
{
87-
styleBg = new GUIStyle("ProgressBarBack");
88-
styleToggle = new GUIStyle("OL Toggle") { fontSize = 9 };
89-
styleToggle.onNormal.textColor =
90-
styleToggle.normal.textColor =
91-
styleToggle.onActive.textColor =
92-
styleToggle.active.textColor = EditorStyles.label.normal.textColor;
127+
s_StyleBg = new GUIStyle("ProgressBarBack");
128+
s_StyleToggle = new GUIStyle("OL Toggle") { fontSize = 9 };
129+
s_StyleToggle.onNormal.textColor =
130+
s_StyleToggle.normal.textColor =
131+
s_StyleToggle.onActive.textColor =
132+
s_StyleToggle.active.textColor = EditorStyles.label.normal.textColor;
93133
}
94134

95-
GUI.Label(rect, "", styleBg);
135+
// Draw background.
136+
GUI.Label(position, "", s_StyleBg);
137+
138+
// Draw foldout with label.
96139
string text = string.Format("Show runtime calls ({0})", count);
97-
rect.width -= 80;
98-
rect.height = 14;
99-
foldStatus = GUI.Toggle(rect, foldStatus, text, styleToggle);
140+
s_FoldStatus = GUI.Toggle(new Rect(position.x, position.y, position.width - 80, 14), s_FoldStatus, text, s_StyleToggle);
100141
}
101142

102-
static void DrawDelegate(Rect rect, Delegate del)
143+
/// <summary>
144+
/// Draws the delegate.
145+
/// </summary>
146+
/// <param name="position">Position.</param>
147+
/// <param name="del">Delegate.</param>
148+
static void DrawDelegate(Rect position, Delegate del)
103149
{
104-
Rect r = new Rect(rect.x, rect.y, rect.width * 0.3f, rect.height);
105150
try
106151
{
152+
Rect r = new Rect(position.x, position.y, position.width * 0.3f, position.height);
107153
MethodInfo method = del.Method;
108154
object target = del.Target;
109155

156+
// Draw the target if possible.
110157
var obj = target as UnityEngine.Object;
111158
if (obj)
112159
{
@@ -121,28 +168,36 @@ static void DrawDelegate(Rect rect, Delegate del)
121168
EditorGUI.LabelField(r, "null", EditorStyles.miniLabel);
122169
}
123170

171+
// Draw the method name.
124172
r.x += r.width;
125-
r.width = rect.width - r.width;
173+
r.width = position.width - r.width;
126174
EditorGUI.LabelField(r, method.ReflectedType + "." + method.Name, EditorStyles.miniLabel);
127175
}
128176
catch
129177
{
130-
EditorGUI.LabelField(rect, "null delegate", EditorStyles.miniLabel);
178+
EditorGUI.LabelField(position, "null delegate", EditorStyles.miniLabel);
131179
}
132180
}
133181

182+
/// <summary>
183+
/// Gets the runtime call list from SerializedProperty.
184+
/// </summary>
185+
/// <returns>The runtime call list.</returns>
186+
/// <param name="property">SerializedProperty.</param>
134187
public static IList GetRuntimeCalls(SerializedProperty property)
135188
{
189+
// Find FieldInfo for the runtime call list.
136190
var instance = property.serializedObject.targetObject;
137191
Type type = instance.GetType();
138192
FieldInfo fiProperty = null;
139193
while (type != null && fiProperty == null)
140194
{
141-
fiProperty = type.GetField(property.name, bfAll);
195+
fiProperty = type.GetField(property.name, kBfAll);
142196
type = type.BaseType;
143197
}
144198

145-
return fiRuntimeCalls.GetValue(fiCalls.GetValue(fiProperty.GetValue(instance))) as IList;
199+
// Gets the runtime call list.
200+
return s_FiRuntimeCalls.GetValue(s_FiCalls.GetValue(fiProperty.GetValue(instance))) as IList;
146201
}
147202

148203
}

‎Assets/Test.meta

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Assets/Test/Editor.meta

+9
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using UnityEngine;
2+
using UnityEditor;
3+
using NUnit.Framework;
4+
using System.Text;
5+
6+
namespace Coffee.EditorExtensions.Test
7+
{
8+
public class PropertyDrawerInjectorTest
9+
{
10+
[Test]
11+
public void PrintAllPropertyDrawer()
12+
{
13+
StringBuilder sb = new StringBuilder();
14+
var dic = PropertyDrawerInjector.drawerTypeForType;
15+
foreach (System.Type key in dic.Keys)
16+
{
17+
sb.AppendFormat("{0,-20} -> {1}\n", key.Name, PropertyDrawerInjector.GetDrawerType(key).Name);
18+
}
19+
Debug.Log(sb);
20+
}
21+
}
22+
}

‎Assets/Test/Editor/PropertyDrawerInjectorTest.cs.meta

+12
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Assets/TestBehavior.cs renamed to ‎Assets/Test/TestBehavior.cs

+2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using UnityEngine;
22

3+
[ExecuteInEditMode]
34
public class TestBehavior : MonoBehaviour
45
{
56
[System.Serializable] public class TransformUnityEvent : UnityEngine.Events.UnityEvent<Transform> {};
@@ -18,6 +19,7 @@ void TestTransform(Transform t)
1819

1920

2021
#if true
22+
[SerializeField] string text;
2123
[SerializeField] UnityEngine.UI.Button button = null;
2224

2325
public void TestPersistant()
File renamed without changes.

‎Assets/Test/TestBehavior.unity

+578
Large diffs are not rendered by default.
File renamed without changes.

‎Assets/TestBehavior.unity

-31.3 KB
Binary file not shown.

‎CHANGELOG.md

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,20 @@
11
# Changelog
22

3-
## [v0.1.0](https://github.com/mob-sakai/UnityEventDrawerEx/tree/v0.1.0) (2018-06-04)
3+
## [v0.2.0](https://github.com/mob-sakai/UnityEventDrawerEx/tree/v0.2.0) (2018-06-04)
4+
5+
[Full Changelog](https://github.com/mob-sakai/UnityEventDrawerEx/compare/v0.1.0...v0.2.0)
6+
7+
Add test code and refactor code.
8+
9+
**Implemented enhancements:**
10+
11+
- Add test [\#9](https://github.com/mob-sakai/UnityEventDrawerEx/issues/9)
12+
13+
**Closed issues:**
14+
15+
- Refactoring [\#7](https://github.com/mob-sakai/UnityEventDrawerEx/issues/7)
16+
17+
## [v0.1.0](https://github.com/mob-sakai/UnityEventDrawerEx/tree/v0.1.0) (2018-06-03)
418

519
[Full Changelog](https://github.com/mob-sakai/UnityEventDrawerEx/compare/354856e5965e6e213be0496959aa52cb0be21c21...v0.1.0)
620

‎ProjectSettings/AudioManager.asset

-3.72 KB
Binary file not shown.
-3.9 KB
Binary file not shown.

‎ProjectSettings/DynamicsManager.asset

-3.48 KB
Binary file not shown.
-3.87 KB
Binary file not shown.

‎ProjectSettings/EditorSettings.asset

-3.68 KB
Binary file not shown.
-2.12 KB
Binary file not shown.

‎ProjectSettings/InputManager.asset

273 Bytes
Binary file not shown.

‎ProjectSettings/NavMeshAreas.asset

-3.41 KB
Binary file not shown.

‎ProjectSettings/NetworkManager.asset

-3.87 KB
Binary file not shown.
-2.98 KB
Binary file not shown.

‎ProjectSettings/ProjectSettings.asset

-26.9 KB
Binary file not shown.

‎ProjectSettings/QualitySettings.asset

-486 Bytes
Binary file not shown.

‎ProjectSettings/TagManager.asset

-3.84 KB
Binary file not shown.

‎ProjectSettings/TimeManager.asset

-3.82 KB
Binary file not shown.
-3.45 KB
Binary file not shown.

‎README.md

+8-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
UnityEventDrawerEx
22
===
33

4-
![image](https://user-images.githubusercontent.com/12690315/40887938-12736f56-678b-11e8-9a4c-997456b13603.png)
4+
![image](https://user-images.githubusercontent.com/12690315/40888757-c4cf3990-6796-11e8-854d-47b371632644.png)
55

66
This plugin extends the UnityEventDrawer to display runtime calls in the inspector.
77

@@ -23,7 +23,7 @@ This plugin extends the UnityEventDrawer to display runtime calls in the inspect
2323

2424
#### What is runtime call?
2525

26-
*Button.onClick* and *Toggle.OnChangeValue* etc are known as **UnityEvent**.
26+
*Button.onClick* and *Toggle.OnChangeValue* etc. are known as **UnityEvent**.
2727
UnityEvent has two types of callbacks:
2828

2929
* Persistent call
@@ -66,9 +66,14 @@ public class TestBehavior : MonoBehaviour
6666
![image](https://user-images.githubusercontent.com/12690315/40887986-d0c2af58-678b-11e8-953c-63116ab2b433.png)
6767

6868

69-
If you like a development style that heavily uses Runtime calls (MVP pattern etc), we recommend using this plugin!
69+
If you like a development style that heavily uses Runtime calls (MVP pattern, etc.), we recommend using this plugin!
7070

71+
#### Features
7172

73+
* Display runtime calls in inspector
74+
* Expand/collapse the runtime call view.
75+
* Display instance method, its target is also displayed
76+
* When the Persistent call is empty, display it compactly
7277

7378
<br><br><br><br>
7479
## Usage

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "UnityEventDrawerEx",
3-
"version": "0.1.0",
3+
"version": "0.2.0",
44
"repository": {
55
"type": "git",
66
"url": "git+https://github.com/mob-sakai/UnityEventDrawerEx.git"

0 commit comments

Comments
 (0)
Please sign in to comment.