freeExec, он не умеет в Dictionary (на сколько я понял)
И этот SO нужно тоже как-то инстансить, чтобы прочитать из него по ключу, иначе как до него достучаться ?
Только через LoadResource видел, но не уверен что это стандартный паттерн
alex4answ, Что значит не умеет, тут не нужно уметь, тут нужно переменную нужного типа объявить и заполнить словарь нужными данными.
Либо у тебя уже есть ссылка на SO либо грузишь из ресурсов, какие тут ещё варианты?
freeExec,
1. Я создал SO, в нем объявил свойство с типом Dictionary, в редакторе нет возможности заполнить словарь, Возможно нужно вместо Dictionary использовать сериализуемый класс и пихать его в List
public class WeaponMap : ScriptableObject
{
[SerializeField]
private Dictionary<string, WeaponData> map = new Dictionary<string, WeaponData>();
public WeaponData Get(string name) => map[name];
public void Set(string name, WeaponData data)
{
map.Add(name, data);
}
}
Либо, еще вариант, сделать для инспектора просто List, а в Awake собирать из него HashMap, хм..
2. Т.е. для того, чтобы обратиться к этой мапке, мне все равно нужно создать какой-то GO и передать туда ссылку, либо в каком-нибудь классе грузить ее из ресурсов?
Введи поле ID для своего ScriptableObjectа, убедись, что оно будет уникальным для каждого орудия и записывай его в PlayerPrefs как обычный string. По ID уже сможешь найти оригинал.
А как найти оригинал не подгружая все ассеты данного SO?
Я как раз хочу избежать ручной загрузки десятка ассетов, потому создаю словарь, который заполню из редактора (получается будет хранить указатели, что дешевле), а дальше уже со словарем работать
Наверное имелось в виду автоматической загрузки. Не вижу в этом ничего плохого, может это и увеличит на несколько миллисекунд экран загрузки в игре, но избавит от потенциальных дублей, null полей и прочих битых ссылок в Dictionary/Hashmap.
Если так уж хочется хранить именно ссылки - то можно создать ScriptableObject контейнер для целевых и хранить все там, а на сцене держать только ссылку на него.