-
Notifications
You must be signed in to change notification settings - Fork 76
(RU) Actors
Акторы служат мостом между фреймворком и физическим объектом в 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");