Найдите все экземпляры объекта Scriptable и сохраните его в списке - PullRequest
0 голосов
/ 16 мая 2019

У меня есть один объект Scriptable Character и, скажем, n экземпляров этого Character.

Character.cs

public class Character : UnityEngine.ScriptableObject
{
...
}
// Let us say that there are 100 instances of this Class

Теперь я создаю еще один класс

CharacterList.cs

public class CharacterList
{
     List<Character> characterList = new List<Character>();
     FindObjectsOfType<Character>();

     // I also tried to write Character[] character = FindObjectsOfType<Character>() but that did not work.
// Now How do I put all the objects found in the List?
}

Я хочу создать Class, а не Monobehaviour. Просто простой класс с именем CharacterList, и там я хочу List символов, которые будут содержать все экземпляры Character Scriptable Object. Следовательно, должно быть n символов в CharacterList

Ответы [ 2 ]

1 голос
/ 16 мая 2019

(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();

Не забудьте также очистить список в начале игры(или когда вы считаете, что это необходимо).

0 голосов
/ 16 мая 2019

В CharacterList.cs Класс:

object[] characters = FindObjectsOfType(typeof(Character));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...