Skip to content

Commit 2e049e5

Browse files
committed
add: Static access to collection values
1 parent 7973f15 commit 2e049e5

4 files changed

Lines changed: 34 additions & 24 deletions

File tree

Scripts/Editor/Utils/CodeGenerationUtility.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ private static string[] GetCollectionDirectives(ScriptableObjectCollection colle
239239
private static void WriteTryGetAccessCollectionStatic(ScriptableObjectCollection collection, StreamWriter writer,
240240
ref int indentation)
241241
{
242-
string cachedValuesName = $"collection";
243-
string valuesName = $"Collection";
242+
string cachedValuesName = $"values";
243+
string valuesName = $"Values";
244244
string tryGetValuesName = $"TryGet{valuesName}";
245245

246246
AppendLine(writer, indentation, $"private static {collection.GetType().Name} {cachedValuesName};");
@@ -336,7 +336,7 @@ private static void WriteDirectAccessCollectionStatic(ScriptableObjectCollection
336336
{
337337
bool isGeneratingCustomStaticFile = ScriptableObjectCollectionSettings.Instance.IsGeneratingCustomStaticFile(collection);
338338

339-
string cachedValuesName = "collection";
339+
string cachedValuesName = "values";
340340
AppendLine(writer, indentation, $"private static {collection.GetType().Name} {cachedValuesName};");
341341

342342
for (int i = 0; i < collection.Items.Count; i++)
@@ -348,12 +348,12 @@ private static void WriteDirectAccessCollectionStatic(ScriptableObjectCollection
348348

349349
AppendLine(writer, indentation);
350350

351-
string valuesName = $"Collection";
351+
string valuesName = $"Values";
352352

353353
if(!isGeneratingCustomStaticFile)
354354
{
355355
AppendLine(writer, indentation,
356-
$"public new static {collection.GetType().Name} {valuesName}");
356+
$"public static {collection.GetType().Name} {valuesName}");
357357
}
358358
else
359359
{

Scripts/Runtime/CollectableScriptableObject.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public string GUID
1919
[SerializeField, HideInInspector]
2020
private ScriptableObjectCollection collection;
2121
public ScriptableObjectCollection Collection => collection;
22-
22+
2323
public void SetCollection(ScriptableObjectCollection collection)
2424
{
2525
this.collection = collection;

Scripts/Runtime/CollectionsRegistry.cs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ private void ValidateCurrentGUIDs()
8686
}
8787
}
8888

89+
8990
public ScriptableObjectCollection GetCollectionByGUID(string guid)
9091
{
9192
for (int i = 0; i < collections.Count; i++)
@@ -113,19 +114,32 @@ public bool TryGetCollection<T>(out T resultCollection) where T: ScriptableObjec
113114
return false;
114115
}
115116

116-
117-
public bool TryGetCollectionForType(Type targetCollectionType, out ScriptableObjectCollection scriptableObjectCollection)
117+
118+
public bool TryGetCollectionForType(Type targetType,
119+
out ScriptableObjectCollection scriptableObjectCollection)
118120
{
119121
for (int i = 0; i < collections.Count; i++)
120122
{
121123
ScriptableObjectCollection collection = collections[i];
122-
if (collection.GetCollectionType() == targetCollectionType
123-
|| targetCollectionType.BaseType == collection.GetCollectionType())
124+
if(collection.GetCollectionType() == targetType
125+
|| targetType.BaseType == collection.GetCollectionType())
124126
{
125127
scriptableObjectCollection = collection;
126128
return true;
127129
}
128130
}
131+
132+
scriptableObjectCollection = null;
133+
return false;
134+
}
135+
136+
public bool TryGetCollectionForType<TargetType>(out ScriptableObjectCollection<TargetType> scriptableObjectCollection) where TargetType : CollectableScriptableObject
137+
{
138+
if (TryGetCollectionForType(typeof(TargetType), out ScriptableObjectCollection resultCollection))
139+
{
140+
scriptableObjectCollection = (ScriptableObjectCollection<TargetType>) resultCollection;
141+
return true;
142+
}
129143

130144
scriptableObjectCollection = null;
131145
return false;
@@ -247,6 +261,7 @@ public void PrepareForEditorMode()
247261
}
248262

249263
#endif
264+
250265
}
251266
}
252267

Scripts/Runtime/ScriptableObjectCollection.cs

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -377,21 +377,20 @@ internal void PrepareForEditorMode()
377377
public class ScriptableObjectCollection<ObjectType> : ScriptableObjectCollection, IList<ObjectType>
378378
where ObjectType : CollectableScriptableObject
379379
{
380-
381-
[NonSerialized]
382-
private bool isReadyOnlyListDirty = true;
383-
384-
private IReadOnlyList<ObjectType> readOnlyList = new List<ObjectType>();
385-
public new IReadOnlyList<ObjectType> Items
380+
private static ScriptableObjectCollection<ObjectType> instance;
381+
public static ScriptableObjectCollection<ObjectType> Values
386382
{
387383
get
388384
{
389-
if (isReadyOnlyListDirty)
385+
if (instance == null)
390386
{
391-
readOnlyList = items.Cast<ObjectType>().ToList().AsReadOnly();
392-
isReadyOnlyListDirty = false;
387+
if (CollectionsRegistry.Instance.TryGetCollectionForType(out ScriptableObjectCollection<ObjectType> result))
388+
{
389+
instance = result;
390+
}
393391
}
394-
return readOnlyList;
392+
393+
return instance;
395394
}
396395
}
397396

@@ -428,13 +427,11 @@ public ObjectType GetCollectableByGUID(string targetGUID)
428427
public void Add(ObjectType item)
429428
{
430429
base.Add(item);
431-
isReadyOnlyListDirty = true;
432430
}
433431

434432
public ObjectType Add(Type itemType = null)
435433
{
436434
ObjectType collectableScriptableObject = base.Add(itemType) as ObjectType;
437-
isReadyOnlyListDirty = true;
438435
return collectableScriptableObject;
439436
}
440437

@@ -456,13 +453,11 @@ public int IndexOf(ObjectType item)
456453
public void Insert(int index, ObjectType item)
457454
{
458455
base.Insert(index, item);
459-
isReadyOnlyListDirty = true;
460456
}
461457

462458
public bool Remove(ObjectType item)
463459
{
464460
bool remove = base.Remove(item);
465-
isReadyOnlyListDirty = true;
466461
return remove;
467462
}
468463

0 commit comments

Comments
 (0)