Перенос с другого сайта.
Закончил прототип генерации бесконечных блоков в любую сторону.
Осталось разобраться как отключить рендер объектов которые перекрыты другими объектами.
---
Пробую включать рендер только видимых объектов.
Пока получилось с помощью одного луча и одного объекта.
Если развивать этот код, то мне нужно создать два массива, где будут хранится видимы и остальные объекты.
И понять как пускать множества лучей из камеры. Я ещё не знаю сколько это будут есть ресурсов. А то мне нужно будет плотный поток лучей.
---
Решил провести краш тест.
Отправляю лучи ко всем объектам в методе Update.
В итоге 100 ФПС при 7000 объектов.
Вся мощность уходит на обновление массива, а не на отрисовку лучей.
Вполне неплохо при обновлении в каждом кадре.
Ограничить скорость обновление, уменьшить область обнаружения объектов и можно работать.
Сейчас нужно добавить все объекты в массив в радиусе видимости и проверять пересечение.
Ещё заметил, что отрисовка лучей статичная.
При движении игрока, лучи перестают обновляться и попадать в объект.
Я раньше с лучами работал, но там было всё нормально. Луч обновлялся.
И вообще у меня код неправильный. :)
Но для данного теста это не важно.
Нашёл в чём была проблема лучей. Нужно минусовать из конечной точки, начальную координаты.
---
Реализовал отключение MeshRenderer у скрытых объектов с помощью лучей.
Навесил на все кубики скрипт. И всё в методе Update.
ФПС даже ниже чем был.
Но я ещё не занимался оптимизацией. Было интересно просто понять, жизнеспособная эта идея или нет.
---
Реализовал подъём по лестнице.
При приближении к лестнице, отключается гравитация и меняется управление.
Попутно переделал управление, а то в прошлой версии, игрок проходил сквозь объекты.
Но в новой версии появилась инерция, которую приходится гасить.
И отключил управление, если игрок находится в воздухе. К примеру после прыжка или если упал с лестницы.
Если игрок пойдёт с обрыва без прыжка, управление останется. Но у меня нет обрывов.
Скорей всего в дальнейшем добавлю луч, чтобы проверять, есть земля под ногами или нет
---
Небольшая история.
В новой версии Unity, при установке, не ставится программа MonoDevelop.
Я запускал скрипты с помощью Visual Studio 2019.
Но по какой то причине там нет подсказок. Приходится писать слова целиком.
Я решил попробовать установить MonoDevelop. Оказывается это не так просто.
Но я нашёл решение, скачал старую версию Ubity, и установи оттуда MonoDevelop.
По какой-то причине, мне MonoDevelop не понравилась.
Я удалил MonoDevelop оставил Visual Studio 2019.
Но редактор перестал запускаться из Unity. Приходилось открывать папку и запускать файлы из папки.
Сегодня в поисках решения этой проблемы, я наткнулся на программу Visual Studio Code.
Скрипты стали открывать из Unity, там есть подсказки, и текст с ошибкой переведён на русский язык. И не нужно запускать Unity, чтобы увидеть эту ошибку.
Ещё не пробовал там работать, но мне нравится внешний вид интерфейса.
---
Небольшой код.
В игре мне нужно, чтобы я мог строить шахту вниз. По одному этажу за один раз.
Сначала это будет платформа с лестницей, которую нужно покупать для каждого этажа.
Создаю префаб платформы и переменную с количеством существующих этажей.
И в скрипте строю следующий этаж, умножая высоту платформы на количество этажей. С минусовым значением, чтобы платформы строились вниз.
Сейчас это происходит от кнопки, позже это будет делаться из интерфейса на самой первой платформе.
---
Несколько раз пытался увеличить FPS при большом количестве кубов. Не получилось...
Если пускать плотный поток лучей, FPS подает, но выглядит нормально.
Если пускать мало лучей, то мир не успевает прогрузится и выглядит всё в дырках. Если при этом увеличить задержку исчезновения кубов, то кубов становится слишком много и FPS падает.
В последнем эксперименте пускал редкие случайные лучи, и в небольшом радиусе от попадания включал рендер.
Но при этом приходится работать с массивами.
При этом всём, на каждом кубе работает скрипт, который включает и отключает рендер с задержкой. Который тоже съедает FPS.
В итоге решил все скрипты отключить.
При этом рендер идёт на все объекты перед камерой, которые даже скрыты.
Но автоматом отсекаются все объекты вне поле зрения камеры.
FPS в некоторых моментах лучше, если кубов немного перед камерой, но в целом хуже. Но главное всё выглядит хорошо.
Оставлю так, может позже, что-то интересно на глаза попадётся. Я уже видел решения.
Я даже пытался создать кубы из кусков, чтобы рендер включался только на видимой части. Но скрипт вешается на все эти части, и при генерации создаётся ещё больше объектов. Становилось только хуже.
Оставлю скрин моего последнего эксперимента.
И видео, где сначала мой эксперимент, потом без скриптов.
Я даже блендер скачал на компьютер, думаю свои кубы сделать.
Но что может быть проще кубов. Врятли стандартные кубы скрывают в себе что-то тяжёлое.
Импортировать объекты и работать с ними ещё нужно учится...
Пока ничего не получается.
---
Заметил, когда запускаю игру внутри программы, много ресурсов уходит на работу Unity. Падает FPS.
Поэтому придётся компилировать игры, и запускать их отдельно. Чтобы проверить производительность.
По этой причине добавил скрипт для вывода FPS на экран.
Добавил в генерацию случайное появление "ништяков". И добавление к ним гравитации, если вокруг них нет земли, чтобы они падали вниз после выкапывания.
С передвижение ещё есть проблемы. Но это пока не критично.
Забыл добавить строчку удаляющий скрипт, после включения гравитации.
Destroy ( GetComponent < LootGravity > ());
Хотя по сути, все эти предметы будут собираться игроком. И на производительность это не повлияет.
Я вроде разобрался как делится скриптами. Но не уверен что это правильно...
Управление персонажем https://gist.github.com/Musin-Mihail/a3b5dfaa9b28487af2306d8766157052
Отображение FPS https://gist.github.com/Musin-Mihail/55eada90355d2ae5179bc69f1d5f1123
Добавление гравитации https://gist.github.com/Musin-Mihail/e443592b02d0769f5a2d7ea75a1daf6f
---
Кусок кода.
Притягивание предметов вокруг к игроку, по тегу.
Раз в секунду.
https://gist.github.com/Musin-Mihail/8c640f91f5011561f382447c2689bfeb
---
Ещё кусок кода.
Изменения поля с текстом UI.
https://gist.github.com/Musin-Mihail/8829a7e1808bd66ae60ac321a0b54ad1
---
Немного мыслей про мою игру.
Она будет похожа на Dig-N-Rig. Но в 3d.
Всё. Мысли кончились. )
---
Думаю переделать генерацию земли.
Сейчас у меня она сделана от каждого куба. Но создаётся много лишних объектов для контроля генерации.
У меня есть датчики, которые проверяют, что находится на месте, где нужно создать землю. И висят невидимые объекты, чтобы земля не генерировалась там, где земля уже была.
Сейчас хочу генерировать сразу большие куски земли. Вспомогательные объекты оставлю, но их будет очень мало.
Хотя физические датчики, можно заменить на несколько строчек кода, но я пока умею только с массивами работать для проверки. Не знаю, что будет быстрее.
На вспомогательные файлы повесил скрипт, чтобы они удалялись, если они больше не нужны. По такой же логике я включаю гравитацию у объектов. И только так я могу проверить, занято место под новый блок или нет, чтобы заменить физические датчики.
---
Провёл проверку. Создал массив кубов при старте.
1млн кубов создаются больше минуты. И 2 ФПС.
125 тысяч. 20 ФПС.
На этих блоках в дальнейшем и буду проводить эксперименты. Чтобы увеличить ФПС.
Основную генерацию оставлю без экспериментов. На первое время мне столько блоков не нужно.
Это же просто статичные куба, а сколько съедается ресурсов компьютера...
---
Нашёл видео по объединению меша.
Сохраню это здесь, чтобы не потерять.
Позже буду тестировать
---
Почти разобрался с объединениями мешей.
Изменил код под себя.
В цикле не просчитываю первое место в массиве, там хранится меш "родителя". Он мне мешает пересчитывать новый меш.
Убрал создание общего коллайдера. Мне нужны коллайдеры объектов по отдельности.
Осталось понять как определить удаление "ребёнка". Чтобы пересчитать меш.
И как создавать "детей" под "родителем". Странно это звучит, но другой формулировку я не могу подобрать.
И в логах появляется непонятное предупреждение. Combine mesh instance 0 is null.
https://gist.github.com/Musin-Mihail/0fad103dfe8923b1bcec82474932c376
Создавать объекты под другие объекты научился.
var terra2 = Instantiate(terra, new Vector3(x,y,z),Quaternion.identity);
terra2.transform.parent = gameObject.transform;
Объединять нужно будет кусками.
The number of vertices in the combined mesh (192000) exceeds the maximum supported vertex count (65535)
---
Получается объединить 2200 кубок. При большом количестве появляется ошибка.
exceeds the maximum supported vertex count (65535)
Рендер со 100 ФПС увеличился до 2300.
Появилась сетка там где были старые объекты.
Нужно отключить отбрасывание тени или получении тени.
Но такие варианты не рассматриваются.
Вроде текстурами это можно перекрыть, но линии всё ровно видно. Выглядит это странно.
Я нашёл причину. Это конечно один объект и рендерить он намного быстрее.
Но внутри это те же кубы. Внутри пустые ячейки.
Поэтому и тени от них отбрасываются.
---
Закончил тесты. И всё работает замечательно.
На пересчёт меша FPS падает, но даже при этом он выше, чем при работе без скриптов.
https://gist.github.com/Musin-Mihail/89e994813fce0...
Осталось провести массовый тест, но это позже.
---
Решив проблему с ФПС, решил создать побольше блоков.
Создал 27000. ФПС больше 1000. Но проблемы с генерацией.
Новый меш создаётся со смещением от оригинала, если координаты отличаются от 0, 0, 0.
Пока не понимаю куда "копать".
За координаты отвечает эта строчка. Если я правильно понял.
combines[i].transform = meshFilters[i].transform.localToWorldMatrix;
Что мне сделать, чтобы они не смещались, или как скорректировать их, я пока не знаю.
---
Мне кажется, что я уже мастер спорта по методу тыка "Метод проб и ошибок".
Таким методом я спалил свой первый компьютер. :))
Сделал корректировку для матрицы.
Хотя я сам ещё до конца не осознал, что я сделал. :)
Я всё это время крутился рядом, в поисках информации. Понимал, что я копаю в правильном направлении.
Но понять так и не смог. Только методом тыка.
https://gist.github.com/Musin-Mihail/89e994813fce0936bc5eb89c4bdf5f90
---
Для закрепления результата. 64000 блоков 400 ФПС.
---
Нужно сформировать где то документ. Чтобы там было всё идеи, блок схемы, зарисовки и прочее.
Сейчас пришла идея о мире игры.
Мои приоритеты, это искусственный интеллект и генерация мира.
По этой причине я уберу из игры ручной труд.
Мы будем играть за искусственный интеллект, который отправляют на планеты, или просто на некие территории, чтобы добывать ресурсы.
Задача наладить добычу, строя и настраивая автоматизацию, конвейеры, ботов, дронов и прочее.
Конечная цель собрать определённое количество ресурсов, чтобы отправить на базу как можно быстрее.
---
Базовая версия ботов.
Просто ищет в определённом радиусе от себя ближайший объект и движется к нему.
https://gist.github.com/Musin-Mihail/3ff4e534f6cc9...
Позже будут станции, вокруг которых будут летать дроны и заряжаться от них.
---
Создал страничку на Patreon
https://www.patreon.com/Musin_Mihail
Чтобы мне было интересней делать игру.
Настроил страничку не думая. Позже буду редактировать.
---
Решил сделать станцию для дроном.
Вчера вечером на это потратил примерно 5 часов. Хотя думал, что справлюсь быстро.
Были проблемы с возвратом дронов на свои места, если нет работы.
Пытался сделать автоматический поиск свободного слота.
В итоге ничего не получалось. Лёг спать.
Сегодня уменьшил код в два раза и всё заработало.
Проще было вручную назначить для каждого дрона свой слот.
В добавок оптимизировал код, чтобы увеличить количество дронов на карте.
Все версии игр и код буду выкладывать на Patreon.
Если я хочу на этом зарабатывать, то это будет первый шаг. Хотя мне не очень комфортно монетизировать свой труд таким способом. Я люблю показывать всё что я делаю.
---
Создание сообщений на Patreon, помогает структурировать информацию.
Как минимум на gist.github.com нужно загрузить весь код под версию игры.
Попутно перепроверяя файлы в Unity. Сейчас удалил 2 старых скрипта, которые мне не нужны, а они там висят.
Создал два закрытых сообщения. С новой версией и со всеми предыдущими.
---
Ещё одна идея появилась. Мы не добываем ресурсы, а перерабатываем мусор, которые оставили люди после себя.
А то мне нравятся игры, где нужно собирать разный мусор в игре.
---
Эта идея появилась после просмотра одного шуточного видео. Мне в целом переработка мусора интересна.
И я не могу связать добычу ресурсов из земли и постройку зданий.
Вероятней всего дроны выкопают землю под зданиями, и здания будут в воздухе.
Есть вариант установки летающих построек, но мне эта идея не нравится.
И ограничивать дронов я не хочу. Даже если я не стану копать под зданиями, в итоге слой земли со зданием всё ровно останется в воздухе.
И решил вообще не лезть в землю. Но что будет в итоге я не знаю.
Это пока просто мысли.