Общая схема работы

Стандарт компонентов конфигурации определяет базовый формат компонентов типа Configuration, и позволяет создавать собственные Configuration-компоненты с минимальными трудозатратами. Общий вид компонента конфигурации выглядит следующим образом:

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/983419f6-d288-4506-a416-83ffe74b569d/Untitled.png

В поле Active Mode отображается активный режим конфигурации, который устанавливается/читается другими компонентами. Затем следует список режимов конфигурации, в каждом из которых указывается уникальное имя и выставляются произвольные настройки.

Стандарт состоит из двух компонентов: ComponentBaseConfiguration и ComponentBaseConfigurationEditor.

Component Base Configuration

ComponentBaseConfiguration является родительским классом для всех компонентов конфигурации. Он содержит в себе определение параметра Active Mode, а также Generic-класс ConfigurationBase, от которого наследуются все классы режимов конфигурации.

Component Base Configuration Editor

ComponentBaseConfigurationEditor отвечает за отрисовку (сериализацию) компонентов конфигурации в редакторе Unity. От него наследуются все Editor-компоненты компонентов конфигурации.

Создание собственного компонента конфигурации

Для того, чтобы реализовать собственный компонент конфигурации, необходимо создать класс, наследующийся от ComponentBaseConfiguration, и класс, наследующийся от ComponentBaseConfigurationEditor. В представленном примере ниже данные классы называются ComponentExampleConfiguration и ComponentExampleConfigurationEditor соответственно.

ComponentExampleConfiguration.cs

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].

ComponentExampleConfigurationEditor.cs

using UnityEditor;
[CustomEditor(typeof(ComponentExampleConfiguration))]
public class ComponentExampleConfigurationEditor : ComponentBaseConfigurationEditor
{
}

Всё, что необходимо сделать в данном компоненте - это унаследоваться от ComponentBaseConfigurationEditor и указать тип собственного компонента конфигурации в атрибуте [CustomEditor].

Ограничения