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 с ошибкой