Texturge Beta 架构总览

Texturge 是一个 UE 5.6+ 高性能模块化字形处理与文本动画引擎插件。核心目标是将静态文本转化为可逐字形驱动的动画:编译期把设计师在蓝图中编排的动画烘焙为运行时高效数据结构,运行时逐帧求值并经 UMG/Slate 高性能呈现。

模块划分

Texturge 由两个模块构成:

模块加载阶段职责
Texturge(Runtime)Default烘焙编译器、曲线数据、蓝图资产、阶段控制器、UMG 控件、富文本解析、Unicode、本地化
TexturgeEditor(Editor)Default(仅编辑器)动画蓝图编辑器、设计器视口、预览仲裁、Sequencer 轨道编辑、Details 定制

NOTE

Texturge 不存在独立的 Baker 或 Renderer 模块。动画编译在运行时模块的纯函数编译器(FAnimationCompiler)中完成,运行时渲染由 UMG/Slate 原生管线处理。

数据流

编译时(Bake)

输入: UTextAnimationBlueprint + FString Text

  ├─ FAnimationCompiler::BuildScheduleInfos(Text)
  │     → TArray<FGlyphScheduleInfo>(预填索引、字符、字形分类)

  ├─ FAnimationCompiler::BakeAllStages(BP, Text, Customizer)
  │     ├─ 创建临时 UTextAnimInstance → ProcessEvent 调用 BP 事件
  │     │     └─ BuildDefaultAnimation(GlyphCount, Text) → FBakedStage
  │     │           └─ 默认实现:CreateLayer → CreateFactory → AddLayer → Bake()
  │     │                 └─ UGlyphAnimationFactory::Bake()(三步管线)
  │     │                       STEP 1:  逐层独立烘焙 BakeStageWithCurves
  │     │                       STEP 1.5: 应用 Layer 级 GlyphCurveOverrides
  │     │                       STEP 2:  逐字形逐层拷贝 → FPerLayerCurves
  │     │                       STEP 3:  工厂级后处理(调度/微调/动画剪切)
  │     └─ 组装 FBakedAnimation(Intro/Default/Outro + 双指纹)

  └─ 输出: FBakedAnimation(默认缓存于 UTextAnimInstance::CachedBakedAnimation)

运行时(Evaluate)

UAnimatedTextBlock (UMG)
  └─ UTextAnimationStageController::TickAnimation(dt)
       ├─ 推进 StageTime,检测阶段边界(TransitionTo)
       └─ EvaluateAllGlyphs(OutStates)
             └─ FBakedGlyph::Evaluate(StageTime, OutState)
                   └─ 逐层 FPerLayerCurves::Evaluate(LocalTime, InOutState)
                         ├─ 21 通道:BuildRichCurveFromKeys → Eval
                         └─ 按 BlendMode 组合(空通道跳过)
  └─ OnPaint 读取 FGlyphAnimationState 逐字形 → Slate 绘制

核心数据结构

FBakedAnimation(非 USTRUCT,TUniquePtr 持有)
  ├── TUniquePtr<FBakedStage> IntroStage     ← 可为 nullptr
  ├── TUniquePtr<FBakedStage> DefaultStage   ← 通常有效
  ├── TUniquePtr<FBakedStage> OutroStage     ← 可为 nullptr
  ├── uint64 TextFingerprint / BlueprintFingerprint
  └── FBakedStage(USTRUCT,完全 UPROPERTY)
        ├── EAnimationStage StageType
        ├── int32  GlyphCount / float TotalDuration
        └── TArray<FBakedGlyph> Glyphs
              └── FBakedGlyph(USTRUCT)
                    ├── OriginalIndex / StartTime / Duration
                    ├── bIsStatic / DefaultState / bHideFirstFrame
                    ├── TArray<FPerLayerCurves> LayerCurves   ← 每层独立 21 通道
                    │     └── FPerLayerCurves
                    │           ├── BlendMode / PlayDirection / NumberOfLoops
                    │           ├── PlaySpeedMultiplier / LayerDuration
                    │           └── 21 × TArray<FRichCurveKey>
                    └── FGlyphCurveOverride FactoryOverride   ← 工厂级微调

字形动画状态

FGlyphAnimationState(10 字段)是运行时单字形渲染状态:

分组字段
变换PositionOffset(FVector2D)、Scale(FVector2D)、Rotation(float)、Shear(FVector2D)、Pivot(FVector2D)
颜色Color(FLinearColor,RGB=染色色,A=染色占比)、Opacity(float)
阴影ShadowOffset(FVector2D)、ShadowColor(FLinearColor)
排版LetterSpacing(float)

21 通道指的是 FPerLayerCurves 的曲线通道数:3(Float)+ 5×2(Vector2D 分量)+ 2×4(Color 分量)= 21,每条通道对应一个 TArray<FRichCurveKey>

三层架构

UMG 表现层        UAnimatedTextBlock / UAnimatedRichTextBlock
   │                OnPaint 驱动 Tick + Slate 逐字形绘制
动画控制层        UTextAnimationStageController / UTextAnimator
   │                播放、暂停、阶段转换、求值
数据资产层        UTextAnimationBlueprint / UGlyphAnimation / FBakedAnimation
                   编译期烘焙结果 + 指纹缓存

运行时控制

UTextAnimationStageController 是运行时播放引擎:维护播放状态与阶段时钟,推进时间并在播放完成后广播 OnAnimationComplete,支持播放/暂停/恢复/停止、播放方向(Forward / Reverse / PingPong)、循环与逐字形求值。

编辑器工作流

[蓝图编辑器] → [动画列表 + 设计视口] → [编译] → [预览仲裁]
  1. 双击文本动画蓝图UTextAnimationBlueprint)进入 FTextAnimationBlueprintEditor(Designer / Graph 双模式,7 标签页)
  2. 在动画面板添加字形动画UGlyphAnimation),在 Sequencer 时间轴编辑关键帧曲线
  3. 在 Graph 模式覆盖 BuildDefaultAnimation 事件,用 Layer / Factory 节点编排动画
  4. 点击 编译(Compile)→ FTextAnimationBlueprintCompilerContext → 生成 UTextAnimationBlueprintGeneratedClass
  5. 通过 FPreviewSourceMediator 在视口实时预览(StagePreview / GlyphAnimation 两种源)

核心设计理念

  1. 编译期烘焙,运行时零编译 — 曲线在编译期提取为 FBakedAnimation,运行时仅求值
  2. 完全 UPROPERTY 安全FBakedStage / FBakedGlyph 全部由 UPROPERTY 构成,BlueprintNativeEvent 零崩溃风险
  3. 逐层独立求值 — 消除曲线合并的插值误差与 FRichCurve::Eval 外推陷阱
  4. 指纹缓存 — TextFingerprint(CityHash64 文本)+ BlueprintFingerprint(资产签名 + 变量 + CompileCount)双指纹失效
  5. 蓝图可编程 — 设计师通过覆盖单一事件完全控制动画行为,Layer / Factory 72+ 蓝图函数可链式编排
images/architecture-overview.png — 架构总览图:左半编译期(UTextAnimationBlueprint + 文本 → FAnimationCompiler → FBakedAnimation 三阶段),右半运行时(UTextAnimationStageController → FBakedGlyph::Evaluate → FGlyphAnimationState → UAnimatedTextBlock 渲染),中间为 UGlyphAnimationLayer/UGlyphAnimationFactory 烘焙管线 — Architecture overview diagram: left shows compile-time (UTextAnimationBlueprint + text → FAnimationCompiler → FBakedAnimation with three stages), right shows runtime (UTextAnimationStageController → FBakedGlyph::Evaluate → FGlyphAnimationState → UAnimatedTextBlock rendering), with Layer/Factory bake pipeline in the middle
images/data-flow.png — 数据流图:编译期输入(蓝图资产 GlyphAnimations + StageTransitionConfig、源文本)→ BuildScheduleInfos 与 BuildDefaultAnimation 事件 → UGlyphAnimationFactory 三步烘焙 → FBakedAnimation 双指纹缓存;运行时 StageController Tick → 逐层求值 → OnPaint 逐字形 Slate 绘制 — Data flow diagram: compile-time inputs (blueprint GlyphAnimations + StageTransitionConfig, source text) → BuildScheduleInfos and BuildDefaultAnimation event → factory three-step bake → FBakedAnimation with dual fingerprint cache; runtime StageController Tick → per-layer evaluation → per-glyph Slate drawing in OnPaint