README.md

    WebConfig

    WebConfig - инструмент для работы с конфигами unity, визуализирует json-конфиги на вебсервере для более удобного чтения и редактирования. Запускается вебсервер каждый раз при заупске проекта в реалтайме на 127.0.0.1 (Вебсервер работает стабильно одновременно с несколькими пользователями(до 20 сессий))

    При отсутствии файла конфигурации вебсервер сервер создаст файл
    с дефолтными значениями по указанному пути.
    Если директорий будет не хватать, конфиг сам создаст их.
    Пример для работы с пакетом можно найти внутри в папке Example.

    Инициализация

    Если в структуре для конфига есть листы, то изначально надо вызвать для них конструкторы и добавить хотя бы один элемент.
    Далее для работы с вебсервером надо подписаться на 2 события:

    • FileChange
    • Status

    Основная механика инициализации работает через event Status!
    После инициализации вызывается Status с кодом:

    • WebServer.StatusCode.OK
    • WebServer.StatusCode.BUSY_PORT

    При успешной инициализации в теле метода можно передать конфиг в веб сервер.
    В случае любого другого кода внести изменения в работу сервера и ждать статус OK

    Кастомные атрибуты

    На основе кастомных полей существуют кастомные атрибуты.
    Рекомендуется использовать атрибуты, так как они позволяют не переусложнять код и не использовать сторонние структуры.

    • [VisualsSlider((string name, float min, float max, float step, float value = 0))]
    • [VisualsFloat(string name, float value = 0)]
    • [VisualsInt(string name, int value = 0)]
    • [VisualsString(string name, string value = "")]
    • [VisualsBool(string name, bool value = false)]

    Через атрибуты можно иницилизировать значение переменных.

    Если не указывать значения, то они выставятся по умолчанию.

    Проблема остается только с листами, атрибуты для листов не поддерживаются в С# 9.0, пока что придется использовать усложненную структуру с ее инициализацией в своем коде.
    Так же при инициализации лист должен иметь хотя бы 1 элемент внутри себя для корректной работы.

    Кастомная сериализация/десериализация

    Сериализация

      WebServer.ToJson(object obj, [bool forceAttributeValue = true])
    

    forceAttributeValue - если true, значения для переменных конфига берутся из атрибутов. Если false, то нужно перед передачей конфига самому определить значения при инициализации.

    Type Description
    string возвращает строку в виде json с кастомными полями

    Десериализация

      WebServer.FromJson<T>(string json)
    
    Type Description
    T возращает структуру с данными
      WebServer.FromJson(string json, Type type)
    
    Type Description
    object возвращает объект с данными по заданному типу

    Для добавления кастомного поля нужно добавить соответствуюший атрибут при инициализации поля.(Пример можно посмотреть в Samples/Example)

    API Reference

    Смена порта

      WebServer.ChangeDefaultPortAsync(int port)
    
    Type Description
    void изменяет порт на котором будет работать вебсервер

    Добавление конфига

      WebServer.AddConfigByPath(string path)
    
      WebServer.AddConfigByPathAsync(string path)
    
    Type Description
    void метод для добавления конфига для загрузки вебсервером

    После успешной инициализации срабатывает подписка о изменении файла

    Создание и добавление конфига

      WebServer.AddConfigByPath(string path, struct, [bool forceAttributeValue = true])
    
      WebServer.AddConfigByPathAsync(string path, struct, [bool forceAttributeValue = true])
    

    forceAttributeValue - если true, значения для переменных конфига берутся из атрибутов. Если false, то нужно перед передачей конфига самому определить значения при инициализации.

    Type Description
    void перегруженный метод, добавляет конфиг и создает json файл по структуре, если он отсутсвует

    Событие для подписки

      WebServer.Status
    
    Type Description
    event Статус вебсервера при инициализации
      WebServer.FileChange
    
    Type Description
    event При изменении конфига придет путь, по которому файл изменился

    Получение конфига

      WebServer.GetConfigValue(string path)
    
    Type Description
    string Возвращает содержимое конфига
      WebServer.GetConfigByteValue(string path)
    
    Type Description
    byte Возвращает содержимое конфига в байтах

    Сохранение конфига

      WebServer.SaveConfigValue(string path, string jsonData)
    
    Type Description
    void Сохраняет данные по указанному пути

    Dispose

      WebServer.Dispose()
    
    Type Description
    void Принудительная остановка Веб сервера

    Usage/Examples

    using System.Collections.Generic;
    using System.Threading.Tasks;
    using UnityEngine;
    using Visuals.Webconfig;
    
    public class Example : MonoBehaviour
    {
        [SerializeField]
        private Settings settings;
        [Serializable]
        struct Settings
        {
            public VisualsList<VisualsSlider> list;
            [VisualsString("Числовой слайдер", "6")]
            public string slider;
            public Asd sliderSlider;
            public Qwe qwe;
            public zxc zxc;
            [VisualsSlider("Слайдер", 0, 10, 1, value: 5)]
            public float exampleFloat;
            [VisualsFloat("Какое-то значение")]
            public float value;
            [VisualsSlider("Слайдер", 0, 10, 1)]
            public float exampleString;
        }
    
        [Serializable]
        struct Asd
        {
            public string name;
            public string description;
            public VisualsList<DressJSON> kekList;
            public List<string> kekList1;
            [VisualsSlider("Слайдер", 0, 10, 1)]
            public float value;
        }
    
        [Serializable]
        public struct DressJSON
        {
            [VisualsString("Название костюма")]
            public string name;
            public VisualsList<DotJSON> dots;
        }
    
        [Serializable]
        public struct DotJSON
        {
            [VisualsString("Заголовок")]
            public string header;
            [VisualsString("Текст по середине")]
            public string middleText;
            [VisualsString("Основное описание")]
            public string discription;
        }
    
        [Serializable]
        enum Qwe
        {
            Q,
            W,
            E
        }
        [Serializable]
        class zxc
        {
            public string name = "qwe";
            public float value = 123;
        }
    
        private const string examplePath = "Assets/tools-webconfig/Samples/Example/Configs/dsafsadda/config (7).json";
    
        //you can subscribe whenever you want
        private async void Start()
        {
            InitLists();
            await Task.Delay(5000); // some code
            WebServer.FileChange += OnFileChange;
            WebServer.Status += WebServer_Status;
        }
    
        private async void WebServer_Status(WebServer.StatusCode status)
        {
            switch (status)
            {
                case WebServer.StatusCode.OK:
                    await WebServer.AddConfigByPathAsync(examplePath, settings);
                    await WebServer.AddConfigByPathAsync("./Assets/tools-webconfig/Samples/Example/Configs/config.json");
                    await WebServer.AddConfigByPathAsync("./Assets/tools-webconfig/Samples/Example/Configs/config (2).json");
                    await WebServer.AddConfigByPathAsync("./Assets/tools-webconfig/Samples/Example/Configs/config (3).json");
                    await WebServer.AddConfigByPathAsync("Assets/tools-webconfig/Samples/Example/Configs/config (3) 1.json");
                    break;
                case WebServer.StatusCode.BUSY_PORT:
                    await WebServer.ChangeServerPortAsync(8080);
                    break;
            }
        }
    
        private void InitLists()
        {
            VisualsSlider visualsSlider1 = new VisualsSlider("sl1", 2, 0, 10, 1);
            VisualsSlider visualsSlider2 = new VisualsSlider("sl1", 2, 0, 10, 1);
            settings.list = new VisualsList<VisualsSlider>("Лист", false, visualsSlider1, visualsSlider2);
    
            DotJSON dot = new DotJSON() { header = "Заголовок", discription = "Текст" };
            DressJSON dressJSON = new DressJSON() { name = "Костюм", dots = new VisualsList<DotJSON>("Точки с инфо", true, dot, dot, dot) };
    
            settings.sliderSlider.kekList = new VisualsList<DressJSON>("Народные костюмы", true, dressJSON, dressJSON, dressJSON);
            settings.sliderSlider.kekList1 = new List<string>
            {
                "1", "2", "3", "4"
            };
        }
    
        private void Update()
        {
            if (Input.GetKeyDown(KeyCode.Space))
            {
                settings.slider = "jswedngojsdng";
                WebServer.SaveConfigValue(examplePath, WebServer.ToJson(settings, forceAttributeValue: false));
            }
        }
    
        private void OnFileChange(string path)
        {
            Debug.Log("файл изменен - " + path);
            if (path == "Assets/tools-webconfig/Samples/Example/Configs/config (7).json")
            {
                settings = WebServer.FromJson<Settings>(WebServer.GetConfigValue(path));
            }
        }
    }
    

    Authors

    Конвейеры
    0 успешных
    0 с ошибкой