Вы понимаете, как работает ваша сериализация. И если будете ловить какие-то баги, то понимаете, как ее исправить, чего не скажешь о какой-то либе, начинку который вы не знаете
только в готовых решениях багов как правило почти нет, или очень редкие, и при желании можно выбрать либу-конкурентов без этих багов если их править не будут.. а свой велосипед надо самому поддерживать. в том числе и баги фиксить, и функционал добавлять - всякие подтипы полиморфные в списке (как Doc указывал, а я сказал что они уже реализованы) много чего еще из-коробки есть
производительность там где нужна - можно юзать protobuf или иже с ними бинарные.. текстовая десериализация в/из json не будет самописная быстрее чем готовые либы json, за счет чего? рефлексию если убрать даже - есть генераторы кода, которые без рефлексии компилят, и при этом будет чуть быстрей, но руками такое городить - долго, я имею ввиду свой генератор кода, где будет вида
output.writeTag("health", health);
output.writeHierarchyOfObject("target", target); где target спец подтип, и в него тоже вручную сериалайзить
так вот руками написанное такое всмысле без генератора - будет с рефлекскией - и медленно, а без рефлексии нужен свой велосипед - жесть будет
.. про генератор я имел ввиду что по CLASS декларации само сгенерит код того вида выше с writeTag которые руками не надо писать - и будет быстрее чем любой самописный елосипед, просто это доп требование - если надо - найдете сериалайзер даже json такой
\ protobuf - уже юзает такие же генераторы, без рефлексии
Не мог пройти мимо, не ответив на заблуждения вышеотписавшихся.
сериализация вручную пилится в редких случаях, я за свои 14 лет опыта программирования пришел в выводу что юзать готовые решения - лучше, в 1ю очередь изза их сторонней поддержки и правки багов, плюс функицонала больше чем вы сами навелосипедите
основная задача при сериализации с любыми решениями хоть готовыми хоть вашими - описать данные, пишите C# классы, и когда структуры классов и иераррхии вложенности усложняются - как раз выгоднее писать нормальные C# классы и отдать на откуп системе их перевод в текст JSON/XML или даж бинарный, а не самому писать как каждый подтип будет преобразовываться
нет проблем сохранять полиморфные объекты в JSON, юзайте JsonDotNet с опцией чтобы писало $type при сериализации и соответсвенно нужный подкласс инстанциируется при десериализации
при текстовом формате сериализации, что JSON что XML, не столь важен выбор, когда речь о читаемости итоговых сериализованных файлов - это редкое действие, к тому же открываете в текст редакторе, и при сериализации включаете PrettyPrint чтобы на 1 строке был 1 атрибут, а не все в 1 строку
Я застрял внутри башни когда ее поставил.. может мой пеон откинулся в прямо на башню, когда он откдывается при стройке зданий (и враги тож).
скрин prntscr.com/4lhgcl
а еще почему нет ограничения FPS, у меня почти 300, и грузит ЦП ))
7..12) Орда
13..18) Нежить
19..24) Ночные Эльфы
25..30) Наги
И еще 31-60) Для нестандартных
+ суффикс редактора = очень много.
Хотя например для своей карты я сделал так: имена юнитов / заклинаний начинаются на категорию а дальше идет имя самого юнита. Например:
Защитные - Воин
Защитные - Лучник
Нападающие - Воин
Нападающие - Лучник
А по изменению редактора...
Теоретически тебе надо взять исходники редактора (JNGP например) и написать плагин/модуль который:
меняет структуру файла карты - новые папки добавляет (открываться будет только в твоем редакторе)
добавляет на UI соответствующие кнопки / окошки ввода
Либо вариация предыдущего - поменять алгоритм сортировки в редакторе - чтобы сортировалось в первую очередь по суффиксу редактора, а потом уже по имени. Намного проще, если иметь исходник.
В War3 model editor есть меню Extras > Loading Screen Creator, подробней в help. После создания модели и текстуры экспортиш в карту, в настройках карты - Сценарий > Экран загрузки - ставиш "Файл импорта" свой файл. Кстати разрешение картинки должно быть под разрешение монитора (проверял с картинкой 1024х768 было норм на моем мониторе 1440х900), потом modelEditor его сжимает до 512x512 (степень двойки для всех текстур), но в игре оно опять разожмется под размер созданной картинки, так что на разных разрешениях экрана будет по разному (растягиваться). Еще ссылка world-editor-tutorials.thehelper.net/loadscreen.php
Полагаю, нужно сделать чтобы прога автоматически брала список сайтов (url из файла) и проводила поиск карт по ним, и заливала юзерскую карту также на все сразу. Хотя смысла такой проги мало.
Интересный проект. Я сам программист игровой, дружу с C#, C++, клиент-серв, но на Unity пока ничего не успел сделать, могу разобраться. Идея типа Spell Craft? Хотел бы подробнее узнать особенности, можно в личку.
Кстати, я не только кодер, проектировать тоже могу помоч.
Мне понравилось, очень даже реалистично.. можно конечно добавить деталей - но не всегда это хорошо, иногда нужно показать только общую картину, а не досконально каждый уголок..
автор, статья норм..
нашел ошибку: в листинге про Аттачи в методе
static UNIT GetIndex(unit u) {
return GetUnitUserData(u)
}
GetUnitUserData() возвращает int, а не UNIT, нужно сделать так:
return All[GetUnitUserData(u)]
хотя если вернуться к той же инкапсуляции, никакого метода GetIndex() не должно быть, т.к. незачем пользователю структуры знать индекс юнита во внутреннем массиве...
лучше сделать метод:
unit UNIT::GetAux() { return .aux }
а из внешней среды вызывать так:
void DetachUnitFromUnit(unit mainUnit) {
mainUnit.Delete()
}
unit GetAttachedUnit(unit mainUnit) {
return mainUnit.GetAux()
}
так что заморочки с SetUnitUserData / GetUnitUserData не нужны, т.к. любой экземпляр структуры имеет поле index, где находится его индекс в статическом массиве All.
Че-то я не очень понял, что-же это за таблица хендлов такая и нафига она нужна? И что в этой таблице является ключом (Key), а что значением (Value)? Я то думал, что Handle - обычный указатель (как в СИ). И когда мы создаем Unit, динамически выделяется память под этого юнита, и нам возвращается указатель на эту память, но больше она никуда не сохраняется ни в какую таблицу хендлов. Соответственно, когда удаляем юнита, нужно сначала вызвать DeleteUnit(указатель на юнита) - это удалит структуру данных (Unit) по переданному указателю. Все функции DeleteXXX(handle h) удаляют объект производного типа после простого приведения handle>>XXX, как в СИ++: {XXX * a = (XXX *) h; delete a; }, а потом, нужно обнулить этот указатель h = null, просто чтобы случайно туда ниче не записать, ведь указатель не действителен. Или чето по-другому?
Отредактирован Alex_Hell
» Unity / Сериализация объектов в C#
output.writeHierarchyOfObject("target", target); где target спец подтип, и в него тоже вручную сериалайзить
так вот руками написанное такое всмысле без генератора - будет с рефлекскией - и медленно, а без рефлексии нужен свой велосипед - жесть будет
.. про генератор я имел ввиду что по CLASS декларации само сгенерит код того вида выше с writeTag которые руками не надо писать - и будет быстрее чем любой самописный елосипед, просто это доп требование - если надо - найдете сериалайзер даже json такой
\ protobuf - уже юзает такие же генераторы, без рефлексии
» Unity / Сериализация объектов в C#
» Peon Defender / Peon Defender - Релиз играбельной версии
скрин prntscr.com/4lhgcl
» Peon Defender / Главная страница
» Peon Defender / Главная страница
Отредактирован Alex_Hell
» WarCraft 3 / Систематизация данных в РО
13..18) Нежить
19..24) Ночные Эльфы
25..30) Наги
И еще 31-60) Для нестандартных
+ суффикс редактора = очень много.
Защитные - Воин
Защитные - Лучник
Нападающие - Воин
Нападающие - Лучник
Теоретически тебе надо взять исходники редактора (JNGP например) и написать плагин/модуль который:
https://xgm.guru/p/fly-data
Отредактирован Alex_Hell
» WarCraft 3 / Прелоад
Отредактирован Alex_Hell
» WarCraft 3 / Накопитель энергии
» WarCraft 3 / MapLoader v2.0.0
» Battle Mages / Главная страница
Кстати, я не только кодер, проектировать тоже могу помоч.
» WarCraft 3 / Update Item System 1.1
» WarCraft 3 / Работы Redykt"a
» WarCraft 3 / Повседневные приёмы в программировании варкрафта
нашел ошибку: в листинге про Аттачи в методе
static UNIT GetIndex(unit u) {
return GetUnitUserData(u)
}
GetUnitUserData() возвращает int, а не UNIT, нужно сделать так:
return All[GetUnitUserData(u)]
лучше сделать метод:
unit UNIT::GetAux() { return .aux }
void DetachUnitFromUnit(unit mainUnit) {
mainUnit.Delete()
}
return mainUnit.GetAux()
}
» WarCraft 3 / Передача и хранение данных в варкрафте
» WarCraft 3 / Easy Button Creator или очень простое и быстрое создание иконок.