Auto attach components

Небольшое

Привет, я сделал плагин, который позволит быстро и удобно цеплять компоненты к полям в инспекторе

Для начала пример кода

using Nrjwolf.Tools.AttachAttributes; [FindObjectOfType] [SerializeField] private Camera m_Camera; [GetComponent] [SerializeField] private Image m_Image; [GetComponentInChildren(true)] // include inactive [SerializeField] private Button m_Button; [GetComponentInChildren("Buttons/Button1")] // Get the component from the children by path "Buttons/Button1" in hierarchy [SerializeField] private Button m_Button; [AddComponent] // Add component in editor and attach it to field [SerializeField] private SpringJoint2D m_SpringJoint2D;

Названия атрибутов говорят сами за себя. Вызываются они как только вы переходите в инспектор и выбираете GameObject на котором прицеплен этот скрипт.

Поводом для написания такого решения послужила проблема с null override, дело в том, что программист ленивый и не хочет каждый раз делать drag&drop, или же цеплять компонент в Awake/Start. В связи с этим, часто можно увидеть подобные конструкции.

private Transform m_CachedTransform public Transform transform { get { if (m_CachedTransform == null) m_CachedTransform = InternalGetTransform(); return m_CachedTransform; } }

Сами по себе такие штуки не представляют опасности, но при использовании их для компонентов в Юнити возникает серьезная проблема. Операция проверки на null, переписана в самом движке, из-за этого такая проверка негативно сказывается на производительности, настолько, что лучше написать просто GetComponent<T>. Ниже тред на эту тему.

По этой же причине, не стоит проверять на null через ? — результаты могут быть неожиданными.

В итоге я решил эту проблему через атрибуты и пользуюсь этим каждый день.

Установка проста, нужно лишь добавить в manifest.json :

"nrjwolf.games.attachattributes": "https://github.com/Nrjwolf/unity-auto-attach-component-attributes.git"
Полезно будет иногда отключать плагин, если нужно воспользоваться drag&amp;drop
Полезно будет иногда отключать плагин, если нужно воспользоваться drag&drop

Сам репозиторий, буду рад звездам :

Если вы используете VSCode, то может вам будут полезны и мои снипеты для более быстрой работы с атрибутами. Обычно использую эти два, за редким исключением.

"FindObjectOfType attribute": { "prefix": "findObjectOfTypeAttribute", "body": [ "[FindObjectOfType] [SerializeField] private $COMPONENT m_$COMPONENT;", "public $COMPONENT $COMPONENT { get => m_$COMPONENT; }" ], "description": "Get Component" }, "Private serialize field": { "prefix": "getComponentAttribute", "body": [ "[GetComponent] [SerializeField] private $COMPONENT m_$COMPONENT;", "public $COMPONENT $COMPONENT { get => m_$COMPONENT; }" ], "description": "Get Component" },
33 показа
624624 открытия
11 репост
26 комментариев

Почему бы в Awake вместо этого один раз не проинициализировать?

Ответить

Хватит кешировать трансформ. Уже давно в Юнити он правильно закеширован во встроенное переменной transform. В старых версиях да, с ним была проблема

Ответить

И так в каждом классе с каждым полем? А если переменную переименовали? опять лезть в Awake? Программисты ведь ленивые)

Решение автора очень элегантное и быстрое

Ответить

с таким же успехом можно спросить, а почему б не закэшировать автоматом через OnValidate/Reset?

Ответить

Я так и написал в статье, что есть два решения которые работают для юнити:

1. Drag&drop
2. Прописывать в Awake/Start

Оба метода требуют "ручной" работы, также можно забыть прописать что-то в Start, особенно при добавлении нового поля. 

Решением было автоматизировать один из методов, дописывать код в файлах сликшом жестко, а воспользоваться чудными возможностями юнити редактора мне показалось отличной идеей. 

В итоге я пользуюсь плагином каждый день и во всех своих проектах. Считаю что вышло очень удобно, у без вредительства. 

Ответить

По видео все очень здорово!

Ответить

void Reset ()
{
if (_SuperComponent==null) _SuperComponent =gameObject.AddComponent(SuperComponent);
}
вот такую штуку делаешь и когда компонент добавляешь на объект он сам создает то чего ему не хватает, туда же можно и поиски всякие добавлять. Плагины для этого не нужны :)

Ответить