Войти
UnityФорумОбщее

Unity (проблемы, решения, перспективы) (123 стр)

Страницы: 1118 119 120 121 122 123
#1830
23:40, 22 мая 2020

> Краткий пересказ - юнити гавно.
Собака лает ― караван идёт.


#1831
(Правка: 23 мая 2020, 0:00) 23:40, 22 мая 2020

Пробую сделать некий скриптовый ассет. У него имеется несколько настроек - они глобальные для проекта. Хочется, чтобы всё выглядело и работало примерно так:

1. Добавляем ассет в проект.
2. В окне Project Settings появляется дополнительный пункт с настройками для этого ассета. Меняем там что хочется.
3. В коде вызываем какой-нибудь статический метод из подключённого ассета.
4. Метод делает что надо в соответствии с настройками, которые он должен откуда-то прочитать.

― кроме этого чтобы никаких лишних промежуточных действий со стороны пользователя.

Пытаюсь сообразить, где настройки хранить и как их читать, чтобы однажды настроенное в редакторе работало ещё и в билдах.

Допустим, если хранить настройки в ScriptableObject где-то в проекте, то в редакторе мы этот объект создадим/найдём и сможем редактировать. Но как потом ассет в рантайме его найдёт, если на объект с настройками ниоткуда нет ссылок? Объект даже в билд не попадёт.

#1832
17:13, 23 мая 2020

https://docs.unity3d.com/ScriptReference/RuntimeInitializeOnLoadM… ute-ctor.html
Ну и там обратиться к объекту.

#1833
(Правка: 18:08) 17:27, 23 мая 2020

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

Идеальный вариант, к которому хочется приблизиться, это стандартные настройки проекта. Например:

- В окне Project Settings есть закладка Time. Там можно настраивать параметры времени.
- Физически эти параметры сохраняются в файле Проект/ProjectSettings/TimeManager.asset
- В коде доступ к этим же настройкам возможен через свойства Time.xxx

--
Существующий API вроде не даёт доступа в ProjectSettings.

Лучшее, что пока удалось придумать, это хранить настройки в ScriptableObject, записанный в папку Resources. Но только в какую-то свою, внутри папки с ассетом.

#1834
18:10, 23 мая 2020

Это не поможет?
https://docs.unity3d.com/2019.3/Documentation/ScriptReference/Set… Provider.html

#1835
(Правка: 20:13) 18:25, 23 мая 2020

Это как сделать в окне ProjectSettings свою закладку. Её я сделал по этому примеру.

А вот путь к файлу с настройками и них захардкожен:

public const string k_MyCustomSettingsPath = "Assets/Editor/MyCustomSettings.asset";

--
Я сейчас сделал, чтобы ScriptableObject с настройками хранился в папке Resources внутри папки ассета, куда бы её внутри проекта ни положили:

Assets/.../MyAsset/Resources/MySettings.asset

public static MySettings GetOrCreateSettings([CallerFilePath] string filename = null)
{
    var directory = Path.GetDirectoryName(filename);
    var path = Path.Combine(directory, "Resources");
    path = Path.Combine(path, DEFAULT_SETTINGS_NAME);
    var assetsFolderIndex = path.IndexOf("Assets");
    path = path.Remove(0, assetsFolderIndex);

    var settings = Resources.Load<MySettings>(path); // Ой, косяк, путь не тот
    if (settings == null)
    {
          settings = ScriptableObject.CreateInstance<MySettings>();
#if UNITY_EDITOR
          AssetDatabase.CreateAsset(settings, path);
          AssetDatabase.SaveAssets();
#endif
    }
    return settings;
}

Оно вроде работает, но ещё не проверял вариант, когда ассет подключен к проекту в виде пакета через Package Manager. Ведь внутрь подключенного пакета писать-то нельзя!

#1836
18:51, 23 мая 2020

В-общем проблема в том, что LoadAssetAtPath вне папки Assets не находит ассеты. Хотя AssetDatabase.CreateAsset их там вроде может создать.
Тогда один выход - использовать какой-то YamlDotNet for Unity и вручную грузить/сохранять из любого пути. В том числе из "Assets/../ProjectSettings/MyCustomSettings.asset"

#1837
18:57, 23 мая 2020

А как быть тогда с билдами? Нужно, чтобы Unity во время билда перенёс настройки из ProjectSettings/MyCustomSettings.asset куда-то в папку с билдом, чтобы можно было прочитать их оттуда в рантайме на конечном устройстве.

Теоретически, наверно можно вклиниться в BuildPipeline и делать это самому. Но, блин, наверняка будут проблемы с поддержкой разных платформ.

#1838
23:23, 23 мая 2020

А есть ли некий сборник юнити стандартные решения стандартных ситуаций?
типа
1) юнити проект акаунт вход типа как на этот форум имя пароль.
типа ввести А=имя и Б=пароль
если А=А_которое_раньше и Б=Б_которое_раньше то нормально и переход на основную локацию
2) таблица рекордов = имя+счёт . какое число больше=это имя первое место в рейтинге
3) рюкзак карман склад ящик=предметы по списку. типа поднял предмет +1штука на складе,вывести на экран список вещей
стандартные обычные ситуации которые есть в любом проекте.
типа сборник брошюра учебник и тд...

#1839
22:18, 24 мая 2020

alexzzzz
На оф. форуме паблишеров Asset Store вопрос об унификации хранения данных для ассетов/пакетов давно обсуждается, но все делают по своему. Например, оф. пакет Addressables при создании базы прямо в рут папки Assets генерит тебе кучи своих файлов. Оно мне надо в руте? Пакет Terrain tools и вовсе захламляет юзерскую папку проекта (которая в AppData на винде). А там оно мне зачем, а если меняю имя проекта, а если мой билд пайплайн эти файлы сносит каждый раз? Хранить что-то за пределами папки Assets плохой вариант, ибо может быть скипнуто гитом.

На мой взгляд лучший способ на данный момент:

Для рантайма храним свои данные в Assets/имя_корневой_папки_ассета/Runtime/Resources/мой_scriptableObject.asset

Для редактора в Assets/имя_корневой_папки_ассета/Editor/Resources/мой_scriptableObject.asset

Получаем их через Resources.FindObjectsOfTypeAll. Если ассеты удалены или ещё не созданы и, если у нас ассет - ищем через AssetDatabase свою папку и там уже хозяйничаем. Если у нас пакет - остаётся только пихать в Assets/. Главное учесть, что юзер вроде меня твою папку может сразу из рута в какую нибудь папку Third Party переместить.

#1840
23:05, 24 мая 2020

V0odo0
Спасибо!

#1841
23:15, 24 мая 2020

Изображение

#1842
(Правка: 26 мая 2020, 18:35) 0:51, 25 мая 2020

Книжка устарела на несколько лет точно. Хотя и раньше всегда можно было кинуть в проект символьную ссылку на общую папку - только с системами контроля версий это не стыковалось хорошо.

Страницы: 1118 119 120 121 122 123
UnityФорумОбщее