(SO = Scriptable Object) У нас есть 2 варианта здесь.В зависимости от того, сериализуются или создаются эти SO во время воспроизведения.
Вариант 1 - сериализуются SO
Более простой вариант - создать еще один монобихвичный объект или объект сценариев и поместить в него все экземпляры.
public class CharacterList : ScriptableObject
{
public Character[] characterList;
}
Другой способ потребует от вас поиска SO в папке ресурсов с помощью сценариев с использованием AssetDatabase.FindAssets и AssetDatabase.LoadAssetAtPath .
В этом случае код будет выглядеть следующим образом:
public class CharacterList
{
List<Character> characterList = new List<Character>();
void PopulateList()
{
string[] assetNames = AssetDatabase.FindAssets("Your_Filter", new[] { "Assets/YourFolder" });
characterList.Clear();
foreach (string SOName in assetNames)
{
var SOpath = AssetDatabase.GUIDToAssetPath(SOName);
var character = AssetDatabase.LoadAssetAtPath<Character>(SOpath);
characterList.Add(character);
}
}
}
Как их найти.
VIA NAME
Вы можете заменить"Your_Filter", чтобы получить ваш SO.В этом случае SO должен разделить друг с другом общность их имен.
VIA FOLDER
Вы можете заменить новый [] {"Assets / YourFolder"} своей папкой.В этом случае все SO должны находиться в одной и той же папке, и эта папка должна содержать ТОЛЬКО эти SO.
Вариант 2 - создаются экземпляры SO
В этом случае я бы предложил реализовать некоторый видfactory.
Вместо создания SO с обычным кодом:
ScriptableObject.CreateInstance<YourSo>();
Я бы использовал фабрику Создать экземпляр и сохранить его.Так что у вас будет что-то вроде этого.
public static class CharacterGenerator
{
static List<Character> characterList = new List<Character>();
public static Character CreateCharacter()
{
var character = ScriptableObject.CreateInstance<YourSo>();
characterList.Add(character);
return character;
}
}
Поэтому, когда вы захотите создать нового персонажа, вы будете вызывать CharacterGenerator.CreateCharacter();
Не забудьте также очистить список в начале игры(или когда вы считаете, что это необходимо).