You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
В этом посте я расскажу как начать пользоваться фреймворком Actors. Actors был изначально написан мной для движка Unity с целью повышения продуктивности и стандартизации подходов к разработке игр.
Что дает фреймворк:
Делает удобной работу с мультисценами в Unity. Дает возможность легко и наглядно "почистить" за собой во время смены сцены
Предоставляет единую точку входа на сцену через стартер классы. Все моноскрипты фреймворка начнут работать только после стартера. По стартеру можно примерно понять что делает сцена ведь через него идут все настройки
ECS без тонны автогена и настроечного кода с простым API и интеграцией с Unity объектами
Простая работа с потоками в рамках ECS
Общение ECS с компонентами юнити через Actor класс
Удобный и простой пул объектов работающий в связке с ECS
Подписку на события через реактивные расширения
Сигналы, очень быстрый аналог SendMessage, BroadcastMessage
Более эффективные Update методы с включенной дельтой
В папке Install вы найдете три unipackage шаблона проекта.
actors.clean: пустой проект с самыми базовыми вещами.
actors.withconsole: пустой проект с игровой консолью.
actors.examples: проект с базовыми примерами работы на фреймворке.
Базовые настройки
В папке Resources лежит файл SettingsFramework, Через него можно задать несколько полезных настроек.
{
"//": "На сколько сущностей настроить ecs",
"SizeEntities": 2048,
"//": "Общее кол-во планируемых типов компонентов. Должно быть кратно 32",
"SizeComponents": 128,
"//": "Namespace компонентов. Удалите если не используете",
"Namespace": "Pixeye.Source",
"//": "Многословная отладка с показом типов компонентов в имени объекта в дебаг режиме",
"DebugNames": true
}
Update Actors - обновляет фреймворк с гитхаба. Только если установили его с манифеста.
Preferences - настроечная информация. В будущем будет либо убрана либо улучшена.
Tags - настройки тэгов. Можно отключить фильтрацию ecs по тэгам и выставить кол-во тэгов на сущность.
Set Struct Components - перевод ecs компонентов на структуры.
Set Debug / Set Release - включение/отключение дебаг мода.
Set Manual Events - более тонкая работа с событиями групп. В рамках гайда не буду рассматривать.
Внимание! Перевод компонентов на структуры имеет смысл делать только на новом проекте.
Иерархия сцены
Сцены делятся на основные и дополнительные. Основными называются те сцены которые содержат starter класс. Все остальные сцены дополнительные.
Все сцены создаются с двумя объектами:
Scene Setup
На этот объект в основных сценах кладется компонент Starter
--- Dynamic---
Разделительный объект между настройками и глобальными вещами и телом сцены.
Внимание! Одновременно может быть запущена только одна основная сцена
Стартер
В инспекторе стартера можно указать какие сцены ему необходимы для работы и какие сцены нужно оставить на месте если основная сцена поменяется.
Кнопками Disable in Build / Active in Build можно автоматически добавить сцены в Build Settings
Код стартера
publicclassStarterGame:Starter{// Буффер. О нем будет рассказано отдельно.publicstaticBuffer<SegmentAttack>BufferAttack=newBuffer<SegmentAttack>(1000);// Метод инициализации в стартереprotectedoverridevoidSetup(){// Добавляйте новые процессоры через метод Add<T>Add<ProcessorHelloWorld>();Add<ProcessorHelloWorldAlt>();Add<ProcessorExampleFilters>();Add<ProcessorBuffer>();Add<ProcessorParallel>();Add<ProcessorActorsExample>();Add<ProcessorEntities>();Add<ProcessorSignalExample>();Add<ProcessorTimers>();}// Используйте метод для чистки после работы сцены. // Метод вызовется когда вы поменяете сцену.protectedoverridevoidDispose(){// clear buffer when the scene is removed
BufferAttack.Clear();}}
Процессоры
Системы ecs. Подоробную информацию можно найти здесь.
// создаем процессор с группой source из сущностей с компонентом // ComponentHelloWorldsealedclassProcessorHelloWorld:Processor<ComponentHelloWorld>,ITick{// метод для обработки событий добавления/выбывания сущностей из групп.publicoverridevoidHandleEvents(){// Делаем что-то с сущностями которые добавились в группуforeach(ent entity in source.added){
Debug.Log($"the entity {entity} was added to source!");}// Делаем что-то с сущностями которые ушли из группыforeach(ent entity in source.removed){
Debug.Log($"the entity {entity} was removed from source!");}}publicvoidTick(floatdelta){// Гоняем сущности в апдейте.foreach(ent entity in source){varcHelloWorld= entity.ComponentHelloWorld();
Debug.Log($"{cHelloWorld.label} from source");}}}
using Pixeye.Actors;namespace Pixeye.Source
{// Компонент. Содержит только дату. Может быть или классом или структурой в зависимости от стиля разработки.// Create->Actors->Add->Component menu. publicclassComponentHelloWorld{publicstringlabel="Hello, World!";}
#region HELPERS
// Помощь. Может быть описана примитивным шаблоном на IDE или создана фреймворком через юнити.publicstaticpartialclassComponent{// Опционально. Используется для фильтров групп сущностей.publicconststringHelloWorld="Pixeye.Source.ComponentHelloWorld";// Этот метод позволяет обратиться к компоненту через сущность.internalstaticref ComponentHelloWorld ComponentHelloWorld(inthisent entity)=>refStorage<ComponentHelloWorld>.components[entity.id];}sealedclassStorageComponentHelloWorld:Storage<ComponentHelloWorld>{// Быстрее чем создание New T();publicoverride ComponentHelloWorld Create()=>new ComponentHelloWorld();// Метод сработает когда компонент отпадет от сущности. Сбрасываем значения.publicoverridevoidDispose(indexesdisposed){foreach(var index in disposed){refvarcomponent=ref components[index];
component.label ="Hello, Actors! This is the default label!";}}}
#endregion
}
Сущности
Просто ID для обращения к компонентам. Подробнее о них здесь.
Индекс сущности называется ent.
Отсчет сущностей начинается с 1. Нулевая сущность это "null"
publicvoidTick(floatdelta){//===============================//// Create entities//===============================//if(Input.GetKeyDown(KeyCode.Space)){// create a new entityvarentity= Entity.Create();// set new component to the entityvarcHelloWorld= entity.Set<ComponentHelloWorld>();}}
Контейнер для сущностей
У сущностей есть свой собственный специальный контейнер ents для удобного хранения. Полезно если надо где-то сохранить список другой ссылок на сущности.
// создать контейнер на 500 значенийentsentities=new ents(500);// создать новую сущностьvare= Entity.Create();// добавить в контейнер
entities.Add(e);// убрать из контейнера
entities.Remove(e);// прогнать через все существующие в контейнере сущности.foreach(ent entity in entities){}
The text was updated successfully, but these errors were encountered:
В этом посте я расскажу как начать пользоваться фреймворком Actors. Actors был изначально написан мной для движка Unity с целью повышения продуктивности и стандартизации подходов к разработке игр.
Что дает фреймворк:
Актуальная версия ( 07.12.2019 )
Установка
Вариант 1 ( предпочтительный )
Add "com.pixeye.ecs": "https://github.com/dimmpixeye/actors.git",
Этот вариант хорош тем, что вы сможете в будущем обновлять фреймворк из Unity.
Вариант 2
Распаковка
В папке
Install
вы найдете три unipackage шаблона проекта.Базовые настройки
В папке Resources лежит файл
SettingsFramework
, Через него можно задать несколько полезных настроек.Иерархия сцены
Сцены делятся на основные и дополнительные. Основными называются те сцены которые содержат starter класс. Все остальные сцены дополнительные.
Все сцены создаются с двумя объектами:
На этот объект в основных сценах кладется компонент Starter
Разделительный объект между настройками и глобальными вещами и телом сцены.
Стартер
В инспекторе стартера можно указать какие сцены ему необходимы для работы и какие сцены нужно оставить на месте если основная сцена поменяется.
Кнопками Disable in Build / Active in Build можно автоматически добавить сцены в Build Settings
Код стартера
Процессоры
Системы ecs. Подоробную информацию можно найти здесь.
Компоненты
Подоробную информацию можно найти здесь.
Сущности
Просто ID для обращения к компонентам. Подробнее о них здесь.
Индекс сущности называется ent.
Отсчет сущностей начинается с 1. Нулевая сущность это "null"
Контейнер для сущностей
У сущностей есть свой собственный специальный контейнер ents для удобного хранения. Полезно если надо где-то сохранить список другой ссылок на сущности.
The text was updated successfully, but these errors were encountered: