WebConfig
WebConfig - инструмент для работы с конфигами unity, визуализирует json-конфиги на вебсервере для более удобного чтения и редактирования. Запускается вебсервер каждый раз при заупске проекта в реалтайме на 127.0.0.1 (Вебсервер работает стабильно одновременно с несколькими пользователями(до 20 сессий))
При отсутствии файла конфигурации вебсервер сервер создаст файл
с дефолтными значениями по указанному пути.
Если директорий будет не хватать, конфиг сам создаст их.
Пример для работы с пакетом можно найти внутри в папке Example.
Инициализация
Если в структуре для конфига есть листы, то изначально надо вызвать для них конструкторы и добавить хотя бы один элемент.
Далее для работы с вебсервером надо подписаться на 2 события:
Основная механика инициализации работает через 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