public bool TryGetCollectionFromItemType(Type targetType, out ScriptableObjectCollection scriptableObjectCollection) { List <ScriptableObjectCollection> possibleCollections = new List <ScriptableObjectCollection>(); for (int i = 0; i < collections.Count; i++) { ScriptableObjectCollection collection = collections[i]; if (collection.GetItemType() == targetType || collection.GetItemType().IsAssignableFrom(targetType)) { possibleCollections.Add(collection); } } if (possibleCollections.Count == 1) { scriptableObjectCollection = possibleCollections.First(); return(true); } scriptableObjectCollection = null; return(false); }
public static void GenerateStaticCollectionScript(ScriptableObjectCollection collection) { CollectionsRegistry.Instance.ValidateGUIDs(); if (!CanGenerateStaticFile(collection, out string errorMessage)) { Debug.LogError(errorMessage); return; } SerializedObject collectionSerializedObject = new SerializedObject(collection); string fileName = collectionSerializedObject.FindProperty("generatedStaticClassFileName").stringValue; string nameSpace = collectionSerializedObject.FindProperty("generateStaticFileNamespace").stringValue; string finalFolder = collectionSerializedObject.FindProperty("generatedFileLocationPath").stringValue; bool writeAsPartial = collectionSerializedObject.FindProperty("generateAsPartialClass").boolValue; AssetDatabaseUtils.CreatePathIfDontExist(finalFolder); using (StreamWriter writer = new StreamWriter(Path.Combine(finalFolder, $"{fileName}.cs"))) { int indentation = 0; List <string> directives = new List <string>(); directives.Add(typeof(CollectionsRegistry).Namespace); directives.Add(collection.GetType().Namespace); directives.Add(typeof(List <>).Namespace); directives.Add("System.Linq"); directives.AddRange(GetCollectionDirectives(collection)); string className = collection.GetItemType().Name; if (!writeAsPartial) { className = fileName; } AppendHeader(writer, ref indentation, nameSpace, "", className, writeAsPartial, false, directives.Distinct().ToArray() ); WriteDirectAccessCollectionStatic(collection, writer, ref indentation); indentation--; AppendFooter(writer, ref indentation, nameSpace); } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); }
public List <ScriptableObjectCollection> GetCollectionsByItemType(Type targetCollectionItemType) { List <ScriptableObjectCollection> result = new List <ScriptableObjectCollection>(); for (int i = 0; i < collections.Count; i++) { ScriptableObjectCollection scriptableObjectCollection = collections[i]; if (scriptableObjectCollection.GetItemType().IsAssignableFrom(targetCollectionItemType)) { result.Add(scriptableObjectCollection); } } return(result); }
public List <ScriptableObjectCollectionItem> GetAllCollectionItemsOfType(Type itemType) { List <ScriptableObjectCollectionItem> results = new List <ScriptableObjectCollectionItem>(); for (int i = 0; i < collections.Count; i++) { ScriptableObjectCollection scriptableObjectCollection = collections[i]; if (!scriptableObjectCollection.GetItemType().IsAssignableFrom(itemType)) { continue; } results.AddRange(scriptableObjectCollection.Items); } return(results); }
private static void WriteDirectAccessCollectionStatic(ScriptableObjectCollection collection, StreamWriter writer, ref int indentation) { string cachedValuesName = "values"; AppendLine(writer, indentation, $"private static {collection.GetType().Name} {cachedValuesName};"); AppendLine(writer, indentation); for (int i = 0; i < collection.Items.Count; i++) { ScriptableObjectCollectionItem collectionItem = collection.Items[i]; AppendLine(writer, indentation, $"private static {collectionItem.GetType().Name} {collectionItem.name.Sanitize().FirstToLower()};"); } AppendLine(writer, indentation); string valuesName = $"Values"; AppendLine(writer, indentation, $"public static {collection.GetType().Name} {valuesName}"); AppendLine(writer, indentation, "{"); indentation++; AppendLine(writer, indentation, "get"); AppendLine(writer, indentation, "{"); indentation++; AppendLine(writer, indentation, $"if ({cachedValuesName} == null)"); indentation++; AppendLine(writer, indentation, $"{cachedValuesName} = ({collection.GetType()})CollectionsRegistry.Instance.GetCollectionByGUID(\"{collection.GUID}\");"); indentation--; AppendLine(writer, indentation, $"return {cachedValuesName};"); indentation--; AppendLine(writer, indentation, "}"); indentation--; AppendLine(writer, indentation, "}"); AppendLine(writer, indentation); AppendLine(writer, indentation); for (int i = 0; i < collection.Items.Count; i++) { ScriptableObjectCollectionItem collectionItem = collection.Items[i]; string collectionNameFirstUpper = collectionItem.name.Sanitize().FirstToUpper(); string privateStaticName = collectionItem.name.Sanitize().FirstToLower(); AppendLine(writer, indentation, $"public static {collectionItem.GetType().Name} {collectionNameFirstUpper}"); AppendLine(writer, indentation, "{"); indentation++; AppendLine(writer, indentation, "get"); AppendLine(writer, indentation, "{"); indentation++; AppendLine(writer, indentation, $"if ({privateStaticName} == null)"); indentation++; AppendLine(writer, indentation, $"{privateStaticName} = ({collectionItem.GetType().Name}){valuesName}.GetItemByGUID(\"{collectionItem.GUID}\");"); indentation--; AppendLine(writer, indentation, $"return {privateStaticName};"); indentation--; AppendLine(writer, indentation, "}"); indentation--; AppendLine(writer, indentation, "}"); AppendLine(writer, indentation); } AppendLine(writer, indentation, $"public static IEnumerable<T> GetValues<T>() where T : {collection.GetItemType().Name}"); AppendLine(writer, indentation, "{"); indentation++; AppendLine(writer, indentation, $"return Values.Where(item => item is T).Cast<T>();"); indentation--; AppendLine(writer, indentation, "}"); AppendLine(writer, indentation); }
private static bool CanGenerateStaticFile(ScriptableObjectCollection collection, out string errorMessage) { List <ScriptableObjectCollection> collectionsOfSameType = CollectionsRegistry.Instance.GetCollectionsByItemType(collection.GetItemType()); if (collectionsOfSameType.Count > 1) { for (int i = 0; i < collectionsOfSameType.Count; i++) { ScriptableObjectCollection collectionA = collectionsOfSameType[i]; SerializedObject collectionASerializedObject = new SerializedObject(collectionA); for (int j = 0; j < collectionsOfSameType.Count; j++) { if (i == j) { continue; } ScriptableObjectCollection collectionB = collectionsOfSameType[j]; SerializedObject collectionBSerializedObject = new SerializedObject(collectionB); if (collectionASerializedObject.FindProperty("generatedStaticClassFileName").stringValue.Equals(collectionBSerializedObject.FindProperty("generatedStaticClassFileName").stringValue) && collectionASerializedObject.FindProperty("generateStaticFileNamespace").stringValue.Equals(collectionASerializedObject.FindProperty("generateStaticFileNamespace").stringValue)) { errorMessage = $"Two collections ({collectionA.name} and {collectionB.name}) with the same name and namespace already exist, please use custom ones"; return(false); } } } } errorMessage = String.Empty; return(true); }