Skip to content

Latest commit

 

History

History
66 lines (41 loc) · 8.41 KB

File metadata and controls

66 lines (41 loc) · 8.41 KB

Neo.NoCode — привязка float к UI без лишних скриптов

Сборка Neo.NoCode (Assets/Neoxider/Scripts/NoCode/) даёт компоненты, которые читают число с поля или свойства другого компонента (или из ReactivePropertyFloat / ReactivePropertyInt / ReactivePropertyBool) и обновляют текст или индикатор прогресса (Slider / Image).

Рефлексия выполняется только при резолве и после инвалидации кеша; границы No-Code описаны прямо в этом разделе: настройка через Inspector, безопасные списки компонентов/полей и без произвольного визуального программирования.

UX-дисциплина и C# контракт

NoCode — это слой привязки данных к UI, а не скрытая игровая логика в инспекторе. Новые возможности должны иметь проверяемый C# контракт и EditMode/PlayMode тесты до добавления удобных inspector-настроек.

NoCode работает на сцене: компоненты читают другие scene components, а ScriptableObject-ассеты не должны хранить ссылки на объекты сцены. Если настройка живёт в SO, храните только данные/слоты/ключи, а конкретные GameObject задавайте на сценовом компоненте.

Текущий контракт ComponentFloatBinding:

  • источники данных — только читаемые поля и читаемые неиндексируемые свойства компонентов;
  • методы по строковому имени не являются источниками и не вызываются;
  • ReactivePropertyFloat, ReactivePropertyInt, ReactivePropertyBool поддерживаются как значения источника;
  • GameObject.Find разрешён только как явный Find By Name fallback с retry-интервалом, а не как основная архитектура.

Если нужна бизнес-логика, вынесите её в обычный C# компонент/сервис, покройте тестами и отдайте в NoCode только итоговое поле, свойство или reactive-состояние.

Компоненты

Компонент Назначение
NoCodeBindText Вызывает SetText.Set(float) на том же объекте (или по ссылке), иначе пишет значение в TMP_Text (инвариантная строка).
NoCodeFormattedText Форматирует несколько числовых источников в одну строку через String.Format, например "{0:0} / {1:0}" или `"Level {0:0}
SetProgress Маппинг значения в ([0,1]) через InverseLerp(min, max, value)Slider.normalizedValue и/или Image.fillAmount.

Меню создания: Neoxider → NoCode → …

Настройка источника

Общий блок ComponentFloatBinding у NoCodeBindText, NoCodeFormattedText и SetProgress (в инспекторе — секция Binding или список Sources):

  1. Find By Name — как в NeoCondition: искать корневой GameObject через GameObject.Find по строке Object Name вместо прямой ссылки.
  2. Object Name — имя объекта в активной сцене (при включённом Find By Name).
  3. Wait For Object — если объект ещё не появился (спавн, префаб), можно включить ожидание без однократного предупреждения в консоли (логика в BindingSourceGameObjectResolver; не блокирует кадр).
  4. Find Retry Interval (sec) — как в NeoCondition: не чаще чем раз в N секунд повторять GameObject.Find, пока объект ещё не в сцене. 0 = повторять при каждой проверке (без троттлинга). По умолчанию 1 с.
  5. Prefab Preview (только редактор; как у NeoCondition): если инстанса с нужным именем ещё нет в сцене — перетащите префаб из проекта, чтобы выбрать компонент и поле до появления объекта в сцене. В рантайме не используется.
  6. Source Root — прямой объект для выпадающих списков компонента и члена; показывается только когда Find By Name выключен. Если поле пусто — используется GameObject, на котором висит сам NoCode-компонент.

Те же правила резолва объекта (поиск по имени / ссылка / fallback на хост), что и в условиях, вынесены в общий код BindingSourceGameObjectResolver (сборка Neo.Condition, используется и NoCode).

Component и Member в инспекторе выбираются из выпадающих списков (типы компонентов на источнике и допустимые поля/свойства: число или ReactivePropertyFloat / ReactivePropertyInt / ReactivePropertyBool). Ручные строки типа и члена по-прежнему видны в подсказке «Manual names (advanced)».

Произвольные методы вызова по строке не поддерживаются (в отличие от расширенного режима NeoCondition). Это намеренное ограничение: NoCode не должен превращаться в inspector-only систему поведения без тестируемого C# API.

Режимы обновления

  • Once — один раз при включении компонента.
  • Reactive — если член имеет тип ReactivePropertyFloat, ReactivePropertyInt или ReactivePropertyBool, подписка на изменения через ReactiveProperty (уведомления доставляются и в Edit Mode при тестах/настройке). Если выбран обычный float/int/bool, инспектор покажет небольшую информационную панель, а компонент автоматически будет обновлять значение через poll fallback.
  • Poll — при включённом опросе — обновление в LateUpdate (флаг Poll In Late Update) с интервалом Poll Interval Seconds. По умолчанию 0.16 сек, минимум 0.016 сек.

SetText и привязка к данным

SetText только форматирует и выводит текст. Чтобы подставлять число с другого компонента без своего скрипта, на тот же объект добавьте NoCode Bind Text (Neo.NoCode). Если нужен текст из нескольких значений, используйте NoCodeFormattedText. Оба используют тот же ComponentFloatBinding, что и SetProgress.

Зависимости сборки

Neo.Condition (ReflectionCache, BindingSourceGameObjectResolver), Neo.Reactive, Neo.Extensions, Neo.Tools.Text, Neo.PropertyAttribute, UnityEngine.UI, TextMeshPro.

См. также