Сохранение настроек компонента в инспекторе в runtime

Раздел, посвящённый всему, что связано с программированием для Редактора Юнити. Скрипты Редактора, Wizards и прочее.

Сохранение настроек компонента в инспекторе в runtime

Сообщение Good1101 28 апр 2014, 18:02

Добрый день. Всем известно что настройки компонента заданные в игровом режиме слетают по его завершении. Очень часто получается так что нужные настройки можно задать только во время выполнения подгоняя их исходя из визуального наблюдения за поведением объекта на сцене. Сейчас же приходится настраивать компонент и запоминать значения переменных. Поскольку все так или иначе с этим сталкивались и негодовали) то должен быть общеизвестный способ сохранения настроек компонента в игровом режиме, но я его не нашел к сожалению, хотя может плохо икал. Как в идеале я это вижу, рисуем в компоненте некую кнопку SaveCurentData, настраиваем компонент клацаем кнопку и неким магическим образом текущие настройки компонента сохраняются в метаданных (или куда они там должны сохранятся). Осталось только разобраться с магической составляющей алгоритма. Ответ "пиши свой инспектор" или " сохраняй значения в свой файл" не принимаются. :)
Как тут стрелять?
Аватара пользователя
Good1101
Адепт
 
Сообщения: 1100
Зарегистрирован: 17 ноя 2011, 14:07
  • ICQ

Re: Сохранение настроек компонента в инспекторе в runtime

Сообщение Nicloay 28 апр 2014, 18:12

Good1101 писал(а):Добрый день. Всем известно что настройки компонента заданные в игровом режиме слетают по его завершении. Очень часто получается так что нужные настройки можно задать только во время выполнения подгоняя их исходя из визуального наблюдения за поведением объекта на сцене. Сейчас же приходится настраивать компонент и запоминать значения переменных. Поскольку все так или иначе с этим сталкивались и негодовали) то должен быть общеизвестный способ сохранения настроек компонента в игровом режиме, но я его не нашел к сожалению, хотя может плохо икал. Как в идеале я это вижу, рисуем в компоненте некую кнопку SaveCurentData, настраиваем компонент клацаем кнопку и неким магическим образом текущие настройки компонента сохраняются в метаданных (или куда они там должны сохранятся). Осталось только разобраться с магической составляющей алгоритма. Ответ "пиши свой инспектор" или " сохраняй значения в свой файл" не принимаются. :)


Уже давным давно не так, с 4й версии в настройках инспектора есть такой пункт copy component
выйти в настройки - нужно кликнуть самую правую пипяку
Изображение
ну и потом увидишь в сплывающем окошке
Изображение
и после останова, можно либо скопировать значения либо скопировать как новый.

п.с. я этой штукой постоянно пользуюсь и даже не представляю сколько времени это сэкономил (сам в 3.5 парился)
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Сохранение настроек компонента в инспекторе в runtime

Сообщение Good1101 28 апр 2014, 18:35

Nicloay, спасибо, этот способ я уже нашел, но дело еще вот в чем, у меня в игре 51 машина и для каждой машины мне нужно сделать "заводские" настройки коробки передач, для каждой трансмисии исходя из базовых характеристик авто, что бы она более менее ехала нормально, а дальше по легенде пользователь уже будет настраивать сам. Я почему то думал что у меня получится настроить параметры непосредственно через гуи в игре, сделать тест драйв, клацнуть куданить :) они сохранятся в эдиторе.)
Как тут стрелять?
Аватара пользователя
Good1101
Адепт
 
Сообщения: 1100
Зарегистрирован: 17 ноя 2011, 14:07
  • ICQ

Re: Сохранение настроек компонента в инспекторе в runtime

Сообщение Nicloay 28 апр 2014, 20:12

Good1101 писал(а):Nicloay, спасибо, этот способ я уже нашел, но дело еще вот в чем, у меня в игре 51 машина и для каждой машины мне нужно сделать "заводские" настройки коробки передач, для каждой трансмисии исходя из базовых характеристик авто, что бы она более менее ехала нормально, а дальше по легенде пользователь уже будет настраивать сам. Я почему то думал что у меня получится настроить параметры непосредственно через гуи в игре, сделать тест драйв, клацнуть куданить :) они сохранятся в эдиторе.)

перенес в префаб, не ? можно ж перенести, потом apply |reset для префаба а если уже все финально - то и удалить.
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт

Re: Сохранение настроек компонента в инспекторе в runtime

Сообщение Good1101 04 май 2014, 06:03

Вот что я придумал.
Выкладываю так как надеюсь что кому-то может и пригодится общий принцип моей идеи. :)
Делаем две кнопки в нужном компоненте, через едитор. Создаем промежуточный класс для сериализации нужных переменных в xml файл, прописываем в нем только те переменные которые хотим сохранять, например в основном компоненте у меня больше 20и переменных но мне нужно сохранить только 2 из них, например зачем нам динамически изменяемая скорость и тп. Запускаем игру настраиваем компонент как душе угодно, жмем кнопку "Сохранить" нужные данные сохраняются в StreamingAssets, нажимаем стоп, затем клацаем "Загрузка". Все, остается только сохранить сцену и радоваться.
Класс исходного компонента (переменные в котором сохраняем).
Синтаксис:
Используется csharp
using UnityEngine;
public class CarCollection : MonoBehaviour {
    public CarData[] Cars;
    public TextAsset dataxml;
}
 

и едитор расширение для него
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEditor;
using System.Collections.Generic;
using System.Xml.Serialization;
using System.IO;
using System.Text;

[CustomEditor(typeof(CarCollection))]
public class CarCollectionEditor : Editor {

    public override void OnInspectorGUI()
    {
        DrawDefaultInspector();
        CarCollection collect = (CarCollection)target;
        if (GUILayout.Button("SaveXml"))
        {
            CarDataTarnsm[] data = Init(collect.Cars);
            XmlSerializer serializer = new XmlSerializer(typeof(CarDataTarnsm[]));
            FileStream stream = new FileStream(Application.dataPath + "/StreamingAssets/CarData.xml",FileMode.Create);
            TextWriter textWriter = new StreamWriter(stream, Encoding.UTF8);
            serializer.Serialize(textWriter, data);
            textWriter.Close();
        }
        if (GUILayout.Button("Loadxml"))
        {
            XmlSerializer serializer = new XmlSerializer(typeof(CarDataTarnsm[]));
            TextReader reader = new StreamReader(Application.dataPath + "/StreamingAssets/CarData.xml",Encoding.UTF8 );
            string data = reader.ReadToEnd();
            StringReader stread = new StringReader(data);
            CarDataTarnsm[] tarnsm = (CarDataTarnsm[])serializer.Deserialize(stread);
            Init(collect.Cars, tarnsm);
        }
    }
    CarDataTarnsm[] Init(CarData[] data)
    {
        CarDataTarnsm[] transm = new CarDataTarnsm[data.Length];
        int i = 0;
        foreach (CarData da in data)
        {
            transm[i] = new CarDataTarnsm();
            transm[i].KPP = da.KPP;
            transm[i].GP = da.GP;
            i++;
        }
        return transm;
    }
    void Init(CarData[] data, CarDataTarnsm[] transm)
    {
    int i = 0;
        foreach (CarData dat in data)
        {
            dat.KPP = transm[i].KPP;
            dat.GP = transm[i].GP;
            i++;
        }

    }
}
[System.Serializable]
public class CarDataTarnsm
{
    public List<Transmission> KPP = new List<Transmission>();
    public float GP;
}

 
Как тут стрелять?
Аватара пользователя
Good1101
Адепт
 
Сообщения: 1100
Зарегистрирован: 17 ноя 2011, 14:07
  • ICQ


Вернуться в Editor

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2