Я пытаюсь создать собственный атрибут класса для Unity, который не позволяет целевому MonoBehaviour существовать более чем на одном объекте в сцене. Я провел некоторый поиск, и было сказано, что для того, чтобы получить тип класса, на который нацелен атрибут, я должен использовать конструктор атрибута; это невозможно сделать с помощью отражения
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class DisallowMultipleInScene : Attribute
{
public DisallowMultipleInScene(Type type)
{
// Do stuff with type here
}
}
Если я не ошибаюсь, это означает, что использование его в классе, например в классе ManagerManager, будет достигнуто следующим образом:
[DisallowMultipleInScene(typeof(ManagerManager))]
public class ManagerManager : MonoBehaviour
{
// Implementation
}
Это кажется немного избыточным и также позволило бы передать неверное имя класса. Для запрета размещения нескольких компонентов (классов, унаследованных от MonoBehaviour) на одном объекте используется атрибут [DisallowMultipleComponent]
. Этот атрибут похож на то, что я хотел бы. От вас не требуется указывать имя класса, к которому он применяется, просто кажется, что он знает.
Я посмотрел источник в UnityCsReference GitHub, пытаясь узнать, как он работает. за кулисами, но, похоже, не было никакой реализации, только определение, расположенное здесь , приведенное ниже:
[RequiredByNativeCode]
[AttributeUsage(AttributeTargets.Class, Inherited = false)]
public sealed class DisallowMultipleComponent : Attribute {}
Так что для моей собственной реализации, работать аналогично [DisallowMultipleComponent]
атрибут, мой атрибут должен был бы определить класс, к которому он применяется, и получить ссылку на скрипт MonoBehaviour, чтобы его можно было удалить из объекта, к которому он был только что добавлен.
Итак, во-первых, Как атрибуту [DisallowMultipleComponent]
удается обойти требование передачи типа класса в качестве параметра атрибута и как я могу это сделать?
И, во-вторых, как получить ссылку на недавно создан экземпляр класса с аннотированным атрибутом?