#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);
}
Вопросы:
- Считается ли «хакерским» создание элемента во время выполнения, как показано в SpawnItem выше? Должен ли я вручную создавать каждый элемент как сборный?
- Если использование «Ресурсов» считается плохой практикой, есть ли лучшее решение, кроме ручного перетаскивания каждого элемента в скрипт ItemDatabase?
Комментарии:
1. Вы используете SpawnItem для создания префабов в редакторе или используете его для создания элементов во время игры? Тот же вопрос для ItemDatabase. Использует ли это ресурсы. Загрузка в редакторе или в игровом процессе?
2. 1. Неплохо бы подготовить эти порождения в виде сборных файлов. Единственная плохая вещь сейчас, imo, заключается в том, что вы тратите процессор во время выполнения на вещи, которые уже известны во время редактирования (при условии, что spawn означает spawn во время выполнения). 2. Ресурсы не загружаются предварительно в память, они считываются с диска (поэтому, если данные большие, это может привести к задержке). Ссылка непосредственно в инспекторе означает, что ссылочный ресурс будет предварительно загружен в память при загрузке ссылочной сцены / сборного элемента. Инспектор / ресурсы — это компромисс между скоростью / памятью. 3. ScriptableObject подходит для кода / данных, которые вы хотите назначать / перетаскивать в инспекторе.
3. @ThomasFinch Я использую SpawnItems для создания предметов во время игры. Я использую ресурсы. Загружается в ItemDatabase во время игры, но это происходит только один раз при запуске программы.
4. @Nikaas Большое вам спасибо за объяснение! Причина, по которой я пытался генерировать элементы программно, заключалась в том, чтобы избежать человеческих ошибок, а также потому, что я хотел, чтобы пользователи могли изменять свои собственные элементы (которые не были бы известны во время редактирования). Полагаю, я слишком рано нахожусь в разработке, чтобы думать об этом.