Сборка Neo.NoCode (Assets/Neoxider/Scripts/NoCode/) даёт компоненты, которые читают число с поля или свойства другого компонента (или из ReactivePropertyFloat / ReactivePropertyInt / ReactivePropertyBool) и обновляют текст или индикатор прогресса (Slider / Image).
Рефлексия выполняется только при резолве и после инвалидации кеша; границы No-Code описаны прямо в этом разделе: настройка через Inspector, безопасные списки компонентов/полей и без произвольного визуального программирования.
NoCode — это слой привязки данных к UI, а не скрытая игровая логика в инспекторе. Новые возможности должны иметь проверяемый C# контракт и EditMode/PlayMode тесты до добавления удобных inspector-настроек.
NoCode работает на сцене: компоненты читают другие scene components, а ScriptableObject-ассеты не должны хранить ссылки на объекты сцены. Если настройка живёт в SO, храните только данные/слоты/ключи, а конкретные GameObject задавайте на сценовом компоненте.
Текущий контракт ComponentFloatBinding:
- источники данных — только читаемые поля и читаемые неиндексируемые свойства компонентов;
- методы по строковому имени не являются источниками и не вызываются;
ReactivePropertyFloat,ReactivePropertyInt,ReactivePropertyBoolподдерживаются как значения источника;GameObject.Findразрешён только как явныйFind By Namefallback с 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):
- Find By Name — как в NeoCondition: искать корневой
GameObjectчерезGameObject.Findпо строке Object Name вместо прямой ссылки. - Object Name — имя объекта в активной сцене (при включённом Find By Name).
- Wait For Object — если объект ещё не появился (спавн, префаб), можно включить ожидание без однократного предупреждения в консоли (логика в
BindingSourceGameObjectResolver; не блокирует кадр). - Find Retry Interval (sec) — как в NeoCondition: не чаще чем раз в N секунд повторять
GameObject.Find, пока объект ещё не в сцене. 0 = повторять при каждой проверке (без троттлинга). По умолчанию 1 с. - Prefab Preview (только редактор; как у
NeoCondition): если инстанса с нужным именем ещё нет в сцене — перетащите префаб из проекта, чтобы выбрать компонент и поле до появления объекта в сцене. В рантайме не используется. - 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 только форматирует и выводит текст. Чтобы подставлять число с другого компонента без своего скрипта, на тот же объект добавьте NoCode Bind Text (Neo.NoCode). Если нужен текст из нескольких значений, используйте NoCodeFormattedText. Оба используют тот же ComponentFloatBinding, что и SetProgress.
Neo.Condition (ReflectionCache, BindingSourceGameObjectResolver), Neo.Reactive, Neo.Extensions, Neo.Tools.Text, Neo.PropertyAttribute, UnityEngine.UI, TextMeshPro.
SetText:Tools/Text/SetText.md- Условия и тот же стиль резолва объекта/полей:
Condition/NeoCondition.md