Skip to content
Help01 edited this page Jul 19, 2020 · 18 revisions

Акторы

Актор (Actor) служит мостом между фреймворком и физическим объектом в Unity. Задача актора визуально настроить базовые компоненты сущности, инициализировать сущность.

Создание

Акторы самостоятельно создают сущность.

Динамическое создание

Вариант 1

Вернет нового актора и назначит ему новый игровой объект (gameobject). Объект будет получен из папки Resources по имени.

public void Setup()
{
   Actor a = Actor.Create("Obj Alpaca");
}

Вариант 2

Вернет нового актора и назначит ему новый игровой объект (gameobject). Объект будет получен из предоставленного разработчиком префаба (prefab).

public GameObject prefabFluffyUnicorn;
public void Setup()
{    
     Actor a = Actor.Create(prefabFluffyUnicorn);
}

На заметку:

При создании объекта вышеуказанными способами идет проверка на наличие компонента Актора у префаба. Если компонента нет, то актор будет динамически добавлен на созданный объект. Старайтесь избегать таких ситуаций, так как проверка на наличие компонента дешевле чем динамическое добавление. Хорошим тоном будет добавить актора на префаб.

Размещение на сцене

Добавьте Actor-компонент(Класс Actor или его наследник) на gameobject в сцене (или на префаб этого go), воспользовавшись кнопкой Add Component. Инициализация актора произойдет автоматически из Layer.

Настройка сущности через актора

Вариант 1 - наследование от актора

В этом варианте создается новый класс, который наследуется от класса Actor. Это самый простой способ работы с акторами. Добавляются поля компонентов которые нужно передать сущности:

public class ActorUnit : Actor
{
  [FoldoutGroup("Setup")]
  public ComponentCollider componetCollider;
  [FoldoutGroup("Setup")]
  public ComponentObject componentObject;
}

Дальше используется метод Setup() для установки компонентов сущности:

public class ActorUnit : Actor
{

  [FoldoutGroup("Setup")]
  public ComponentCollider componetCollider;
  [FoldoutGroup("Setup")]
  public ComponentObject componentObject;

  protected override void Setup()
  {
     // добавит компонент
     entity.Set(componetCollider);
     entity.Set(componentObject);
    
     // создаст и добавит компонент по типу
     entity.Set<ComponentMotion>();
    
     // добавит тэг
     entity.Set(Tag.Alpaca);
  }
 
}

Вариант 2 - модели

Вернет нового актора и назначит ему новый игровой объект (gameobject). Объект будет получен из папки Resources по имени. Настройки для актора будут взяты из Model.Bunny

Actor.Create("Obj Unit", Model.Bunny);
Actor.Create("Obj Sprite", Model.Bunny);

Ознакомьтесь с настройкой через модели.

На заметку:

Для полноценной работы актора необязательно наследоваться. Если вы будете использовать вариант через модели, то на объекте достаточно иметь базовый компонент Актора.

Обращение к сущности из актора

Для обращения к сущности используйте публичное поле Actor.entity:

public GameObject prefabFluffyUnicorn;
public void Setup()
{    
     ref ent e = ref Actor.Create(prefabFluffyUnicorn).entity;
}

Как уничтожать Акторов

Напрямую уничтожение актора, как go или компонента, не потребуется. Как правило в фреймворке вы будете иметь дело с сущностями. Для уничтожения вам нужно вызвать entity.Release() метод:

           Actor a = Actor.Create(prefabFluffyUnicorn);
           a.entity.Release();

На заметку

Любое логические действие уничтожения и удаления в фреймворке идет через методы Release()- если видите этот метод, то он 100% связан с уничтожением.

Что происходит при уничтожении актора

  • С уничтожением актора его сущность сбрасывается в область зарезервированных сущностей. Все новые сущности сначала попытаются получить индекс оттуда.
  • Все компоненты уничтоженной сущности помечаются как неактивные. Сущность выходит из обращения всех групп. При этом отрабатываются все события выхода из групп если такие присутствуют.
  • Если актор был использован в пуле объектов, то его GameObject будет деактивирован для последующего использования.

Уничтожение является отложенным действием и произойдет на следующий кадр.

Файловые шаблоны

Rider

Код шаблона:

using Pixeye.Actors;

namespace $NAMESPACE$
{
	public class $CLASS$ : Actor
	{
		$END$
		protected override void Setup()
		{
		}
	}
}

Настройки macro для перменных:
CLASS - Current file name without extension with all non-alphanumeric replaced with underscores

NAMESPACE - Default namespace for current file