Skip to content
Dimitry edited this page Nov 3, 2018 · 18 revisions

Акторы

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

Как создавать.

Акторы наследуются от класса Actor или MonoActor. MonoActor отличается возможностью добавления апдейтов и сигналов.

 // basic melee unit
    public class ActorEnemy : Actor
    {

        // Атрибут FoldoutGroup("ИМЯ") - нарисует компоненты внутри сворачиваемой группы с заданным именем.
        [FoldoutGroup("Setup")] public ComponentDamageble componentDamageble;
        [FoldoutGroup("Setup")] public ComponentAiBasic componentAIBasic;  
        [FoldoutGroup("Setup")] public ComponentRigidBody componentRigidBody;
        [FoldoutGroup("Setup")] public ComponentBounds componentBounds;
        [FoldoutGroup("Setup")] public ComponentDepth componentDepth;
        [FoldoutGroup("Setup")] public ComponentShadow componentShadow;
        [FoldoutGroup("Setup")] public ComponentView componentView;
        [FoldoutGroup("Setup")] public ComponentAnimationMap componentAnimationMap;
        [FoldoutGroup("Setup")] public ComponentHealth componentHealth;


        // метод setup служит инициализацией, он отыгрывается после Awake. Именно через сетап мы передаем компоненты сущности.
        protected override void Setup()
        {
     
            // Используем Add чтобы передать компонент сущности, не поощряется, но компонент может быть унаследован от
            //другого компонента и в качестве типа может быть указан базовый тип ( родитель ). 
            Add(componentAIBasic as ComponentAI);
            Add(componentShadow);
            Add(componentView);
            Add(componentBounds);
            Add(componentDepth);
            Add(componentRigidBody);
            Add(componentDamageble);
            Add(componentHealth);
            // Сгененирует новый компнент при добавлении по указанному типу.
            Add<ComponentTime>();
            Add<ComponentObjectBounds>();
            // Добавить тэги можно через запятую.
            Add(Tag.GroupEnemy, Tag.GroupDestructable);
        }
}

Как это обычно выглядит:

Настройка актора

  • Вместе с актором генерируется entity - сущность. Ее индекс можно найти во вкладке Actor.
  • Актор неявно добавляет компонент ComponentObject отвечающий за физический объект ( GameObject, Transform ). Это происходит перед методом Setup. Не все сущности должны иметь ComponentObject, но все сущности создаваемые от актора будут обладать ComponentObject.
  • Акторы не предназначены для написания игровой логики, хотя и не содержат строгого запрета на это. Задача актора визуально представить сущность в инспекторе и дать возможность настроить компоненты при инициализации. В 95 % случаев компоненты и метод Setup - единственное, что будет в вашем акторе.
  • В Акторах может содержаться дополнительная логика по настройкам компонентов, игре, обработки событий связанных с анимациями если необходимо и нет явной причины отделить это в отдельный моноскрипт.

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

            // нашли актора. Внимание, это просто пример. Вам вряд ли такое понадобится.
            Actor a = FindObjectOfType<ActorPlayer>();
            a.Release();

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

    // обращаемся к первой сущности на сцене
            var entity = 0;
            entity.Release();

Внимание - код Release ниже актуален до версии 2018.10.27, после этой версии достаточно использовать метод выше.

   var entity = 1;
   // если мы знаем, что сущность это актор, то обязательно передаем true. 
   entity.Release(true); 

На заметку

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

        Add(Path.ToHitSpot, "View/Point Hit");
            Add(Path.ToHitNormal, "View/Collider Hit");
            Add(Path.ToHitCritical, "View/Collider Hit Critical");
            Add(Path.ToSolid, "View/Collider Solid");
            Add(Path.ToView, "View");