PathFollow3D
Управляемое кодом положение и ориентация по Curve родительского Path3D.
Поместите PathFollow3D прямым ребёнком Path3D с пригодной Curve3D, а объект — ребёнком последователя. После входа в дерево задайте Progress или ProgressRatio. Движение не запускается автоматически: для локальной скорости обновляйте Progress += speed * (float)delta в выбранном цикле обработки. Это transform-следование; физические коллизии нужно решать отдельно.
Progress — расстояние, ratio — его доля от текущей baked-длины. Loop повторяет расстояние, но не соединяет открытую геометрию. Родительский масштаб меняет world-скорость. Ранее заданный вне дерева Progress может не нормализоваться на входе, а повтор того же значения в 3D не обновляет transform.
RotationMode=None сбрасывает вращение при обновлении; остальные режимы корректируют кадр пути. UseModelFront переключает +Z/−Z и ось HOffset. Tilt применяется после коррекции осей и может добавить roll при режиме Y. Offset и масштаб — разные операции. Без Curve прежний transform может сохраниться, а ratio стать 0; это не достижение начала.
Проверены малые невырожденные пути и прямые изменения transform в Windows headless. Движение с физическими столкновениями, тайминг анимации, вертикальные/вырожденные orientation cases, gizmos и графика не проверялись.
Объявления сверены с C# SDK 1.0.0. Раскройте имя, чтобы увидеть сигнатуры и описание.
Конструкторы1
PathFollow3DКонструктор
public PathFollow3D();Создаёт Entity3D-последователь с Loop/CubicInterp/TiltEnabled=true, RotationMode=Xyz, UseModelFront=false. Нужен прямой родитель Path3D внутри дерева с пригодной Curve3D. Меняйте Progress самостоятельно; это перемещение transform без физического collision-solving.
Свойства9
CubicInterpСвойство
public bool CubicInterp { get; set; }Кубическая интерполяция baked-кеша, default true. Это не точная Bezier-выборка и не настройка физики; на редком кеше позиция может отличаться от линейного расстояния. Setter меняет флаг без немедленного пересчёта transform. Настройте его до изменения Progress; в 3D повтор того же Progress также не обновляет transform.
HOffsetСвойство
public float HOffset { get; set; }Смещение вдоль локальной X итогового кадра пути после RotationMode/UseModelFront/tilt. UseModelFront меняет знак X и направление такого смещения. Применяется до восстановления собственного Scale последователя; Path3D scale всё равно влияет на world-позицию.
LoopСвойство
public bool Loop { get; set; }При назначении Progress повторяет расстояние по длине; false ограничивает 0..length. Ненулевое кратное длины сохраняется на конце, не обязательно на нуле. Не соединяет концы или касательные открытой геометрии и не включает движение. Само переключение флага не нормализует ранее сохранённое расстояние.
ProgressСвойство
public float Progress { get; set; }Расстояние по baked-кривой родительского Path в локальных единицах, не секунды. Для скорости обновляйте Progress на speed×delta сами; автоматического движения нет. При активном пути setter применяет Loop/clamp. Значение, заданное до входа в дерево, может остаться вне диапазона: инициализируйте после подключения Path/Curve. Масштаб родителя меняет мировую скорость.
ProgressRatioСвойство
public float ProgressRatio { get; set; }Доля текущей baked-длины: setter передаёт ratio×length в Progress. Требуется прямой родитель Path внутри дерева, Curve и ненулевая длина. Значения вне 0..1 подчиняются Loop/clamp, а не отдельно ограничиваются. Getter без пригодного пути возвращает 0, что не доказывает достижение начала. При изменении длины сохраняется расстояние, не прежняя доля.
RotationModeСвойство
public PathFollow3D.RotationModeEnum RotationMode { get; set; }Корректирует базис: None сбрасывает вращение при обновлении, Y оставляет только Euler Y, Xy убирает roll Z, Xyz оставляет все оси; вычисления используют порядок YXZ. Oriented заново строит базис по касательной с Y-up, не сохраняя входной roll. TiltEnabled применяется ПОСЛЕ коррекции и может вернуть наклон при Y/Xy. Для Oriented учитывайте предупреждение о Curve.UpVectorEnabled; вырожденные/вертикальные случаи здесь не доказаны.
TiltEnabledСвойство
public bool TiltEnabled { get; set; }Добавляет tilt Curve3D в радианах после RotationMode и UseModelFront. Поэтому Y-only не гарантирует отсутствие roll при включённом tilt. При RotationMode=None этот этап пропускается. Не задаёт новые tilt-точки кривой.
UseModelFrontСвойство
public bool UseModelFront { get; set; }При включённой ориентации переключает model front на +Z вместо −Z, переворачивая X/Z базиса. Также меняет направление HOffset. Не меняет геометрию Curve или длину и не действует в RotationMode=None.
VOffsetСвойство
public float VOffset { get; set; }Смещение вдоль локальной Y итогового кадра пути, не обязательно world-up. При наклоне Curve оно тоже поворачивается; задавайте конечные локальные единицы.
Методы19
CorrectPostureTransform3D
public static Transform3D CorrectPosture(Transform3D transform, PathFollow3D.RotationModeEnum rotationMode);Статически корректирует Basis входного Transform3D по RotationMode, сохраняя Origin. None ставит единичный Basis; Y/Xy/Xyz пересобирают из нормализованных Euler YXZ; Oriented строит Y-up по −Basis.Z. Не сэмплирует кривую, не применяет UseModelFront/tilt и не сохраняет произвольный scale входного Basis как обещанный контракт. Возвращает значение, не меняет Entity.
| Имя | Тип | По умолчанию |
|---|---|---|
transform | Transform3D | — |
rotationMode | PathFollow3D.RotationModeEnum | — |
transformTransform3D с пригодным направлением/базисом; результат нужно использовать явно.
rotationModeNone, Y, Xy, Xyz или Oriented; смысл осей и tilt указан в описании.
Transform3DНовый Transform3D с сохранённым Origin и скорректированным Basis.
GetCubicInterpolationbool
public bool GetCubicInterpolation();Читает CubicInterp. Кубическая интерполяция baked-кеша, default true. Это не точная Bezier-выборка и не настройка физики; на редком кеше позиция может отличаться от линейного расстояния. Setter меняет флаг без немедленного пересчёта transform. Настройте его до изменения Progress; в 3D повтор того же Progress также не обновляет transform.
boolСохранённая настройка указанного метода; не сигнал движения/готовности.
GetHOffsetfloat
public float GetHOffset();Читает HOffset. Смещение вдоль локальной X итогового кадра пути после RotationMode/UseModelFront/tilt. UseModelFront меняет знак X и направление такого смещения. Применяется до восстановления собственного Scale последователя; Path3D scale всё равно влияет на world-позицию.
floatСохранённая настройка указанного метода; не сигнал движения/готовности.
GetProgressfloat
public float GetProgress();Читает Progress. Расстояние по baked-кривой родительского Path в локальных единицах, не секунды. Для скорости обновляйте Progress на speed×delta сами; автоматического движения нет. При активном пути setter применяет Loop/clamp. Значение, заданное до входа в дерево, может остаться вне диапазона: инициализируйте после подключения Path/Curve. Масштаб родителя меняет мировую скорость.
floatСохранённое локальное расстояние, не секунды/процент.
GetProgressRatiofloat
public float GetProgressRatio();Читает ProgressRatio. Доля текущей baked-длины: setter передаёт ratio×length в Progress. Требуется прямой родитель Path внутри дерева, Curve и ненулевая длина. Значения вне 0..1 подчиняются Loop/clamp, а не отдельно ограничиваются. Getter без пригодного пути возвращает 0, что не доказывает достижение начала. При изменении длины сохраняется расстояние, не прежняя доля.
floatProgress / текущая длина, либо 0 без пригодного пути; не событие достижения.
GetRotationModePathFollow3D.RotationModeEnum
public PathFollow3D.RotationModeEnum GetRotationMode();Читает RotationMode. Корректирует базис: None сбрасывает вращение при обновлении, Y оставляет только Euler Y, Xy убирает roll Z, Xyz оставляет все оси; вычисления используют порядок YXZ. Oriented заново строит базис по касательной с Y-up, не сохраняя входной roll. TiltEnabled применяется ПОСЛЕ коррекции и может вернуть наклон при Y/Xy. Для Oriented учитывайте предупреждение о Curve.UpVectorEnabled; вырожденные/вертикальные случаи здесь не доказаны.
PathFollow3D.RotationModeEnumСохранённая настройка указанного метода; не сигнал движения/готовности.
GetVOffsetfloat
public float GetVOffset();Читает VOffset. Смещение вдоль локальной Y итогового кадра пути, не обязательно world-up. При наклоне Curve оно тоже поворачивается; задавайте конечные локальные единицы.
floatСохранённая настройка указанного метода; не сигнал движения/готовности.
HasLoopbool
public bool HasLoop();Читает Loop. При назначении Progress повторяет расстояние по длине; false ограничивает 0..length. Ненулевое кратное длины сохраняется на конце, не обязательно на нуле. Не соединяет концы или касательные открытой геометрии и не включает движение. Само переключение флага не нормализует ранее сохранённое расстояние.
boolСохранённая настройка указанного метода; не сигнал движения/готовности.
IsTiltEnabledbool
public bool IsTiltEnabled();Читает TiltEnabled. Добавляет tilt Curve3D в радианах после RotationMode и UseModelFront. Поэтому Y-only не гарантирует отсутствие roll при включённом tilt. При RotationMode=None этот этап пропускается. Не задаёт новые tilt-точки кривой.
boolСохранённая настройка указанного метода; не сигнал движения/готовности.
IsUsingModelFrontbool
public bool IsUsingModelFront();Читает UseModelFront. При включённой ориентации переключает model front на +Z вместо −Z, переворачивая X/Z базиса. Также меняет направление HOffset. Не меняет геометрию Curve или длину и не действует в RotationMode=None.
boolСохранённая настройка указанного метода; не сигнал движения/готовности.
SetCubicInterpolationvoid
public void SetCubicInterpolation(bool enabled);Устанавливает CubicInterp. Кубическая интерполяция baked-кеша, default true. Это не точная Bezier-выборка и не настройка физики; на редком кеше позиция может отличаться от линейного расстояния. Setter меняет флаг без немедленного пересчёта transform. Настройте его до изменения Progress; в 3D повтор того же Progress также не обновляет transform.
| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
enabledНовое значение флага; его область действия и момент обновления указаны в описании метода.
SetHOffsetvoid
public void SetHOffset(float hOffset);Устанавливает HOffset. Смещение вдоль локальной X итогового кадра пути после RotationMode/UseModelFront/tilt. UseModelFront меняет знак X и направление такого смещения. Применяется до восстановления собственного Scale последователя; Path3D scale всё равно влияет на world-позицию.
| Имя | Тип | По умолчанию |
|---|---|---|
hOffset | float | — |
hOffsetКонечное смещение в локальном кадре, который зависит от режима ориентации.
SetLoopvoid
public void SetLoop(bool loop);Устанавливает Loop. При назначении Progress повторяет расстояние по длине; false ограничивает 0..length. Ненулевое кратное длины сохраняется на конце, не обязательно на нуле. Не соединяет концы или касательные открытой геометрии и не включает движение. Само переключение флага не нормализует ранее сохранённое расстояние.
| Имя | Тип | По умолчанию |
|---|---|---|
loop | bool | — |
loopВключает wrapping при последующих назначениях Progress; не замыкает геометрию.
SetProgressvoid
public void SetProgress(float progress);Задаёт конечное локальное расстояние и обновляет transform при активном Path3D. В 1.0.0 одинаковое сохранённому значение возвращается ДО нормализации: повторное присваивание не исправит Progress, заданный вне дерева, и не заставит обновиться transform. Инициализируйте после готовности пути и проверяйте границы.
| Имя | Тип | По умолчанию |
|---|---|---|
progress | float | — |
progressКонечное локальное расстояние, не время; Loop/clamp применяются только при пригодном родительском пути.
SetProgressRatiovoid
public void SetProgressRatio(float ratio);Устанавливает ProgressRatio. Доля текущей baked-длины: setter передаёт ratio×length в Progress. Требуется прямой родитель Path внутри дерева, Curve и ненулевая длина. Значения вне 0..1 подчиняются Loop/clamp, а не отдельно ограничиваются. Getter без пригодного пути возвращает 0, что не доказывает достижение начала. При изменении длины сохраняется расстояние, не прежняя доля.
| Имя | Тип | По умолчанию |
|---|---|---|
ratio | float | — |
ratioКонечная доля baked-длины; значения вне 0..1 подчиняются правилу Loop.
SetRotationModevoid
public void SetRotationMode(PathFollow3D.RotationModeEnum rotationMode);Устанавливает RotationMode. Корректирует базис: None сбрасывает вращение при обновлении, Y оставляет только Euler Y, Xy убирает roll Z, Xyz оставляет все оси; вычисления используют порядок YXZ. Oriented заново строит базис по касательной с Y-up, не сохраняя входной roll. TiltEnabled применяется ПОСЛЕ коррекции и может вернуть наклон при Y/Xy. Для Oriented учитывайте предупреждение о Curve.UpVectorEnabled; вырожденные/вертикальные случаи здесь не доказаны.
| Имя | Тип | По умолчанию |
|---|---|---|
rotationMode | PathFollow3D.RotationModeEnum | — |
rotationModeNone, Y, Xy, Xyz или Oriented; смысл осей и tilt указан в описании.
SetTiltEnabledvoid
public void SetTiltEnabled(bool enabled);Устанавливает TiltEnabled. Добавляет tilt Curve3D в радианах после RotationMode и UseModelFront. Поэтому Y-only не гарантирует отсутствие roll при включённом tilt. При RotationMode=None этот этап пропускается. Не задаёт новые tilt-точки кривой.
| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
enabledНовое значение флага; его область действия и момент обновления указаны в описании метода.
SetUseModelFrontvoid
public void SetUseModelFront(bool enabled);Устанавливает UseModelFront. При включённой ориентации переключает model front на +Z вместо −Z, переворачивая X/Z базиса. Также меняет направление HOffset. Не меняет геометрию Curve или длину и не действует в RotationMode=None.
| Имя | Тип | По умолчанию |
|---|---|---|
enabled | bool | — |
enabledНовое значение флага; его область действия и момент обновления указаны в описании метода.
SetVOffsetvoid
public void SetVOffset(float vOffset);Устанавливает VOffset. Смещение вдоль локальной Y итогового кадра пути, не обязательно world-up. При наклоне Curve оно тоже поворачивается; задавайте конечные локальные единицы.
| Имя | Тип | По умолчанию |
|---|---|---|
vOffset | float | — |
vOffsetКонечное смещение в локальном кадре, который зависит от режима ориентации.
PathFollow3D.RotationModeEnum
| Значение | Описание |
|---|---|
None = 0 | При обновлении PathFollow3D сбрасывает вращение к единичному базису, сохраняя собственный scale отдельно. Не сохраняет ручной угол как Rotates=false у 2D. UseModelFront и tilt в этой ветке не применяются. |
Oriented = 4 | В текущей реализации CorrectPosture пересобирает кадр по касательной −Basis.Z с Y-up через looking_at, не сохраняя входной roll/up-базис целиком. Оставьте Curve.UpVectorEnabled согласно предупреждению редактора; это не обещание сохранения всех cached up-векторов после коррекции. Затем могут применяться UseModelFront и tilt. Вертикальные/вырожденные случаи здесь не проверены. |
Xy = 2 | При коррекции Euler YXZ сохраняет X/Y и обнуляет Z. Наклон Curve при TiltEnabled добавляется после коррекции, поэтому результат не обязан оставаться без roll. |
Xyz = 3 | Использует все оси скорректированного кадра пути; default PathFollow3D. Это не сохранение произвольной ручной ориентации объекта: базис берётся из Curve, затем учитываются UseModelFront и tilt. |
Y = 1 | Оставляет Euler Y при коррекции базиса в порядке YXZ. TiltEnabled применяется позднее и может добавить roll; отключите tilt, если он не нужен. Это правило локального кадра пути, не physics-ограничение вращения. |