Используйте чужие решения
Изобретение велосипеда дело хорошее, как и хождение по граблям. Но всегда можно использовать грабли по назначению. Например, вы можете всегда и как угодно использовать предоставленную информацию и скрипты с данного блога.
Разрешаю. Согласно MIT license
Комментируй код
- создавай описательный заголовок у каждого скрипта в его начале
- создавай описательный заголовок каждой функции прямо перед ней
- комментируй каждое множественное условие
- комментируй заковыристую строчку кода, если потратил на неё более 10-15 секунд
- в идеале комментируй каждую строчку кода
Сегодня ты помнишь что и как сделано, а завтра? Завтра добавлено ещё десяток строк. Послезавтра ещё десяток строк. Потом на месяцы ты забываешь об этом скрипте. За это время ты написал ещё десятки скриптов и сотни строк кода. И вдруг тебе надо его изменить или дополнить? Скорее всего ты уже не будешь помнить, что и как работает в данном скрипте. Да и он ли тебе на самом деле нужен?
Храни скрипты в правильном месте
- Если это разовые скрипты, то создай папку скриптов в workspace и храни их там.
- Если скрипт работает всю игру определись где ему лучше быть: в workspace или в ServerScripts?
- Если скрипт используется более одного раза подумай о том, чтобы запихнуть его в модуль и хранить в ServerScripts или ReplicatedStorage
- Если это скрипты обрабатывающие модели (например поведение мобов или снарядов), то создай для них отдельную папку в ReplicatedStorage и храни там, а не в самих моделях
- LocalScripts— нужны для работы на стороне игрока — в основном для работы с интерфейсом. Не пытайтесь их использовать для глобальных скриптов
- Все расчёты характеристик, повреждений, бонусов, дропа должны производиться исключительно в серверных скриптах (частично спасёт от хакеров) не доступных на стороне клиента
Объекты
- Определись с папками для хранения объектов — разовые отдельно, постоянно клонируемые отдельно
- Объекты это не только модели это ещё скрипты, папки с параметрами, наборы эффектов, куски GUI — вообщем всё, что можно взять в одном месте и добавить в другом
- Группируй объекты сперва по назначению, а уже потом по типу
- В скриптах используй ссылки на объекты объявляя их заранее (или определяя их положение в общем контексте)
- Assets предполагает непосредственное использование в проекте, в то время как модели в маркете — ещё и возможность поделиться ими, а то и продать (кому они там нужны?)
Модель из маркета
- Обезглавь модель взятую из маркета — отключи (Disabled=true) все скрипты (не придётся искать причин странного поведения), а по возможности удали их из модели (избавишь себя от всяческих зловредов)
- Если есть стоящие скрипты поведения, то подумай о их переносе в ReplicatedStorage или о том, чтобы запихать их в модуль
- Присмотрись — может имеет смысл сгруппировать куски Part объектов в Model, а то и вообще в Union?
- Проверь, чтобы у модели не было чего либо за пределами его необходимого размера (или торчит какой-нибудь Part из общей картинки)
- Почти всегда можно, а то и нужно доработать модель до своего представления её в игровом мире
Скрипт и Модуль из маркета
- Всегда обкатывай модуль из маркета в пустом проекте
- Перед использованием чужого модуля в своём проекте сделай локальную копию своего проекта
- Старайся не подключать модуль по ссылке в маркете (через require), используй его скачанный (и подключенный в пустой проект) вариант. Это избавит от массы головной боли. В том числе и на этапе отладки
- Объект по ссылке может быть удалён автором, ограничен в доступе или испорчен — это угробит весь проект
GUI игрока
- Не забывай делать интерфейс резиновым (Scale наше всё!)
- Модули создания резинового интерфейса не обязательны. Достаточно после добавления элемента GUI задать ему относительный размер и позицию (0.1, 0, 0.1, 0) и после этого можно спокойно с ним работать — размеры и положения всегда будут относительными.
- Для резинового интерфейса не забывайте ставить галочку TextScaled для текстовых полей. Иначе ваши тексты будут гулять при изменении разрешения экрана или при переводах на другие языки.
- Скрипт реакции на кнопку размещайте под кнопкой. Не выносите в какой-нибудь общий скрипт.
- Когда GUI должно выдать информацию по объекту — добавьте рядом переменную ObjectValue и помещайте в него ссылку на объект, а не передавайте имя объекта.
- Имейте ввиду — Disabled у скриптов работает как «Выключить» и «Запустить с начала». Это прекрасно можно использовать в GUI и не только.
- Если вы хотите чтобы какие-то элементы были всегда поверх других, то разместите их в отдельном ScreenGui с большим номером DisplayOrder.
- Если вам надо попасть в область занятую системными кнопками, то установите IgnoreGuiInset у ScreenGui.
Отладка наше всё
- Если что-то идёт не так как задумано вставляй print(«Переменная=»,переменная) в местах вызывающих сомнение до и после кода вызывающего вопрос
- Помни, что можно выводить сообщения не только через print, есть ещё и warn() и error(). Ими можно отметить вывод в особо важных (щепетильных) местах.
- Если что-то и правда не так работало, не забудь добавить комментарий и оставить один закомментированный print на будущее там, где действительно была ошибка
- Если выдаются ошибки в окне исполнения, обращай внимание на все строки кода, что там указаны (в том числе и на функцию, которая вызвала функцию, в которой произошла ошибка)
- Если вчера всё работало, а сегодня сыпятся ошибки — это не всегда значит что вы где-то напортачили. Вполне вероятно, что Roblox сделал какое-то исправление и.. что-то поломал. Поищите на devforum.roblox.com — возможно кто-то уже описал ошибку и там есть временное решение. Или.. отдохните часок, денёк другой…
Резервные копии
- Не надейся на откат версии на сайте Roblox
- Создавай локальные копии с индивидуальным именем перед началом редактирования в новом дню (ИмяПроекта_ГодМесяцДень_ТекущееВремя)
- Сохраняй локально проект после отладки большого куска под старым и с новым именем (новые изменения уже пойдут в новое имя)
- Если считаешь что исправление завершено — сохрани проект в Roblox и с новым именем локально.
Как бы это не казалось избыточным, но хранение большого числа локальных копий может уберечь вас от потери большого количества часов потраченных на разработку и отладку. Даже если что-то пойдёт не так — всегда можно открыть вторым окном локальную копию и сравнить что же изменилось в худшую сторону (например нечаянно удалённый скрипт или объект — и скопировать его назад, вместо отката версии и переделки всего заново)
Монетизация
- Всегда используй все варианты монетизации
- Всегда предлагай хоть мизерный (а то и просто визуальный) бонус для игроков с подпиской
- Всегда предлагай игрокам без подписки возможность её приобретения
- Gamepass на всегда, а Product — на сессию, а то и просто разовое приобретение
- Gamepass всегда должны быть в несколько раз дороже внутри игровой покупки той же характеристики
- Храни внутри игровые покупки (данные о них) в Players. Characters полностью удаляется и создаётся заново при респавне игрока (например при его смерти).
- Для внутри игровых покупок разделяй в интерфейсе сессионные покупки и разовый бонус.
Публикация
- Не спеши публиковать новую версию — возможно в ней есть ошибки ломающие геймплей
- Используй тестовый Place для обкатки с друзьями — коллегами новой версии игры
- Только убедившись в том, что в тестовом режиме ничего не сломалось можно публиковать игру в Place общего доступа
Локальный бардак
- Храните каждый проект в отдельной папке
- В каждом проекте создайте отдельные папки для разнотипных ресурсов (модели, рисунки, звуки…)
- Создавайте папку Old куда будете перекидывать устаревшие копии ресурсов и проекта (лучше Old иметь в каждой папке)
- Модели и их текстуры с материалами храните вместе
- И не забудьте про папку хранения документации и блок-схем алгоритмов и принципов самого проекта и его отдельных частей
Бонус
Есть такая штука — блок-схема. Они очень помогают в представлении глобальном и детальном текущего проекта в физуальной форме. Лично я использую для этого yED. У него есть огромный минус — отсутствие русского языка в интерфейсе. Зато полностью бесплатный и умеет автоматически переставлять блоки на форме.
https://www.yworks.com/products/yed
Оптимизация
- Если много уничтожаемых со временем объектов — не используйте Debris(). Использование Wait(time); Object:Destroy(). Это сбережёт массу ресурсов.
- Добавьте ещё один Place. Тормозов может стать гораздо меньше! Странность реализации Roblox.
- Используйте модули по максимуму. И модули в модулях. Поможет размножить логику, если у вас несколько Place.
- Если есть возможность поместите GUI внутрь модуля.
Годно, Александр Васильевич, очень годно! Скажите, а что значит «добавьте ещё один плейс»? Вы не знаете, можно ли в роблоксе сделать что-то типа рендера в текстуру? [Например, Я хочу сделать, чтобы у охраны были мониторы, которые показывают что творится в том месте, где расположены камеры наблюдения.]
1. Добавить ещё плейс — в опубликованной игре можно создать несколько плейсов — территорий или отдельных локаций.
2. Рендера в самой студии нет. Это можно делать только в 3Д редакторах (Blender например) и уже потом импортировать.
3. Добавление мониторов это… отдельная песня по работе с камерами. Видел пример подобного — система дверей-телепортаций в которых было реализовано подобное.