24

Туториалы для геймдева #1 Локализация и Класс Logic

Привет, Пикабу! Пока писал эту часть, понял что из разбивки которую сразу наметил этот пост получится слишком маленьким, решил объеденить две темы.


Этот пост НЕ претендует на Каноничность, Идеальность кода и архтектуры. Тут могут быть рассказаны не самые аккуратные и эффективные решения. Это просто некоторый набор советов, которые я сам использую, и это облегчает мне жизнь.


Рекомендуется прочтение предыдущего поста: https://pikabu.ru/story/tutorialyi_dlya_geymdeva_0_staticdat...

Logic


Класс Logic это некое сборище полезных и часто используемых функций и хинтов которые едины для всего проекта, а копировать их код в несколько мест не хочется.


Сейчас объясню попонятнее.


Представьте что у вас есть БОЛЬШОЙ и глобальный класс, который хранит текущее состояние игры - (например этот класс потом уходит в сейв). У него есть параметр ЗОЛОТО.  При этом этот параметр изменяется подбором лута, магазином и т.д.


В таком случае в каждом классе вы пишете что-то вроде:


Logic.AddGold(50); \\использовать его можно также как и StaticData

Вопрос - А почему бы также не обращаться сразу к классу для сейва?


Имхо самый правильный ответ, это почему вместо:


public int a;


пишут:


public int a {get; set;};


Т.е. правильное управление доступом. В классе сейвов по хорошему должны быть только серриализуемые переменные.


Если вы не поняли что делает "public int a {get; set;};" и зачем оно может использоваться, то вот простое объяснение: Идеологически так сложилось.

И ещё пара маленьких плюсов от класса Logic.


1)Удобно управлять рандомом. Как всем известно настоящего рандома в играх нет. Logic позвляет аккамулировать все события которые могут использовать рандом и вы можете напрямую контролировать их порядок вызова.


Пример (простой, но высосаный из пальца):


У вас есть два коллайдера, происходет столкновение. У обоих есть onHit ивент.


Оба что-то делают, вызывая рандом. Никто не гарантирует вам порядок вызова этих ивентов. Т.е. если вы перезагрузите игру результат столкновения может быть другим.


Logic же получит оба ивента, отсортирует их (например сначала всегда обрабатывается вызов от игрока, потом от объекта с которым он столкнулся).


2)Удобно хранить ивенты в одном классе. И точно также удобно вешать на них слушателей. Не надо бегать по 20 классам и смотреть, а убрал ли я всех слушателей, а везде ли ивент сработал  так далее.

Переходим к локализации.


Когда-нибудь вы соберётесь переводить игру на другие языки. Или сразу будете делать скажем на английском и русском. Вам потребуется как-то аккуратно хранить текст. Аккуратно - это значит в таблице) Создаём лист с названием Texts.

Собственно всё также как и в остальных листах. Разве что удобнее превращать не в список объектов кастомных классов, а в список словарей (DICTIONARY) например. А потом вытаскивать по названию языка, но это детали.


Помимо удобства использования это даёт нам удобство перевода. Исправление ошибок, муки выбора надписей.


\\Мы как-то раз недел жонглировали именами ACCEPT, ACCEPT JOB, OK. Представьте какой ад был бы если бы надо было лезть в редактор и везде править названия, а тут геймдизу даже не надо пинать программистов. Сел и поменял поле в таблице.


А также с таблицей могут работать переводчики! Естественно вы не пустите их в код, а вот перевести строки таблицы они вполне способны.


Также бонусом идёт то, что Unity UI (и UI Widget в UE4) поддерживают Rich Text, а значит мы можете сделать шрифты жирными или цветыми прямо в таблице.

Итак, как с этим работать.

Ну собственно аналогично Logic и StaticData. Заметьте, что мы не передаём язык, о текущем языке всё знает сам Localizer. Он уже выдаст нам текущую строку.


На объекте с текстом висит вот скрипт TextLocalizer, в который мы передаём какие-то значения и он уже сам решает как их заполнить. Например обратите внимание на #VAL0 в строке с золотом. Вот как я с ними работаю:

Передали список значений, и они сами обновились.


Главное не забудтье в редакторе прописать публичное поле KeyName нужным вам ключом)

Вопрос, а как инициализировать стартовые значения всяких кнопок ОК, EXIT и т.д.


Элементарно,Ватсон!


Вешаем на текстовый объект наш TextLocalizer. Прописываем ему соответствущй ключ. Он при старте вызывает SetValues(null); И текс записался. Всё)

Ну и последняя заметка - Смена языка. Есть 2 способа, простой и сложный.


Простой: При старте игры игрок выбирает язык, он устанавливается в TextLocalizer и дальше работает всё вышеописанное. После игрок язык уже не может поменять.


Сложный: в Logic создаётся ивент смены языка, и его слушает TextLocalizer, меняет язык в себе и вызывает ивент обновления текстов на интерфейсах. Интерфейсы этот ивент слушают и вызывают SetValues от последних запоменных значений.


Надеюсь это поможет кому-то с архитектурой проекта) Спрашивайте что не понятно) Остался ещё 1 пост наверное)

Правила сообщества

ОБЩИЕ ПРАВИЛА:

- Уважайте чужой труд и используйте конструктивную критику

- Не занимайтесь саморекламой, пишите качественные и интересные посты

- Никакой политики


СТОИТ ПУБЛИКОВАТЬ:

- Посты о Вашей игре с историей её разработки и описанием полученного опыта

- Обучающие материалы, туториалы

- Интервью с опытными разработчиками

- Анонсы бесплатных мероприятий для разработчиков и истории их посещения;
- Ваши работы, если Вы художник/композитор и хотите поделиться ими на безвозмездной основе

НЕ СТОИТ ПУБЛИКОВАТЬ:

- Посты, содержащие только вопрос или просьбу помочь
- Посты, содержащие только идею игры

- Посты, единственная цель которых - набор команды для разработки игры

- Посты, не относящиеся к тематике сообщества

Подобные посты по решению администрации могут быть перемещены из сообщества в общую ленту.

ЗАПРЕЩЕНО:

- Публиковать бессодержательные посты с рекламой Вашего проекта (см. следующий пункт), а также все прочие посты, содержащие рекламу/рекламные интеграции

- Выдавать чужой труд за свой

Подобные посты будут перемещены из сообщества в общую ленту, а их авторы по решению администрации могут быть внесены в игнор-лист сообщества.


О РАЗМЕЩЕНИИ ССЫЛОК:

Ссылка на сторонний ресурс, связанный с игрой, допускается только при следующих условиях:

- Пост должен быть содержательным и интересным для пользователей, нести пользу для сообщества

- Ссылка должна размещаться непосредственно в начале или конце поста и только один раз

- Cсылка размещается в формате: "Страница игры в Steam: URL"

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества