Skip to content

Commit edfd051

Browse files
authored
Merge pull request #25 from brunomikoski/feature/runtime-changes-to-collection
fix: runtime collection changes
2 parents ab51393 + 977975f commit edfd051

File tree

8 files changed

+153
-63
lines changed

8 files changed

+153
-63
lines changed

CHANGELOG.MD

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

77

8+
## [1.2.2]
9+
## Changed
10+
- Fixed issue with the settings menu been displayed wrong
11+
- Fixed an issue while converting numbers to literal numbers would not deal properly with initial special characters
12+
13+
## Added
14+
- Added system to be able to Add/Remove items from the collection at runtime (Like loading new items from addressables)
15+
- Added runtime / editor time fix to deal with dynamicly changed collections
16+
817
## [1.2.1]
918
## Changed
1019
- Fixed issues with indirect references
@@ -112,6 +121,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
112121
## [Unreleased]
113122
- Add a setup wizzard for first time settings creation
114123

124+
[1.2.2]: https://github.com/badawe/ScriptableObjectCollection/releases/tag/v1.2.2
115125
[1.2.1]: https://github.com/badawe/ScriptableObjectCollection/releases/tag/v1.2.1
116126
[1.2.0]: https://github.com/badawe/ScriptableObjectCollection/releases/tag/v1.2.0
117127
[1.1.9]: https://github.com/badawe/ScriptableObjectCollection/releases/tag/v1.1.9

Scripts/Editor/ScriptableObjectCollectionCustomEditor.cs

Lines changed: 52 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -296,78 +296,77 @@ private void DrawSettings(ScriptableObjectCollection collection)
296296
{
297297
using (new GUILayout.VerticalScope("Box"))
298298
{
299-
showSettings = EditorGUILayout.BeginFoldoutHeaderGroup(showSettings, "Settings", EditorStyles.foldoutHeader);
299+
EditorGUI.indentLevel++;
300+
showSettings = EditorGUILayout.Foldout(showSettings, "Settings", true);
301+
EditorGUI.indentLevel--;
302+
303+
if (showSettings)
300304
{
301-
if (showSettings)
305+
EditorGUI.indentLevel++;
306+
307+
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
302308
{
303-
EditorGUI.indentLevel++;
309+
bool isAutomaticallyLoaded = EditorGUILayout.ToggleLeft("Automatically Loaded",
310+
ScriptableObjectCollectionSettings.Instance.IsCollectionAutomaticallyLoaded(
311+
collection));
304312

305-
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
313+
if (changeCheck.changed)
306314
{
307-
bool isAutomaticallyLoaded = EditorGUILayout.ToggleLeft("Automatically Loaded",
308-
ScriptableObjectCollectionSettings.Instance.IsCollectionAutomaticallyLoaded(
315+
ScriptableObjectCollectionSettings.Instance.SetCollectionAutomaticallyLoaded(
316+
collection,
317+
isAutomaticallyLoaded);
318+
}
319+
}
320+
321+
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
322+
{
323+
GeneratedStaticFileType staticCodeGeneratorType =
324+
(GeneratedStaticFileType) EditorGUILayout.EnumPopup("Static File Generator Type",
325+
ScriptableObjectCollectionSettings.Instance.GetStaticFileTypeForCollection(
309326
collection));
310327

311-
if (changeCheck.changed)
312-
{
313-
ScriptableObjectCollectionSettings.Instance.SetCollectionAutomaticallyLoaded(
314-
collection,
315-
isAutomaticallyLoaded);
316-
}
328+
if (changeCheck.changed)
329+
{
330+
ScriptableObjectCollectionSettings.Instance.SetStaticFileGeneratorTypeForCollection(
331+
collection,
332+
staticCodeGeneratorType);
317333
}
334+
}
318335

319-
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
336+
bool overwriteStaticFileLocation = false;
337+
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
338+
{
339+
overwriteStaticFileLocation = EditorGUILayout.ToggleLeft(
340+
"Overwrite Static File Location",
341+
ScriptableObjectCollectionSettings.Instance.IsOverridingStaticFileLocation(collection));
342+
if (changeCheck.changed)
320343
{
321-
GeneratedStaticFileType staticCodeGeneratorType =
322-
(GeneratedStaticFileType) EditorGUILayout.EnumPopup("Static File Generator Type",
323-
ScriptableObjectCollectionSettings.Instance.GetStaticFileTypeForCollection(
324-
collection));
325-
326-
if (changeCheck.changed)
327-
{
328-
ScriptableObjectCollectionSettings.Instance.SetStaticFileGeneratorTypeForCollection(
329-
collection,
330-
staticCodeGeneratorType);
331-
}
344+
ScriptableObjectCollectionSettings.Instance.SetOverridingStaticFileLocation(
345+
collection, overwriteStaticFileLocation);
332346
}
347+
}
333348

334-
bool overwriteStaticFileLocation = false;
349+
if (overwriteStaticFileLocation)
350+
{
351+
DefaultAsset targetFolder = AssetDatabase.LoadAssetAtPath<DefaultAsset>(
352+
ScriptableObjectCollectionSettings.Instance.GetStaticFileFolderForCollection(
353+
collection));
335354
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
336355
{
337-
overwriteStaticFileLocation = EditorGUILayout.ToggleLeft(
338-
"Overwrite Static File Location",
339-
ScriptableObjectCollectionSettings.Instance.IsOverridingStaticFileLocation(collection));
340-
if (changeCheck.changed)
341-
{
342-
ScriptableObjectCollectionSettings.Instance.SetOverridingStaticFileLocation(
343-
collection, overwriteStaticFileLocation);
344-
}
345-
}
356+
targetFolder = (DefaultAsset) EditorGUILayout.ObjectField("Target Folder",
357+
targetFolder,
358+
typeof(DefaultAsset), false);
346359

347-
if (overwriteStaticFileLocation)
348-
{
349-
DefaultAsset targetFolder = AssetDatabase.LoadAssetAtPath<DefaultAsset>(
350-
ScriptableObjectCollectionSettings.Instance.GetStaticFileFolderForCollection(
351-
collection));
352-
using (EditorGUI.ChangeCheckScope changeCheck = new EditorGUI.ChangeCheckScope())
360+
if (changeCheck.changed)
353361
{
354-
targetFolder = (DefaultAsset) EditorGUILayout.ObjectField("Target Folder",
355-
targetFolder,
356-
typeof(DefaultAsset), false);
357-
358-
if (changeCheck.changed)
359-
{
360-
ScriptableObjectCollectionSettings.Instance.SetStaticFileFolderForCollection(
361-
collection,
362-
AssetDatabase.GetAssetPath(targetFolder));
363-
}
362+
ScriptableObjectCollectionSettings.Instance.SetStaticFileFolderForCollection(
363+
collection,
364+
AssetDatabase.GetAssetPath(targetFolder));
364365
}
365366
}
366-
367-
EditorGUI.indentLevel--;
368367
}
369368

370-
EditorGUILayout.EndFoldoutHeaderGroup();
369+
EditorGUI.indentLevel--;
371370
}
372371
}
373372
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
#if UNITY_EDITOR
2+
using UnityEditor;
3+
4+
namespace BrunoMikoski.ScriptableObjectCollections
5+
{
6+
[InitializeOnLoad]
7+
public static class CollectionsEditorBehaviour
8+
{
9+
static CollectionsEditorBehaviour()
10+
{
11+
EditorApplication.playModeStateChanged -= OnPlayModeChanged;
12+
EditorApplication.playModeStateChanged += OnPlayModeChanged;
13+
}
14+
15+
private static void OnPlayModeChanged(PlayModeStateChange playModeState)
16+
{
17+
if (playModeState == PlayModeStateChange.EnteredPlayMode)
18+
CollectionsRegistry.Instance.PrepareForPlayMode();
19+
else if(playModeState == PlayModeStateChange.ExitingPlayMode)
20+
CollectionsRegistry.Instance.PrepareForEditorMode();
21+
}
22+
}
23+
}
24+
#endif

Scripts/Runtime/CollectionsEditorBehaviour.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/Runtime/CollectionsRegistry.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,6 +214,21 @@ public void PostBuildProcess()
214214
{
215215
ReloadCollections();
216216
}
217+
218+
#if UNITY_EDITOR
219+
public void PrepareForPlayMode()
220+
{
221+
for (int i = 0; i < collections.Count; i++)
222+
collections[i].PrepareForPlayMode();
223+
}
224+
225+
public void PrepareForEditorMode()
226+
{
227+
for (int i = 0; i < collections.Count; i++)
228+
collections[i].PrepareForEditorMode();
229+
}
230+
231+
#endif
217232
}
218233
}
219234

Scripts/Runtime/Extensions/StringExtensions.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public static string Sanitize(this string input)
3737

3838
public static string StartingNumbersToWords(this string input)
3939
{
40+
input = INVALID_CHARS_RGX.Replace(input, "");
4041
StringBuilder targetNumberString = new StringBuilder();
4142
int endIndex = 0;
4243
bool needToConvert = false;
@@ -50,7 +51,7 @@ public static string StartingNumbersToWords(this string input)
5051
}
5152
else
5253
{
53-
endIndex = i - 1;
54+
endIndex = i;
5455
break;
5556
}
5657
}

Scripts/Runtime/ScriptableObjectCollection.cs

Lines changed: 46 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,12 @@ public string GUID
2121
}
2222

2323
[SerializeField]
24-
private List<CollectableScriptableObject> items = new List<CollectableScriptableObject>();
25-
26-
private bool isReadyListDirty = true;
24+
private List<CollectableScriptableObject> editorSerializedItems;
25+
26+
[SerializeField]
27+
protected List<CollectableScriptableObject> items = new List<CollectableScriptableObject>();
28+
29+
2730
private IReadOnlyList<CollectableScriptableObject> readOnlyList = new List<CollectableScriptableObject>();
2831
public IReadOnlyList<CollectableScriptableObject> Items
2932
{
@@ -34,6 +37,8 @@ public IReadOnlyList<CollectableScriptableObject> Items
3437
return readOnlyList;
3538
}
3639
}
40+
41+
protected bool isReadyListDirty = true;
3742

3843
private void SyncGUID()
3944
{
@@ -111,6 +116,7 @@ public bool Add(CollectableScriptableObject item)
111116
return false;
112117

113118
items.Add(item);
119+
114120
item.SetCollection(this);
115121
ObjectUtility.SetDirty(this);
116122
isReadyListDirty = true;
@@ -173,6 +179,13 @@ public Type GetGenericEnumType()
173179
return null;
174180
}
175181

182+
public virtual void Sort()
183+
{
184+
items.Sort();
185+
isReadyListDirty = true;
186+
ObjectUtility.SetDirty(this);
187+
}
188+
176189
public void Clear()
177190
{
178191
items.Clear();
@@ -254,7 +267,11 @@ public void Swap(int targetIndex, int newIndex)
254267

255268
public void ClearBadItems()
256269
{
257-
items = items.Where(o => o != null).Distinct().ToList();
270+
for (int i = items.Count - 1; i >= 0; i--)
271+
{
272+
if (items[i].IsNull() || items[i] == null)
273+
items.RemoveAt(i);
274+
}
258275
ObjectUtility.SetDirty(this);
259276
isReadyListDirty = true;
260277
}
@@ -276,9 +293,9 @@ public void ValidateGUID()
276293
if (items[i] == items[j])
277294
continue;
278295

279-
if (string.Equals(items[i].GUID, Items[j].GUID, StringComparison.Ordinal))
296+
if (string.Equals(items[i].GUID, items[j].GUID, StringComparison.Ordinal))
280297
{
281-
Items[j].GenerateNewGUID();
298+
items[j].GenerateNewGUID();
282299
Debug.LogWarning($"Found duplicated GUID, please regenerate code of collection {this.name}",
283300
this);
284301
}
@@ -335,18 +352,39 @@ public bool TryGetCollectableByGUID(string itemGUID, out CollectableScriptableOb
335352
collectableScriptableObject = null;
336353
return false;
337354
}
355+
356+
internal void PrepareForPlayMode()
357+
{
358+
editorSerializedItems = new List<CollectableScriptableObject>(items);
359+
}
360+
361+
internal void PrepareForEditorMode()
362+
{
363+
items = new List<CollectableScriptableObject>(editorSerializedItems);
364+
ObjectUtility.SetDirty(this);
365+
}
338366
}
339367

340368
public class ScriptableObjectCollection<ObjectType> : ScriptableObjectCollection, IList<ObjectType>
341369
where ObjectType : CollectableScriptableObject
342370
{
371+
private IReadOnlyList<ObjectType> readOnlyList = new List<ObjectType>();
372+
public new IReadOnlyList<ObjectType> Items
373+
{
374+
get
375+
{
376+
if (isReadyListDirty)
377+
readOnlyList = items.Cast<ObjectType>().ToList().AsReadOnly();
378+
return readOnlyList;
379+
}
380+
}
381+
343382
public new ObjectType this[int index]
344383
{
345384
get => (ObjectType)base[index];
346385
set => base[index] = value;
347386
}
348387

349-
350388
public ObjectType GetCollectableByGUID(string targetGUID)
351389
{
352390
for (int i = 0; i < Items.Count; i++)
@@ -358,7 +396,7 @@ public ObjectType GetCollectableByGUID(string targetGUID)
358396

359397
return null;
360398
}
361-
399+
362400
public void Add(ObjectType item)
363401
{
364402
base.Add(item);

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "com.brunomikoski.scriptableobjectcollection",
33
"displayName": "Scriptable Object Collection",
4-
"version": "1.2.1",
4+
"version": "1.2.2",
55
"unity": "2018.4",
66
"description": "Scriptable Object Collection",
77
"keywords": [

0 commit comments

Comments
 (0)