Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Actors 28.09.2019 Гайд #1

Open
PixeyeHQ opened this issue Sep 27, 2019 · 2 comments
Open

Actors 28.09.2019 Гайд #1

PixeyeHQ opened this issue Sep 27, 2019 · 2 comments

Comments

@PixeyeHQ
Copy link
Owner

@PixeyeHQ PixeyeHQ commented Sep 27, 2019

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

Что дает фреймворк:

  • Делает удобной работу с мультисценами в Unity. Дает возможность легко и наглядно "почистить" за собой во время смены сцены
  • Предоставляет единую точку входа на сцену через стартер классы. Все моноскрипты фреймворка начнут работать только после стартера. По стартеру можно примерно понять что делает сцена ведь через него идут все настройки
  • ECS без тонны автогена и настроечного кода с простым API и интеграцией с Unity объектами
  • Простая работа с потоками в рамках ECS
  • Общение ECS с компонентами юнити через Actor класс
  • Удобный и простой пул объектов работающий в связке с ECS
  • Подписку на события через реактивные расширения
  • Сигналы, очень быстрый аналог SendMessage, BroadcastMessage
  • Более эффективные Update методы с включенной дельтой

Актуальная версия ( 07.12.2019 )

Actors

Установка

Вариант 1 ( предпочтительный )

  • Создать новый проект.
  • Открыть manifest файл ( находится в папке Packages )
  • Добавить внутрь манифеста путь на проект:
    Add "com.pixeye.ecs": "https://github.com/dimmpixeye/actors.git",

Этот вариант хорош тем, что вы сможете в будущем обновлять фреймворк из Unity.

Внимание! Если у вас отсутствует git, то его предварительно нужно установить.

Вариант 2

Распаковка

В папке Install вы найдете три unipackage шаблона проекта.

  • actors.clean: пустой проект с самыми базовыми вещами.
  • actors.withconsole: пустой проект с игровой консолью.
  • actors.examples: проект с базовыми примерами работы на фреймворке.

Базовые настройки

В папке Resources лежит файл SettingsFramework, Через него можно задать несколько полезных настроек.

Image from Gyazo

{
  "//": "На сколько сущностей настроить ecs",
  "SizeEntities": 2048,
  "//": "Общее кол-во планируемых типов компонентов. Должно быть кратно 32",
  "SizeComponents": 128,
  "//": "Namespace компонентов. Удалите если не используете",
  "Namespace": "Pixeye.Source",
  "//": "Многословная отладка с показом типов компонентов в имени объекта в дебаг режиме",
  "DebugNames": true
}

Image from Gyazo

  • Update Actors - обновляет фреймворк с гитхаба. Только если установили его с манифеста.
  • Preferences - настроечная информация. В будущем будет либо убрана либо улучшена.
  • Tags - настройки тэгов. Можно отключить фильтрацию ecs по тэгам и выставить кол-во тэгов на сущность.
  • Set Struct Components - перевод ecs компонентов на структуры.
  • Set Debug / Set Release - включение/отключение дебаг мода.
  • Set Manual Events - более тонкая работа с событиями групп. В рамках гайда не буду рассматривать.

Внимание! Перевод компонентов на структуры имеет смысл делать только на новом проекте.

Иерархия сцены

Сцены делятся на основные и дополнительные. Основными называются те сцены которые содержат starter класс. Все остальные сцены дополнительные.

Все сцены создаются с двумя объектами:

  • Scene Setup
    На этот объект в основных сценах кладется компонент Starter
  • --- Dynamic---
    Разделительный объект между настройками и глобальными вещами и телом сцены.

Внимание! Одновременно может быть запущена только одна основная сцена

Стартер

Image from Gyazo

В инспекторе стартера можно указать какие сцены ему необходимы для работы и какие сцены нужно оставить на месте если основная сцена поменяется.

Кнопками Disable in Build / Active in Build можно автоматически добавить сцены в Build Settings

Image from Gyazo

Код стартера

	public class StarterGame : Starter
	{
		// Буффер. О нем будет рассказано отдельно.
		public static Buffer<SegmentAttack> BufferAttack = new Buffer<SegmentAttack>(1000);

		// Метод инициализации в стартере
		protected override void Setup()
		{
			// Добавляйте новые процессоры через метод Add<T>
			Add<ProcessorHelloWorld>();
			Add<ProcessorHelloWorldAlt>();
			Add<ProcessorExampleFilters>();
			Add<ProcessorBuffer>();
			Add<ProcessorParallel>();
			Add<ProcessorActorsExample>();
			Add<ProcessorEntities>();
			Add<ProcessorSignalExample>();
			Add<ProcessorTimers>();
		}

		// Используйте метод для чистки после работы сцены. 
                // Метод вызовется когда вы поменяете сцену.
		protected override void Dispose()
		{
			// clear buffer when the scene is removed
			BufferAttack.Clear();
		}
	}

Процессоры

Системы ecs. Подоробную информацию можно найти здесь.

	// создаем процессор с группой source из сущностей с компонентом 
        // ComponentHelloWorld
	sealed class ProcessorHelloWorld : Processor<ComponentHelloWorld>, ITick
	{
		// метод для обработки событий добавления/выбывания сущностей из групп.
		public override void HandleEvents()
		{
			// Делаем что-то с сущностями которые добавились в группу
			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!");
			}
		}


		public void Tick(float delta)
		{
			// Гоняем сущности в апдейте.
			foreach (ent entity in source)
			{
				var cHelloWorld = entity.ComponentHelloWorld();
				Debug.Log($"{cHelloWorld.label} from source");
			}
		}
	}

Компоненты

Подоробную информацию можно найти здесь.

using Pixeye.Actors;

namespace Pixeye.Source
{
	// Компонент. Содержит только дату. Может быть или классом или структурой в зависимости от стиля разработки.
	// Create->Actors->Add->Component menu. 
	public class ComponentHelloWorld
	{
		public string label = "Hello, World!";
	}

	#region HELPERS
	// Помощь. Может быть описана примитивным шаблоном на IDE или создана фреймворком через юнити.
	public static partial class Component
	{
		// Опционально. Используется для фильтров групп сущностей.
		public const string HelloWorld = "Pixeye.Source.ComponentHelloWorld";

		//  Этот метод позволяет обратиться к компоненту через сущность.
		internal static ref ComponentHelloWorld ComponentHelloWorld(in this ent entity)
			=> ref Storage<ComponentHelloWorld>.components[entity.id];
	}

	sealed class StorageComponentHelloWorld : Storage<ComponentHelloWorld>
	{
		// Быстрее чем создание New T();
		public override ComponentHelloWorld Create() => new ComponentHelloWorld();

		// Метод сработает когда компонент отпадет от сущности. Сбрасываем значения.
		public override void Dispose(indexes disposed)
		{
			foreach (var index in disposed)
			{
				ref var component = ref components[index];
				component.label = "Hello, Actors! This is the default label!";
			}
		}
	}

	#endregion
}

Сущности

Просто ID для обращения к компонентам. Подробнее о них здесь.
Индекс сущности называется ent.
Отсчет сущностей начинается с 1. Нулевая сущность это "null"

	public void Tick(float delta) {
			//===============================//
			// Create entities
			//===============================//

			if (Input.GetKeyDown(KeyCode.Space))
			{
				// create a new entity
				var entity = Entity.Create();
				// set new component to the entity
				var cHelloWorld = entity.Set<ComponentHelloWorld>();
			}
		}

Контейнер для сущностей

У сущностей есть свой собственный специальный контейнер ents для удобного хранения. Полезно если надо где-то сохранить список другой ссылок на сущности.

	              // создать контейнер на 500 значений
                        ents entities = new ents(500);

			// создать новую сущность
			var e = Entity.Create();
			// добавить в контейнер
			entities.Add(e);
			// убрать из контейнера
			entities.Remove(e);

			// прогнать через все существующие в контейнере сущности.
			foreach (ent entity in entities)
			{
				
			}
@PixeyeHQ PixeyeHQ changed the title Тест Обновление Actors 27.09.2019 Sep 27, 2019
@PixeyeHQ PixeyeHQ changed the title Обновление Actors 27.09.2019 :robot: Actors 27.09.2019 Гайд Sep 27, 2019
@PixeyeHQ PixeyeHQ changed the title :robot: Actors 27.09.2019 Гайд :robot: Actors 28.09.2019 Гайд Sep 28, 2019
@xk0fe
Copy link

@xk0fe xk0fe commented Sep 30, 2019

Когда новые видео на YouTube канале?
Очень познавательный материал делаешь.

@PixeyeHQ PixeyeHQ changed the title :robot: Actors 28.09.2019 Гайд Actors 28.09.2019 Гайд Sep 30, 2019
@PixeyeHQ
Copy link
Owner Author

@PixeyeHQ PixeyeHQ commented Sep 30, 2019

Они точно будут, но пока еще не соберусь XD

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Linked pull requests

Successfully merging a pull request may close this issue.

None yet
2 participants