1677

Симулятор эволюции на Unity + исходный код

Здравствуйте, товарищи.

Так уж сложилось исторически, что я люблю разного рода извращения. И вот к чему меня это привело в этот раз:
Я написал симулятор эволюции, используя Unity.

Суть происходящего:
В замкнутую среду помещается клетка, обладающая собственным геномом, состоящим из 64 случайных команд, расположенных в случайном порядке. Клетка выполняет все свои действия в соответствии с геномом. В зависимости от результата выполнения очередной команды, заложенной в гене, клетка переключается на команду в другом гене. Клетки живут в аквариуме, на который светит солнце. Клетки могут фотосинтезировать, чтобы восстанавливать свою энергию. Когда клетка накопит достаточное количество энергии - она делится. Если клетке пора делиться, но она со всех сторон окружена (нет свободного места) - клетка умирает, превращаясь в питательный трупик, который могут сожрать другие клетки.
Если у клетки заканчивается энергия - она умирает, не оставляя за собой трупа. Клетки могут жрать друг друга, и распознавать, родственник перед ними, или нет. При рождении каждой новой клетки есть 25% шанс, что один из её генов мутирует (одна из команд в алгоритме поведения изменится на другую случайную команду). Когда клетка фотосинтезирует - она зеленеет, когда жрёт органику - краснеет.


Всего клетка может выполнять 7 команд:
1 - смотреть прямо перед собой
2 - поворачиваться
3 - двигаться вперёд
4 - жрать объект перед собой
5 - фотосинтезировать
6 - проверять, сколько осталось энергии

7 - размножаться



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

На следующей гифке изображён авариум, почти полностью заваленный трупами "веганов", которые бесконтрольно размножались, и почти довели популяцию до полного вымирания. Но, случайная мутация исправила ситуацию, и в аквариуме появились мясоеды:

На следующей гифке я поэкспериментировал с гравитацией, сделал так, чтобы трупы опускались на дно. От затеи пришлось отказаться, потому что fps, который и так довольно сильно проседал, сморщился ещё сильнее, как-будто его в ледяную воду опустили:

Ну и посделедняя гифка. На ней в аквариуме практически сразу появились хищники:

Как оказалось, наблюдать за развитием о поведением виртуальных клеток - очень увлекательное занятие. Для всех, кому это интересно - оставлю ссылку на репозиторий в комментариях.

Критика по поводу кода принимается. Особенно буду рад услышать советы по оптимизации от компетентных людей.

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

ЗАПРЕЩЕНО:

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

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

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


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

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

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

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

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

Вы смотрите срез комментариев. Показать все
98
Автор поста оценил этот комментарий

Ссылка на исходник:
https://github.com/tyzegt/AlmostEvolution/

раскрыть ветку (80)
33
Автор поста оценил этот комментарий

бля... рандомные команды, как я не догадалсо %) у меня статы были.

http://178.141.253.94/bacs5.php

двигаются в рандомном направлении, если там кто-то есть, то пытаются сожрать. при размножнии есть шанс увеличения/уменьшения силы на 1.

не закончено :(

power - шанс успешно сожрать

speed - скорость размножения

ttl - время жизни в ходах, после которого бактерия дохнет от старости


алсо, сделано на чистых канвах, так что вопроса производительности не стоит =)

раскрыть ветку (12)
11
Автор поста оценил этот комментарий

3 схожих зеленых цвета, ну нафиг так? :(

раскрыть ветку (3)
7
Автор поста оценил этот комментарий

они генерятся рандомно =) обнови страницу, будут другие цвета

раскрыть ветку (2)
1
Автор поста оценил этот комментарий

Ок. Просто ппц неудобно было за этой драмой наблюдать)

Автор поста оценил этот комментарий

Но почти каждый раз присутствуют 3 зеленых цвета.

5
Автор поста оценил этот комментарий

Ну ладно, вот ещё вариант https://deerenaros.github.io/

Только что сделал. С багами =(

https://github.com/Deerenaros/deerenaros.github.io Можете посмотреть по коммитам.

Как насчёт объединится и сделать маленькую вселенную в браузере? Кто за?

@unrecovered @Neptun @Kujivunia


Тут проблема с визаулизацией, но мой рабочий день подходит к концу, может с другой раз доделаю, если энтузиазм не пропадёт. Из того, что хочется - так это расширить набор команд, добавить различные виды визуализаций, и немного усложить упростив модель. В том плане, что бактерии не видят окружающее и не проверяют энергию, они просто химия. Довольно сложная, но химия.

0
Автор поста оценил этот комментарий
победили долгожители =)
0
Автор поста оценил этот комментарий

А что такое protonum 0?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

пустое поле

0
Автор поста оценил этот комментарий

(а, ещё можно курсор навести чтобы статы конкретной особи посмотреть :D)

раскрыть ветку (3)
0
Автор поста оценил этот комментарий
А исходником можешь поделится, очень интересно как все работает :)
раскрыть ветку (2)
0
Автор поста оценил этот комментарий

жабаскрипт же, открой исходный код страницы, там будет всё

(только не пытайся меня потом спрашивать, как ЭТО работает, я уже забыл :DDD)

раскрыть ветку (1)
Автор поста оценил этот комментарий
А я думал там еще + пых идет :D Понял, тоды пойду курить канвас и разбиратся :D Спасибо
0
Автор поста оценил этот комментарий

В чем существенные отличия от Game of Life?

https://ru.wikipedia.org/wiki/%D0%96%D0%B8%D0%B7%D0%BD%D1%8C...

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

Проще сказать, в чём сходства. Достаточно прочитать раздел "Правила" в статье по ссылке, и сравнить с тем, что описано в этом посте.

0
Автор поста оценил этот комментарий

Была мысль сделать что-то подобное, но всё руки не доходили. Хотел представить каждое существо в виде небольшой виртуальной машины, с Тьюринг-полным набором команд и чтобы их код генетически менялся, чтобы выживали существа с полезным(часто используемым) набором команд. Чтобы существа объединялись для достижения какой-то цели (распознавание текста с оракулом) или изображения с веб-камеры.

Планируете рефакторинг?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Вообще, пока я не особо планирую этот проект всерьёз продолжать, есть некоторые мысли по рефакторингу, но пока не особо материализовавшиеся.
Есть задумка в будущем его воспроизвести на каких-нибудь плюсах, например, чтобы максимально быстро работало и не было привязано ко всяким там директыксам или опенглам, с более обширным набором команд и условий для ботов, но пока это только абстрактные планы.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Ну не будешь же ты драйвер OpenGL сам делать или драйвер видеокарты? Любой движок работает с готовыми библиотеками DX или OpenGL, поэтому и быстро получается. Я вот сейчас SFML пытаюсь освоить, он тоже к OpenGL обращается. Сначала хотел за SDL взяться, но потом погуглил и решил, что SFML немного лучше, может и субъективно.

Сейчас попробую в Unity твой проект глянуть, может, разберусь, где будет лучше переписать. Может в Unity остаться будет даже лучше.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Я имел в виду, что хочу совсем без графония обойтись по возможности.
Как вот здесь, например: http://178.141.253.94/bacs5.php

Или что-нибудь клиент-серверное сделать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

ну браузер тоже ведь использует аппаратное графическое ускорение, обращается к OpenGL или DX, только это скрыто, а JS этим на верхнем уровне управляет.

0
Автор поста оценил этот комментарий

Автор, а ты планируешь продолжать развивать данный проект? И не против ли, если я маленько подшаманю с оптимизацией?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Пока что не планирую продолжать. На счёт оптимизации - я же не просто так исходники выложил, можешь делать с ними всё, что хочешь =)

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

Поясни пжлст суть происходящего тут:


// переход

else if (genome[controller] > 12)

{

controller += genome[controller];

return;

}


Зачем индекс текущей команды в геноме сдвигается на значение команды? Далее еще есть похожие места, где индекс команды увеличивается на 2-3-4, т.е. команды пропускаются. Так же не понимаю, зачем это.


И по размножению вопрос. Чем отличается деление от родов? Оба действия доступны только если хватает энергии, но при этом деление происходит независимо от генома, а роды только по достижению нужной команды. При этом родов по факту не происходит никогда, т.к. если энергии хватает, то клетка делится и при этом теряет половину энергии.

Второй вопрос по размножению - насколько я понял, доступное место для новой клетки всегда начинает подбираться в одном и том же направлении, т.е. в идеале когда вокруг никого нет, новая клетка появляется с одной и той же стороны от клетки-родителя. Если это действительно так, то лучше бы переделать, иначе "колония" будет плавно утекать всегда в одном и том же направлении

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Переход - это переход. Индекс переходит на заданное значение. Это нужно для того, чтобы у клеток была возможность составлять сложные алгоритмы поведения, чтобы в качестве реакции на разные события индекс переходил на разные команды.


Роды и деление - одно и то же, только одно происходит по команде, а другое при достижении максимума энергии.


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

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Понял, спасибо. Но еще раз, обрати внимание, что родов не происходит, из-за того что в самом начале есть


if (energy > LevelManager.energyToDivide)

{

TryToDivide();

}


Энергия в этот момент уполовинивается, и только после этого идет


// рожает

else if (genome[controller] == 12)

{

if (energy > LevelManager.energyToDivide)

{

TryToDivide();

return;

}

}

0
Автор поста оценил этот комментарий

А какие вообще есть еще подобные штуки? Интересная тема оказалась, наблюдать за всякими такими симуляциями самостоятельными)

0
Автор поста оценил этот комментарий

Можешь для нубов пояснить как запустить сие?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Скачать и открыть проект в юнити.

0
Автор поста оценил этот комментарий

Товарищ, я смотрю ты с Unity дружишь, сможешь откликнуться на парочку вопросов?

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

Зависит от вопросов. Могу попытаться.

раскрыть ветку (5)
0
Автор поста оценил этот комментарий

О, круто. Ну вот слушай. Я в Unity полунуб, но пытаюсь овладеть им. И вот незадача, приспичило мне написать игру наподобие этой https://play.google.com/store/apps/details?id=com.zerologicg.... Вот я всем задним механизмом чую, что это не особо сложно, но просто не знаю с какой стороны копать? С чего начать учить? На чем рисовать? Как рисовать эти точки и линии, ну в смысле, использовать GameObject и LineRenderers или еще каким образом?

раскрыть ветку (4)
0
Автор поста оценил этот комментарий

Здесь вопрос скорее не про юнити, а про алгоритмы. Начать учить проще всего с видосов на ютюбах, про рисование не совсем понял вопроса. Могу точно сказать, что все вопросы сами собой развеиваются с опытом. Нужно просто брать и делать, практиковаться.

раскрыть ветку (3)
Автор поста оценил этот комментарий

Не, с алгоритмами-то понятно. Непонятно другое (только это и не понятно): в той игре нужно точки соединить линиями. Эти точки являются GameObject-ами? Или это на канвасе рисуется, ну типа как в андроиде на канвасе drawShape() и всё такое?

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Я бы всё делал через GameObjectы. В юнити крайне просто и удобно ими манипулировать.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Благодарствую. Пойду изучать далее.
0
Автор поста оценил этот комментарий

Привет. Научи пользоваться, пожалуйста.

Хочу попробовать. Не программер...

0
Автор поста оценил этот комментарий
Молодец! Пиши ещё.
0
Автор поста оценил этот комментарий

а как запустить этот набор файлов?

З.Ы. я женщина, пойми и прости)

раскрыть ветку (3)
1
Автор поста оценил этот комментарий

все сама догадалась, но все-равно спасибо)

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Может поведаешь всё таки как запускать ?

раскрыть ветку (1)
11
Автор поста оценил этот комментарий
1 пишешь в гугле: юнити скачать

2 качаешь с оф сайта

3 устанавливаешь

4 пока устанавливается регаешься на сайте

5 запускаешь

6 логинишься

7 в правом верхнем есть кнопочка открыть проект

- по умолчанию, архив ТС скачан и разархивирован

8 в окне находишь папку из архива тс

9 щелкаешь по кнопке выбрать папку

- и вот твоему взору открылся проект ТС

10 сверху по середине есть кнопки как на старом касетнике

11 дальше щелкаешь курсором куда угодно

12 делаешь умное лицо

PROFIT - ты программист!

0
Автор поста оценил этот комментарий

как это использовать?

0
DELETED
Автор поста оценил этот комментарий

Еще можно посоветовать кэшировать ссылки и не использовать FindObjectOfType и GetComponent

0
Автор поста оценил этот комментарий
Почему такой низкий fps? Для появления и удаления клеток вы используете Instantiate и Destroy или пул?
раскрыть ветку (33)
7
Автор поста оценил этот комментарий

Instantiate и Destroy, да. Если я правильно понял, о каком пуле речь, (заранее созданные неактивные объекты на сцене, которые активируются и перемещаются на нужную позицию и деактивируются, когда их нужно убрать), то такой пул не совсем подходит. Обычное количество клеток в аквариуме - порядка трёх тысяч, не считая трупы. Максимальная ёмкость аквариума - 8000 клеток.

раскрыть ветку (27)
14
Автор поста оценил этот комментарий
colliders = Physics2D.OverlapCircleAll(sensor.position, 0.1f);

Тут не в пуле дело

Каждая клетка, каждый кадр вызывает эту функцию, конечно тут будет низкий fps
Попробуйте двумерный массив вместо подобного поля


Не надо трогать физику!

раскрыть ветку (22)
3
Автор поста оценил этот комментарий

Была такая мысль. Скорее всего однажды к ней вернусь. Но вот так бывает, загорелся идеей - и надо срочно сделать хоть как-то, лишь бы работало :)

раскрыть ветку (19)
8
Автор поста оценил этот комментарий

И то правда :)
Но потом это выливается в такое, что оказывается было проще и быстрее сделать по-другому

раскрыть ветку (12)
3
Автор поста оценил этот комментарий

Я недавно начал изучать программирование (сейчас на pascal abc) и делал нечно похожее, но проще - клетки-хищники, клетки-веганы и клетки-веганская еда, первые две умеют бегать. и у меня при виде этого поста возник вопрос: а как сделать деление клетки? В смысле, я могу используя двумерный массив проверять его построчно и для каждой ячейки-клетки ходить, но тогда одна клетка может сходить чуть ли миллион раз (у меня массив 1000*1000). А можно ли как то сделать ии для типа клетки и потом все другие клетки будут просто его копией? Мне важно понять сам принцип такого действа.

раскрыть ветку (9)
2
Автор поста оценил этот комментарий
ии для типа клетки
А это уже объектно-ориентированное программирование, насколько помню, в PascalABC есть.
0
Автор поста оценил этот комментарий

Распараллелить? Разбить массив на области с которыми будем работать каждая отдельно взятая нитка, границы лочить, и тогда, теоретически, построчный перебор (если, конечно, не делать тяжелых операций) будет довольно быстрым.

На сколько я понял, в Unity не силен, у автора именно обход (поправьте, если ошибаюсь).

раскрыть ветку (7)
0
Автор поста оценил этот комментарий

Распараллелить это я правильно понял - означает запустить кучу программ-амёб, чтобы каждая работала с основным массивом? А размножением будет копирование и запуск программы?

раскрыть ветку (6)
0
Автор поста оценил этот комментарий

Что-то аж самому интересно стало :D Только с работы приехал и опять кодить :) -1 вечер, зато теперь есть клевый конструктор)

Иллюстрация к комментарию
раскрыть ветку (4)
1
Автор поста оценил этот комментарий

А я решил сделать аналог Тераррии, в пошаговом виде играется, в консоли. В обычной текстовой консоли. Пишу, естественно, на pascal abc. Сейчас умеет ходить по воде w и пустым пространствам и рушить всё, кроме воды и пустоты. "+" в центре - это игрок

Иллюстрация к комментарию
раскрыть ветку (3)
0
Автор поста оценил этот комментарий
Ну, можно и так :) Только вот ресурсы будут расходываться не оптимально. Грубо говоря, только запуск(порождение) такой "программы-амебы" будет отъедать больше ресурсов, чем нужно, для работы такой программы. А учитывая то, что каждая из таких программ будет жить довольно мало - это будет ужас :D

Я имел ввиду вот что:

Есть массив 10х10 - общее поле. Его можно разбить на 4 массива\области(5х5). Запускаем 4 потока(процесса) каждый из которых будет обрабатывать только свою область. Итого, имеем, что у нас 4 области(одно поле) обрабатываются параллельно и независимо друг от друга.

0
Автор поста оценил этот комментарий

Вот из-за таких как ты, я и не стал программистом!

раскрыть ветку (1)
16
Автор поста оценил этот комментарий

ну и отлично, меньше говнокода разгребать потом

5
Автор поста оценил этот комментарий
Иллюстрация к комментарию
раскрыть ветку (5)
9
Автор поста оценил этот комментарий

И получите человека, который тратит неимоверное количество ресурсов и времени на пустяковые и тривиальные вещи, которые по факту, ни на что не влияют.

Главное - рациональность. Не нужно бросаться из крайности в крайность.

раскрыть ветку (2)
0
Автор поста оценил этот комментарий
Главное чтоб платили.
ещё комментарий
2
Автор поста оценил этот комментарий

"сейчас начнем, а потом посмотрим что получится" - вот поэтому я нихрена не доделал в своих любительских попытках сделать игру. ну не умею я в НАСТОЛЬКО детальный план. да и как же вдохновение?

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
ну тут говорится о программистах рядовых, которым дается довольно четкое тз
0
Автор поста оценил этот комментарий

Когда делал когда-то свою проверку пересечений, делил экран на области и проверял среди 9 ближайших квадратов. Может, сейчас это встроено в Юнити как-то?

раскрыть ветку (1)
1
Автор поста оценил этот комментарий

В юнити много разных способов проверки пересечений, но @sarcasman прав, все они в данном случае неэффективны и потратят больше ресурсов, чем банальная проверка восьми ячеек двумерного массива.

1
Автор поста оценил этот комментарий

Ты заметно увеличишь производительность просто избавившись от FindObjectOfType и GetComponent.

FindObjectOfType<LevelManager>().mutations++; - сделай LevelManager синглтоном и обращайся к нему напрямую.

а SpriteRenderer просто вынеси в свойство скрипта, а не ищи его каждый раз.

раскрыть ветку (3)
0
Автор поста оценил этот комментарий

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

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Во-первых, "когда им будут говорить, что это плохой дизайн для автоматических тестов" - это сама по себе спорный вопрос.

Во-вторых, не видел ещё ни одного игрового проекта где бы использовалось автоматическое тестирование.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Спорный, конечно. Я сам устал от этих советов. Споры заканчиваются, когда ведущий кодер говорит тебе не использовать синглтоны (а так же вообще данные с глобальным доступом), иначе работа не будет принята :\

1
Автор поста оценил этот комментарий

Быстро окинул код взглядом.. и

Судя по всему, да
Причем мертвая клетка создается путем Instantiate

0
Автор поста оценил этот комментарий

Забавно, убил час пытаясь сделать пул для клеток. Но всё равно не пашет. Клетки из пула, которые пытаешься использовать повторно ведут себя иначе, чем только что созданные, хотя все свойства вроде копирую. Магия, блин:)

раскрыть ветку (2)
0
Автор поста оценил этот комментарий

Обычно такое происходит когда свойства задаются в Start или Awake. При вытягивании из пула соответственно эти методы не срабатывают.

раскрыть ветку (1)
0
Автор поста оценил этот комментарий

Да, поэтому я и запускал эти события вручную после возвращения из пула, но всё равно фигня получается:)

0
Автор поста оценил этот комментарий

Ага, инст и дестрой, вот тут: https://github.com/tyzegt/AlmostEvolution/blob/master/Assets...

0
Автор поста оценил этот комментарий

Выложите это в стим гринлайт :D 1-2 недели и ваш симулятор уже будет в магазине стим :D

0
Автор поста оценил этот комментарий
Здравтсвуйте.

Не хотите поговорить о боге нашем, многопоточности?


p.s. только не переборщи, а то система будет падать и иксы накрываться.

Иллюстрация к комментарию
ещё комментарий
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

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

Сообщества

18+

Теги

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

Сообщества

Игры

Теги

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

Сообщества

Юмор

Теги

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

Сообщества

Отношения

Теги

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

Сообщества

Здоровье

Теги

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

Сообщества

Путешествия

Теги

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

Сообщества

Спорт

Теги

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

Сообщества

Хобби

Теги

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

Сообщества

Сервис

Теги

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

Сообщества

Природа

Теги

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

Сообщества

Бизнес

Теги

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

Сообщества

Транспорт

Теги

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

Сообщества

Общение

Теги

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

Сообщества

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

Теги

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

Сообщества

Наука

Теги

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

Сообщества

IT

Теги

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

Сообщества

Животные

Теги

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

Сообщества

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

Теги

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

Сообщества

Экономика

Теги

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

Сообщества

Кулинария

Теги

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

Сообщества

История

Теги

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

Сообщества