namespace GFramework.Godot.Text.Effects; /// /// 为文本提供逐字符飞入效果。 /// [GlobalClass] [Tool] public partial class RichTextFlyInEffect : RichTextEffectBase { private readonly bool _animatedEffectsEnabled; /// /// 初始化飞入效果。 /// /// 是否允许动态效果实际生效。 public RichTextFlyInEffect(bool animatedEffectsEnabled = true) { _animatedEffectsEnabled = animatedEffectsEnabled; } /// /// 获取标签名。 /// protected override string TagName => "fly_in"; /// /// 应用飞入动画。 /// /// 当前字符上下文。 /// 始终返回 public override bool _ProcessCustomFX(CharFXTransform charFx) { if (!_animatedEffectsEnabled) { return true; } var startOffset = new Vector2( GetFloat(charFx, "offset_x", 12f), GetFloat(charFx, "offset_y", 0f)); var speed = GetFloat(charFx, "speed", 3.0f); var tick = GetFloat(charFx, "tick", 0.015f); var progress = Mathf.Clamp((float)(charFx.ElapsedTime * speed - charFx.RelativeIndex * tick), 0f, 1f); var eased = EaseOutQuad(progress); charFx.Offset += startOffset * (1f - eased); var color = charFx.Color; color.A = eased; charFx.Color = color; ApplyVisibility(charFx); return true; } /// /// 计算二次缓出值。 /// /// 归一化进度。 /// 缓出后的进度。 private static float EaseOutQuad(float value) { return 1f - (1f - value) * (1f - value); } }