Skip to content

Commit 589db74

Browse files
author
Bruno Mikoski
committed
fix: reorganizing indirect reference property drawer to remove unnecessary serialized object
1 parent 31456ff commit 589db74

8 files changed

Lines changed: 72 additions & 54 deletions

Scripts/Editor/Core/CollectionCustomEditor.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ private void OnDisable()
5959
ObjectUtility.SetDirty(collection);
6060
}
6161

62+
private void OnDestroy()
63+
{
64+
if (Application.isPlaying)
65+
return;
66+
67+
CollectionsRegistry.Instance.DeleteCollection(collection);
68+
}
69+
6270
private void ValidateGUIDS()
6371
{
6472
collection.ValidateGUID();

Scripts/Editor/Core/CollectionItemDropdown.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,16 +66,16 @@ protected override void ItemSelected(AdvancedDropdownItem item)
6666
{
6767
ScriptableObjectCollection collection = collections.First();
6868
ScriptableObjectCollectionItem collectionItem = collection.AddNew(itemType);
69-
callback?.Invoke(collectionItem);
69+
callback.Invoke(collectionItem);
7070
Selection.objects = new Object[] {collection};
7171
CollectionCustomEditor.SetLastAddedEnum(collectionItem);
7272
return;
7373
}
7474

7575
if (item is CollectionItemDropdownItem dropdownItem)
76-
callback?.Invoke(dropdownItem.CollectionItem);
76+
callback.Invoke(dropdownItem.CollectionItem);
7777
else
78-
callback?.Invoke(null);
78+
callback.Invoke(null);
7979
}
8080

8181
public void Show(Rect rect, Action<ScriptableObjectCollectionItem> onSelectedCallback)

Scripts/Editor/Core/CollectionItemIndirectReferencePropertyDrawer.cs

Lines changed: 22 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,9 @@ public sealed class CollectionItemIndirectReferencePropertyDrawer : PropertyDraw
1111
private const string COLLECTION_ITEM_GUID_PROPERTY_PATH = "collectionItemGUID";
1212
private const string COLLECTION_GUID_PROPERTY_PATh = "collectionGUID";
1313

14-
private SerializedProperty collectionItemGUIDSerializedProperty;
15-
private SerializedProperty collectionGUIDSerializedProperty;
14+
private Type collectionItemType;
1615
private CollectionItemItemPropertyDrawer collectionItemPropertyDrawer;
1716

18-
private ScriptableObjectCollectionItem collectionItem;
19-
private Type collectionItemType;
20-
2117
public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
2218
{
2319
if (collectionItemType == null)
@@ -30,40 +26,38 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
3026
if (collectionItemPropertyDrawer == null)
3127
{
3228
collectionItemPropertyDrawer = new CollectionItemItemPropertyDrawer();
33-
collectionItemPropertyDrawer.Initialize(collectionItemType, property.serializedObject.targetObject);
29+
collectionItemPropertyDrawer.Initialize(collectionItemType, null);
3430
}
3531

32+
SerializedProperty collectionItemGUIDSerializedProperty = property.FindPropertyRelative(COLLECTION_ITEM_GUID_PROPERTY_PATH);
33+
SerializedProperty collectionGUIDSerializedProperty = property.FindPropertyRelative(COLLECTION_GUID_PROPERTY_PATh);
3634

37-
collectionItemGUIDSerializedProperty = property.FindPropertyRelative(COLLECTION_ITEM_GUID_PROPERTY_PATH);
38-
collectionGUIDSerializedProperty = property.FindPropertyRelative(COLLECTION_GUID_PROPERTY_PATh);
39-
40-
if (collectionItem != null)
35+
ScriptableObjectCollectionItem collectionItem = null;
36+
37+
if (!string.IsNullOrEmpty(collectionItemGUIDSerializedProperty.stringValue)
38+
&& !string.IsNullOrEmpty(collectionGUIDSerializedProperty.stringValue))
4139
{
42-
if (string.IsNullOrEmpty(collectionItemGUIDSerializedProperty.stringValue)
43-
|| string.IsNullOrEmpty(collectionGUIDSerializedProperty.stringValue))
40+
if (CollectionsRegistry.Instance.TryGetCollectionByGUID(collectionGUIDSerializedProperty.stringValue,
41+
out ScriptableObjectCollection collection))
4442
{
45-
collectionItemGUIDSerializedProperty.stringValue = collectionItem.GUID;
46-
collectionGUIDSerializedProperty.stringValue = collectionItem.Collection.GUID;
47-
property.serializedObject.ApplyModifiedProperties();
43+
if (collection.TryGetItemByGUID(collectionItemGUIDSerializedProperty.stringValue,
44+
out ScriptableObjectCollectionItem resultCollection))
45+
{
46+
collectionItem = resultCollection;
47+
}
4848
}
4949
}
50-
else
50+
51+
int indexOfArrayPart = property.propertyPath.IndexOf('[');
52+
53+
if (indexOfArrayPart > -1)
5154
{
52-
if (!string.IsNullOrEmpty(collectionItemGUIDSerializedProperty.stringValue)
53-
&& !string.IsNullOrEmpty(collectionGUIDSerializedProperty.stringValue))
55+
if (string.Equals(label.text, collectionItemGUIDSerializedProperty.stringValue, StringComparison.Ordinal))
5456
{
55-
if (CollectionsRegistry.Instance.TryGetCollectionByGUID(collectionGUIDSerializedProperty.stringValue,
56-
out ScriptableObjectCollection collection))
57-
{
58-
if (collection.TryGetItemByGUID(collectionItemGUIDSerializedProperty.stringValue,
59-
out ScriptableObjectCollectionItem resultCollection))
60-
{
61-
collectionItem = resultCollection;
62-
}
63-
}
57+
label.text = $"Element {property.propertyPath.Substring(indexOfArrayPart+1, 1)}";
6458
}
6559
}
66-
60+
6761
collectionItemPropertyDrawer.DrawCollectionItemDrawer(
6862
position, collectionItem, label,
6963
item =>

Scripts/Editor/Core/CollectionItemItemPropertyDrawer.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,15 +63,18 @@ public override void OnGUI(Rect position, SerializedProperty property, GUIConten
6363
}
6464

6565
internal void DrawCollectionItemDrawer(Rect position, ScriptableObjectCollectionItem collectionItem, GUIContent label,
66-
Action<ScriptableObjectCollectionItem> callback)
66+
Action<ScriptableObjectCollectionItem> callback)
6767
{
6868
position.height = 15;
6969
position = EditorGUI.PrefixLabel(position, label);
7070
int indent = EditorGUI.indentLevel;
7171
EditorGUI.indentLevel = 0;
7272
if (collectionItem != null)
7373
{
74-
DrawEditFoldoutButton(ref position);
74+
if (currentObject == null)
75+
currentObject = collectionItem;
76+
77+
DrawEditFoldoutButton(ref position, collectionItem);
7578
DrawGotoButton(ref position);
7679
}
7780

@@ -172,7 +175,7 @@ private void DrawGotoButton(ref Rect popupRect)
172175
}
173176
}
174177

175-
private void DrawEditFoldoutButton(ref Rect popupRect)
178+
private void DrawEditFoldoutButton(ref Rect popupRect, ScriptableObjectCollectionItem targetItem)
176179
{
177180
Rect buttonRect = popupRect;
178181
buttonRect.width = 30;
@@ -181,13 +184,13 @@ private void DrawEditFoldoutButton(ref Rect popupRect)
181184
buttonRect.x += popupRect.width;
182185

183186
GUIContent guiContent = CollectionEditorGUI.EditGUIContent;
184-
if (CollectionUtility.IsFoldoutOpen(item, currentObject))
187+
if (CollectionUtility.IsFoldoutOpen(targetItem, currentObject))
185188
guiContent = CollectionEditorGUI.CloseGUIContent;
186189

187190
if (GUI.Button(buttonRect, guiContent))
188191
{
189-
CollectionUtility.SetFoldoutOpen(!CollectionUtility.IsFoldoutOpen(item, currentObject), item, currentObject);
190-
ObjectUtility.SetDirty(item);
192+
CollectionUtility.SetFoldoutOpen(!CollectionUtility.IsFoldoutOpen(targetItem, currentObject), targetItem, currentObject);
193+
ObjectUtility.SetDirty(targetItem);
191194
}
192195
}
193196

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using UnityEditor;
2+
3+
namespace BrunoMikoski.ScriptableObjectCollections
4+
{
5+
[CustomEditor(typeof(CollectionsRegistry), true)]
6+
public sealed class CollectionRegistryCustomEditor : Editor
7+
{
8+
private void OnEnable()
9+
{
10+
CollectionsRegistry.Instance.ReloadCollections();
11+
}
12+
}
13+
}

Scripts/Editor/Core/CollectionRegistryCustomEditor.cs.meta

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Scripts/Editor/Wizzard/CreateCollectionWizzard.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -244,18 +244,6 @@ private void CreateIndirectAccess()
244244
$"public sealed class {collectionItemName}IndirectReference : CollectionItemIndirectReference<{collectionItemName}>",
245245
directives.Distinct().ToArray());
246246

247-
CodeGenerationUtility.AppendLine(writer, 0,
248-
$"#if UNITY_EDITOR");
249-
250-
CodeGenerationUtility.AppendLine(writer, indentation,
251-
$"[SerializeField]");
252-
253-
CodeGenerationUtility.AppendLine(writer, indentation,
254-
$"private {collectionItemName} editorAsset;");
255-
256-
CodeGenerationUtility.AppendLine(writer, 0,
257-
$"#endif");
258-
259247
CodeGenerationUtility.AppendLine(writer, indentation,
260248
$"public {collectionItemName}IndirectReference() {{}}");
261249

@@ -348,6 +336,8 @@ static void OnAfterScriptsReloading()
348336

349337
CreateCollectionWizzard openWindowInstance = GetWindow<CreateCollectionWizzard>();
350338
openWindowInstance.Close();
339+
AssetDatabase.SaveAssets();
340+
AssetDatabase.Refresh();
351341
}
352342
}
353343
}

Scripts/Runtime/Core/CollectionsRegistry.cs

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44
using BrunoMikoski.ScriptableObjectCollections.Core;
55
using UnityEngine;
66
#if UNITY_EDITOR
7-
using System.IO;
87
using UnityEditor;
98
#endif
109

@@ -15,18 +14,24 @@ public class CollectionsRegistry : ResourceScriptableObjectSingleton<Collections
1514
{
1615
[SerializeField]
1716
private List<ScriptableObjectCollection> collections = new List<ScriptableObjectCollection>();
18-
public IReadOnlyList<ScriptableObjectCollection> Collections => collections;
1917

2018
public void UsedOnlyForAOTCodeGeneration()
2119
{
2220
LoadOrCreateInstance();
2321
// Include an exception so we can be sure to know if this method is ever called.
2422
throw new InvalidOperationException("This method is used for AOT code generation only. Do not call it at runtime.");
2523
}
26-
24+
2725
public bool IsKnowCollection(ScriptableObjectCollection targetCollection)
2826
{
29-
return collections.Any(collection => collection.GUID.Equals(targetCollection.GUID, StringComparison.Ordinal));
27+
for (int i = 0; i < collections.Count; i++)
28+
{
29+
ScriptableObjectCollection collection = collections[i];
30+
if (collection != null && collection.GUID.Equals(targetCollection.GUID, StringComparison.Ordinal))
31+
return true;
32+
}
33+
34+
return false;
3035
}
3136

3237
public void RegisterCollection(ScriptableObjectCollection targetCollection)
@@ -209,7 +214,7 @@ public void DeleteCollection(ScriptableObjectCollection collection)
209214

210215
#if UNITY_EDITOR
211216
for (int i = collection.Items.Count - 1; i >= 0; i--)
212-
UnityEditor.AssetDatabase.DeleteAsset(UnityEditor.AssetDatabase.GetAssetPath(collection.Items[i]));
217+
AssetDatabase.DeleteAsset(AssetDatabase.GetAssetPath(collection.Items[i]));
213218
#endif
214219
ObjectUtility.SetDirty(this);
215220
}
@@ -245,7 +250,9 @@ public void ReloadCollections()
245250
}
246251

247252
if (changed)
253+
{
248254
ObjectUtility.SetDirty(this);
255+
}
249256
#endif
250257
}
251258

0 commit comments

Comments
 (0)