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)、循环与逐字形求值。
编辑器工作流
[蓝图编辑器] → [动画列表 + 设计视口] → [编译] → [预览仲裁]
- 双击文本动画蓝图(
UTextAnimationBlueprint)进入FTextAnimationBlueprintEditor(Designer / Graph 双模式,7 标签页) - 在动画面板添加字形动画(
UGlyphAnimation),在 Sequencer 时间轴编辑关键帧曲线 - 在 Graph 模式覆盖
BuildDefaultAnimation事件,用 Layer / Factory 节点编排动画 - 点击 编译(Compile)→
FTextAnimationBlueprintCompilerContext→ 生成UTextAnimationBlueprintGeneratedClass - 通过
FPreviewSourceMediator在视口实时预览(StagePreview / GlyphAnimation 两种源)
核心设计理念
- 编译期烘焙,运行时零编译 — 曲线在编译期提取为
FBakedAnimation,运行时仅求值 - 完全 UPROPERTY 安全 —
FBakedStage/FBakedGlyph全部由 UPROPERTY 构成,BlueprintNativeEvent零崩溃风险 - 逐层独立求值 — 消除曲线合并的插值误差与
FRichCurve::Eval外推陷阱 - 指纹缓存 — TextFingerprint(CityHash64 文本)+ BlueprintFingerprint(资产签名 + 变量 + CompileCount)双指纹失效
- 蓝图可编程 — 设计师通过覆盖单一事件完全控制动画行为,Layer / Factory 72+ 蓝图函数可链式编排