动画轨道与关键帧

Texturge 提供 10 条类型化动画轨道,每条轨道控制 FAnimationFrameData 的一个属性分量。多条轨道组合叠加,形成完整的逐字符动画效果。

轨道模型

FTextAnimationTrack 结构

struct FTextAnimationTrack
{
    FGuid TrackId;          // 轨道唯一标识符
    FName TrackName;        // 轨道名称(蓝图辨识用)
    ETextAnimationTrackType TrackType;  // 轨道类型(决定控制哪个属性)
    float StartTime;        // 起始时间(秒)
    float Duration;         // 持续时间(秒)
    float TrackWeight;      // 轨道权重(0~1)
    bool bEnabled;          // 是否启用
    bool bInvertOpacity;    // 透明度反转(仅不透明度轨道)
    ETextAnimationBlendMode BlendMode;  // 混合模式
    TArray<FKeyFrame> KeyFrames;        // 关键帧数组
    // -- 字符应用与时序 --
    ECharacterApplicationMode ApplicationMode;  // 应用模式
    int32 ApplicationInterval;      // 间隔数
    bool bApplyToFirstChar;         // 是否应用首字符
    float RandomProbability;        // 随机占比
    ETextAnimationTimingMode TimingMode;  // 时序模式
    float TotalTextDuration;        // 总文本时长
    int32 CharacterDelayFrames;     // 字符间延迟帧数
};

轨道类型总览

浮点属性

轨道枚举值对应 FAnimationFrameData 字段说明
不透明度OpacityOpacity (0~1)字符透明/显现效果。配合 bInvertOpacity 可实现默认隐藏→揭示。
字间距LetterSpacingLetterSpacing (px)字符间距的逐字动画
旋转角度RotationRotation (度)字符旋转,以 Pivot 为中心

二维向量属性

轨道枚举值对应字段说明
平移TranslationPositionOffset (px)字符位置偏移。X/Y 独立控制
缩放ScaleScale (X/Y)字符缩放比例。(1,1) = 原始大小
修剪ShearShear (X/Y)剪切变换。(0,0) = 无修剪
枢纽PivotPivot (0~1)变换枢轴。(0.5,0.5) = 字符中心
阴影偏移ShadowOffsetShadowOffset (px)字符阴影的位置偏移

颜色属性

轨道枚举值对应字段说明
染色ColorColor字符颜色。可与原文本颜色混合
阴影染色ShadowColorShadowColor字符阴影颜色。Transparent = 无阴影

帧数据结构

每个字符在每一帧的完整状态由 FAnimationFrameData 结构体描述:

struct FAnimationFrameData
{
    // 变换
    FVector2D PositionOffset;  // 位置偏移
    FVector2D Scale;           // 缩放 (1,1)
    float Rotation;            // 旋转角度
    FVector2D Shear;           // 修剪变换
    FVector2D Pivot;           // 变换枢轴 (0.5,0.5)
    // 颜色
    FLinearColor Color;        // 染色 (白色 = 不染色)
    float Opacity;             // 不透明度 (1 = 完全显示)
    // 阴影
    FVector2D ShadowOffset;    // 阴影偏移
    FLinearColor ShadowColor;  // 阴影颜色
    // 排版
    float LetterSpacing;       // 字间距 (0 = 默认)
};

恒等帧(Identity Frame)是所有属性为默认值的帧数据——Opacity=1, Scale=(1,1), Color=White, Pivot=(0.5,0.5),其余属性为 0。未揭示字符返回恒等帧(Opacity 为 0),不产生可见渲染。

关键帧系统

FKeyFrame 结构

struct FKeyFrame
{
    FGuid KeyId;                // 关键帧唯一标识
    float Time;                 // 时间(相对轨道起始,秒)
    float FloatValue;           // Float 类型值
    FVector2D Vector2DValue;    // Vector2D 类型值
    FLinearColor ColorValue;    // Color 类型值
    EKeyInterp InterpType;      // 插值类型
};

每个关键帧根据轨道的值类型仅使用对应字段——Float 轨道使用 FloatValue,Vector2D 轨道使用 Vector2DValue,Color 轨道使用 ColorValue

插值类型

插值枚举值曲线形态
线性Linear匀速直线过渡
三次Cubic贝塞尔平滑曲线
常量Constant无过渡,保持至下一关键帧
三次缓入缓出CubicInOutS 形缓动曲线

插值在 UTextAnimInstance 的静态方法中实现:

  • InterpolateKeyFramesFloat() — 浮点插值
  • InterpolateKeyFramesVector2D() — 向量插值
  • InterpolateKeyFramesColor() — 颜色插值

轨道混合模式

多条轨道叠加时,通过混合模式控制轨道间的相互作用:

混合模式枚举值行为
加法混合Additive将轨道结果逐项加到基础值上
覆盖混合Override轨道结果完全替代基础值
乘法混合Multiply将轨道结果与基础值逐项相乘
交叉淡化CrossFade轨道结果与基础值按权重交叉过渡

混合在 UTextAnimInstance::BlendFrames() 中执行,按轨道权重(TrackWeight)加权。

字符应用模式

决定动画效果应用到哪些字符:

模式枚举值说明
逐字符PerCharacter所有字符均应用动画效果(默认)
间隔Interval每间隔 N 个字符应用动画。由 ApplicationIntervalbApplyToFirstChar 控制
随机RandomRandomProbability 比例随机选择字符应用动画

时序模式

决定每字符动画的时长计算方式。FTextAnimationTrack 中的 ETextAnimationTimingMode 与 Sequencer 根轨道的 EDurationMode 为对应关系:

Sequencer 根轨道标签轨道结构体标签枚举值说明
每字符时长字符动画时长PerCharacterDuration每字符动画独立计时,总时长 = 字符数 × Duration
固定总时长总文本动画时长TotalDuration所有字符在指定总时长内均匀分布完成

CharacterDelayFrames 控制字符间的起始延迟(帧数),0 表示所有字符同时开始动画。

images/track-editor-interface.png — 三格横向布局:轨道列表面板(添加/删除/排序)、关键帧曲线编辑器(Linear/Cubic/Constant 对比)、轨道混合模式与字符应用模式选择器
images/ten-track-types-comparison.png — 2×5 方格矩阵,展示 10 条轨道类型在最大值时的逐字符渲染效果对比:不透明度/字间距/旋转/平移/缩放/修剪/枢纽/阴影偏移/染色/阴影染色