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" },
16
26 комментариев