Перейти к основному содержимому

ComponentTypeSelector

Класс компонента меняется прямо в инспекторе, а общие поля сохраняют значения.

Быстрый старт​

public abstract class EnemyBase : MonoBehaviour
{
[SerializeField] private ComponentTypeSelector _enemyType;
[SerializeField] private float _health = 100f;
}
FastEnemy.csArmoredEnemy.cs
public sealed class FastEnemy : EnemyBase
{
[SerializeField]
private float _speed = 25f;
}
public sealed class ArmoredEnemy : EnemyBase
{
[SerializeField]
private int _armor = 10;
}

Список предлагает конкретных наследников класса, где объявлено поле; пункта <None> нет.

Выбор ArmoredEnemy вместо FastEnemy сохраняет Health = 75Выбор ArmoredEnemy вместо FastEnemy сохраняет Health = 75

ПолеFastEnemyВыбран ArmoredEnemyСнова FastEnemy
Health757575
Speed40—25
Armor—10—

Когда тип не меняется​

Смена следует правилам Add Component: сначала добавляет компоненты из [RequireComponent] нового класса, и один Undo откатывает её вместе с ними. Класс остаётся прежним, а Console показывает предупреждение, если:

  • у класса нет своего файла скрипта с тем же именем — например, вложенный класс или второй класс в файле;
  • новый класс помечен [DisallowMultipleComponent], а такой компонент на GameObject уже есть;
  • смена убрала бы класс, который нужен другому компоненту;
  • новому классу нужен компонент, который нельзя добавить, например абстрактный Collider.

Пример в пакете​

Переключение типа компонента показано в примере Types.