Как мне правильно использовать скриптовые объекты для создания элементов во время выполнения?

#c# #unity3d #scriptable-object

#c# #unity3d #scriptable-object

Вопрос:

Я относительно новичок в разработке игр, но я потратил около дюжины часов на изучение того, как использовать скриптовые объекты (SO).

Я не знаю, сколько элементов будет в моей игре, поэтому я хотел бы максимально автоматизировать процесс создания элементов, чтобы избежать человеческих ошибок. Я читал, что для повышения производительности полезно хранить информацию в одном месте с использованием скриптовых объектов:

ItemData.cs

 public class ItemData : ScriptableObject
{
    public int itemID;
    new public string name;
    public Sprite sprite = null;
}
  

Далее, у меня есть GameObject, который загружает все ItemData в словарь при пробуждении:

ItemDatabase.cs

 private Dictionary<int, ItemData> itemDB = new Dictionary<int, ItemData>();

void Awake()
{
    LoadItems();
}

private void LoadItems()
{
    //Load all itemData
    ItemData[] itemData = Resources.LoadAll<ItemData>(itemDirectoryPath);

    for(int i = 0; i < itemData.Length; i  )
    {
        //Set sprite of itemData, to avoid doing it manually
        itemData[i] = SetSprite(itemData[i]);

        //Add itemData to dataBase
        itemDB[itemData[i].itemID] = itemData[i];
    }
}
  

Наконец, у меня есть функция для создания GameObject указанного ItemId во время выполнения:

 //Create new gameobject at location
public void SpawnItem(int itemID, float x, float y)
{
    //Get itemData
    ItemData itemData = getItemData(itemID);
    //Create new gameObject
    GameObject gameObject = new GameObject();
    //Set name of gameObject, add Item Script, and set position
    gameObject.name = itemData.name;
    gameObject.AddComponent<Item>().itemData = itemData;
    gameObject.transform.position = new Vector3(x, y, 0);
}
  

Вопросы:

  1. Считается ли «хакерским» создание элемента во время выполнения, как показано в SpawnItem выше? Должен ли я вручную создавать каждый элемент как сборный?
  2. Если использование «Ресурсов» считается плохой практикой, есть ли лучшее решение, кроме ручного перетаскивания каждого элемента в скрипт ItemDatabase?

Комментарии:

1. Вы используете SpawnItem для создания префабов в редакторе или используете его для создания элементов во время игры? Тот же вопрос для ItemDatabase. Использует ли это ресурсы. Загрузка в редакторе или в игровом процессе?

2. 1. Неплохо бы подготовить эти порождения в виде сборных файлов. Единственная плохая вещь сейчас, imo, заключается в том, что вы тратите процессор во время выполнения на вещи, которые уже известны во время редактирования (при условии, что spawn означает spawn во время выполнения). 2. Ресурсы не загружаются предварительно в память, они считываются с диска (поэтому, если данные большие, это может привести к задержке). Ссылка непосредственно в инспекторе означает, что ссылочный ресурс будет предварительно загружен в память при загрузке ссылочной сцены / сборного элемента. Инспектор / ресурсы — это компромисс между скоростью / памятью. 3. ScriptableObject подходит для кода / данных, которые вы хотите назначать / перетаскивать в инспекторе.

3. @ThomasFinch Я использую SpawnItems для создания предметов во время игры. Я использую ресурсы. Загружается в ItemDatabase во время игры, но это происходит только один раз при запуске программы.

4. @Nikaas Большое вам спасибо за объяснение! Причина, по которой я пытался генерировать элементы программно, заключалась в том, чтобы избежать человеческих ошибок, а также потому, что я хотел, чтобы пользователи могли изменять свои собственные элементы (которые не были бы известны во время редактирования). Полагаю, я слишком рано нахожусь в разработке, чтобы думать об этом.