@SkyCrusher

Как сохранять изменение значений при переходе в PlayMode?

Всем привет! В общем, ситуация следующая: есть методы у компонентов, доступные через ContexMenu. Работают как надо. Но решил немного автоматизировать и написать скрипт, где эти методы вызываются автоматически. И вот тут-то и проблема. Значения компонентов, которые устанавливаются в ходе выполнения этих методов сбрасываются при запуске PlayMode. Как, собственно, это пофиксить?
Методы компонентов:
Первый:
[ContextMenu("Fill spaces")]
        public void FillSpaces()
        {
            connections = new List<Transform>();
            LineController[] lines = GameObject.FindObjectsOfType<LineController>();
            foreach (var line in lines)
            {
                string[] knotNames = line.gameObject.name.Split('-');
                if (knotNames.Length != 2)
                {
                    LoggerManager.Instance.Error(this, "Incorrect line name. Example: {KnotName1}-{KnotName2}");
                }
                if (knotNames[0] == gameObject.name)
                {
                    connections.Add(GameObject.Find(knotNames[1]).transform);
                }
                else if (knotNames[1] == gameObject.name)
                {
                    connections.Add(GameObject.Find(knotNames[0]).transform);
                }
            }
        }

Второй:
[ContextMenu("Fill spaces")]
        public void FillSpaces()
        {
            List<string> knotNames = new List<string>(gameObject.name.Split('-'));
            top = GameObject.Find(knotNames[0]).GetComponent<Knot>();
            bottom = GameObject.Find(knotNames[1]).GetComponent<Knot>();
        }

Метод который вызывает эти методы:
[MenuItem("Config/AutoConfigLevel")]
        public static void AutoConfigLevel()
        {
            Knot[] knots = GameObject.FindObjectsOfType<Knot>();
            foreach (var knot in knots)
            {
                knot.FillSpaces();
            }
        
            LineController[] lines = GameObject.FindObjectsOfType<LineController>();
            foreach (var line in lines)
            {
                line.FillSpaces();
            }
        }

Визуальные различие после использования через ContexMenu и MenuItem:
ContexMenu:
5f7cdd493a2aa901791772.png
MenuItem:
5f7cdd23c5d87642914601.png
Подозреваю, что нужно использовать PrefabUtility, но не могу там найти что-то подходящее.
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
DanceM
@DanceM Куратор тега Unity Game Engine
Кто хочет -ищет способ, кто не хочет -ищет причину
Со скриптами всё ок.

Дальше, как я догадываюсь, вы упустили один важный момент, что эти значения применяются к экземпляру прдело было фаба (потому жирный шрифт), а не к самому префабу. И префаб на старте сцены загружается чистый, со значениями по умолчанию (вытирая установленные). Ну или что-то типа того.

Если моя догадка верна, тогда после установки значений их необходимо примерить к префабу используя PrefabUtility.ApplyPrefabInstance

PS: дело было в отсутствующей инструкции EditorUtility.SetDirty(); в скрипте, что вызывается через меню.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы