Я художник, но никто не за меня не напишет код, поэтому занимаюсь также и кодом. Вот уже 17-18 лет, не просите меня бросить это, уже поздно)
Задумался о том, что пора приводить свой код в порядок. А то всегда хаос получается. И узнал интересное слово архитектура, малость погуглил про это, сам я пишу код методом проб и ошибок, как художник (мазками, лол), а эти сложные штуки старался обходить всегда.
Но каждый раз у меня хаос в коде, например, есть несколько объектов, которые должны запускаться по очереди, через Awake или Start функцию после загрузки уровня, и если один из объектов раньше запустится, чем другой, то могут быть баги, в зависимости от разных обстоятельств, очень сложно указывать, какой скрипт должен запускаться раньше других, они всегда хаотично стартуют.
Так вот, как написать самую простейшую архитектуру, где будут учитываться глобальные переменные, и отдельные важные скрипты будут просыпаться раньше, чем другие? И чтобы она выглядела просто даже для художника.
PS Пока что у меня такая хаостектура:
1) На каждом уровне есть обязательный объект со скриптом Global, где все важные статические переменные и функции, также там загрузка и сохранение, как бы сердце игры, и этот объект никогда не удаляется, но удаляются другие такие же с таким же скриптом, если мы перезагружаем этот уровень или загружаем новый, чтобы не дублировались (зачем нужен Global на каждом уровне? чтобы запускать вообще любой уровень, не заходя в главное меню, для тестирования) Это очень костыльно выглядит. 2) Дальше идут вторые по важности скрипты, управление уровнем, которые вначале распределяют разные ресурсы и префабы по местам 3) создаётся главный персонаж и размещается на свои координаты 4) потом всё остальное
Сообщение отредактировал alexsilent - Пятница, 02 Ноября 2018, 13:29
alexsilent, советую книгу Роберт Мартин - Чистый код: создание, анализ и рефакторинг. Она не совсем про архитектуру, но научит писать код более правильно в целом. Написана правда по языку Java, но это не должно вызвать трудностей, он довольно похож на C#, а сама книга написана простым языком и легко читается. К слову, читать целиком и всё не обязательно, некоторые места можно пропустить (например, тестирование и многопоточность, не думаю, что эти моменты вам на данный момент понадобятся, да и там всё-таки больше к Java относится).
По поводу архитектуры. У меня есть мнение, что это одна из тех вещей, которой можно научиться исключительно самому, используя разве что чужие примеры. Материалы по архитектуре кода трудно понять, пока ты сам не начинаешь мыслить в том же ключе, что и автор, а для этого нужно сначала самому начать понимать архитектуру.
Сообщение отредактировал InsaneSystems - Пятница, 02 Ноября 2018, 13:42
Организация сцен Вот тут я пишу про организацию сцен у себя ) неважно как я это реализовывал, но этот подход разумен и позволяет тебе предусмотреть настройку объектов в нужном тебе порядке. ACTORS - мой фреймворк на Unity Until We Die - игра над которой работаю
Простейшим решением будет настроить Edit->Project Settings->Script Execution Order
забыл написать, это я тоже сделал по крайней мере для 4-5 файлов, я не уверен как это работает и стоит ли добавлять слишком много скриптов сюда, поэтому я туда добавил только самое важное
Сообщение отредактировал alexsilent - Пятница, 02 Ноября 2018, 14:46
Простейшим решением будет настроить Edit->Project Settings->Script Execution Order
Вот я, кстати, слегка опасаюсь использования этой функции - про неё легко забыть, как и про все свои настройки там. Я бы предпочёл порядок указать вручную через код или собственный менеджер, который не потеряется.
Сообщение отредактировал InsaneSystems - Пятница, 02 Ноября 2018, 16:25
Мне уже много раз советовали на синглтоны переходить, но такой вопрос: А синглтон может обрабатывать локальные переменные в функции и есть ли доступ к не статичным переменным? Потому-что мой код может, и мне очень нужны локальные переменные в функции. А также мне нужен цикл Update и FixedUpdate прямо в ядре программы, вот такое у меня основное ядро программы, я только начал переписывать на C#, ибо до этого я всегда писал только на ЯваСкрипте.
Код
/* Этот скрипт - ядро игры, с него будет стартовать вся игра, и тут будут находиться самые важные вещи и данные. На каждом уровне должен быть один такой объект с таким скриптом, чтобы можно было тестировать игру вообще с любого уровня, а не только с начального меню, где можно было бы только один раз разместить этот скрипт, но мы же хотим тестировать игру с любого уровня, поэтому запихаем этот скрипт на каждый уровень игры, ибо без этого скрипта игра не сможет работать. */
// Это загрузка библиотек юнити, я в этом не силён, но оно всегда должно быть тут по умолчанию на каждом скрипте using System.Collections; using System.Collections.Generic; using UnityEngine;
// ***** Начало скрипта ***** public class Global : MonoBehaviour {
// ***** Переменные и Данные ***** public static Global it; // Ссылка на этот скрипт, чтобы легко доставать функции и данные, даже если они не статичные
public string state; // Текущее Состояние Игры public string oldState; // Старое состояние игры с прошлого кадра
// ***** Эта функция автоматически запускается сразу при инициализации объекта в текущем уровне игры ***** void Awake() { if (it) { // Если мы уже запускали этот скрипт, значить это дубликат, который нам не нужен... Destroy(gameObject); // ...и поэтому мы его удаляем, ведь нам нужен один такой объект и скрипт в игре вообще return; // сразу же выходим из этой функции } it = this; // указываем ссылку прямо на этот скрипт, это будет всего один раз за игру, с первого запущенного уровня... // ...и теперь мы можем тырить отсюда переменные и функции, с помощью: "Global.it...", например Global.it.state DontDestroyOnLoad(gameObject); // этот объект не удаляется при загрузке нового уровня (по умолчанию все объекты удаляются) }
// ***** Эта функция автоматически запускается перед первым кадром игры, позже Awake ***** void Start() {
}
// ***** Эта функция автоматически обновляется каждый кадр игры ***** void Update() { GameStates(); // вызываем функцию работы режимов игры }
// ***** Функция работы режимов игры ****** /* Эта функция устроена по типу State Machine (но сделано кодом, а не визуальным способом/плагином), очень удобно для программирования: AI, Выбора режимов, Диалога и других сложных штук в игре, код из-за этого намного упрощается, ибо мы можем переключиться только в один режим игры */ void GameStates() { switch (state) // Выбираем Текущий Режим Игры { case "fade": // Режим затемнения экрана при перезагрузке уровня break; // конец условия case "loading": // Режим загрузки уровня break; // конец условия case "fadeOut": // Режим после загрузки уровня, когда экран высветвляется break; // конец условия case "pause": // Режим паузы break; // конец условия default: // Режим по умолчанию, обычный гемплей игры break; // конец условия } }
}
Добавлено (03 Ноября 2018, 12:11) ---------------------------------------------
Цитатаpixeye ()
Организация сцен Вот тут я пишу про организацию сцен у себя ) неважно как я это реализовывал, но этот подход разумен и позволяет тебе предусмотреть настройку объектов в нужном тебе порядке.
pixeye Спасибо, мне очень нравятся твои видео (хотя я в них мало что понимаю, но мне понравилась идея отделения данных от скриптов) и этот фреймворк, но я не совсем уверен, что смогу пользоваться им, ибо мало что понимаю в скриптейбл объектах и синглтонах.
А ещё я пока не изучал новую загрузку сцен, там теперь новый класс, я ещё даже не пытался вникнуть в это, сегодня завтра буду разбирать, я всегда раньше получал доступ к сцене через Application.loadedLevelName
Сообщение отредактировал alexsilent - Суббота, 03 Ноября 2018, 12:23
Синглтон на MonoBehaviour может всё то же самое, что может обычный скрипт.
звучит хорошо, если реально так, тогда я попробую понять как оно устроено и переписать свой скрипт под синглтон, только вроде как синглтону не нужен префаб и не нужно находиться на объекте уровня, но тогда не будет работать Awake, тогда кто будет запускать этот скрипт?! нужен ещё один начальный скрипт, который будет запускать этот синглтон, запутаться можно из-за юнити
Сообщение отредактировал alexsilent - Суббота, 03 Ноября 2018, 14:53
alexsilent, да не в чем там запутываться, Awake отлично работает если правильно сделать) Синглтон можно по-разному организовать. Можно такой, который будет на каждой сцене по-новой грузиться сделать. Как обычный скрипт, просто добавить доступ к нему через статичную переменную. Наверное, чуть позже напишу более подробный пример.