Стандарт компонентов конфигурации определяет базовый формат компонентов типа Configuration, и позволяет создавать собственные Configuration-компоненты с минимальными трудозатратами. Общий вид компонента конфигурации выглядит следующим образом:
В поле Active Mode отображается активный режим конфигурации, который устанавливается/читается другими компонентами. Затем следует список режимов конфигурации, в каждом из которых указывается уникальное имя и выставляются произвольные настройки.
Стандарт состоит из двух компонентов: ComponentBaseConfiguration и ComponentBaseConfigurationEditor.
ComponentBaseConfiguration является родительским классом для всех компонентов конфигурации. Он содержит в себе определение параметра Active Mode, а также Generic-класс ConfigurationBase, от которого наследуются все классы режимов конфигурации.
ComponentBaseConfigurationEditor отвечает за отрисовку (сериализацию) компонентов конфигурации в редакторе Unity. От него наследуются все Editor-компоненты компонентов конфигурации.
Для того, чтобы реализовать собственный компонент конфигурации, необходимо создать класс, наследующийся от ComponentBaseConfiguration, и класс, наследующийся от ComponentBaseConfigurationEditor. В представленном примере ниже данные классы называются ComponentExampleConfiguration и ComponentExampleConfigurationEditor соответственно.
using System.Collections.Generic;
using UnityEngine;
public class ComponentExampleConfiguration : ComponentBaseConfiguration
{
[SerializeField, HideInInspector] protected List<Entry> Configurations;
public Vector3 this[string key] {
get { return Configurations.Find(x => x.key == key).value; }
}
[System.Serializable] public class Entry : ConfigurationBase<Vector3> { }
}
В любом наследнике ComponentBaseConfiguration должен присутствовать список записей по имени Configurations, который должен быть помечен атрибутом [SerializeField]. Также необходимо объявить класс записей Entry, который должен наследоваться от Generic-класса ConfigurationBase, и пометить его атрибутом [System.Serializable].
using UnityEditor;
[CustomEditor(typeof(ComponentExampleConfiguration))]
public class ComponentExampleConfigurationEditor : ComponentBaseConfigurationEditor
{
}
Всё, что необходимо сделать в данном компоненте - это унаследоваться от ComponentBaseConfigurationEditor и указать тип собственного компонента конфигурации в атрибуте [CustomEditor].