尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Godot UI 动画实战:3 种界面过渡 + 缓动调参,从入门到落地

Godot UI 动画实战:3 种界面过渡 + 缓动调参,从入门到落地 Godot UI 动画实战3 种界面过渡 缓动调参从入门到落地【免费下载链接】godot-docsGodot Engine official documentation项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs一、从一个具体场景说起你肯定刷到过这种画面角色挨了一记重击血条从满格缓缓掉到半血而不是瞬移菜单里点一下设置侧边面板从屏幕右缘滑出落定时有那么 0.2s 的减速收尾。这些 Godot UI 动画与界面过渡本身都不难写难的是别写糙——观感差往往就输在时长、缓动和出场时机这三处。本文按能直接跑的标准来写先给淡入淡出、滑动入场、缩放弹跳三种动态效果的完整代码再往下讲缓动调参、页面切换、按钮反馈、性能检查与排错。二、先认清 Godot 里能做动画的三件套别一上来就在编辑器里摆 AnimationPlayer。Godot 动画这套工具里真正常用的是下面三位选错了后面全是返工组件一句话定位典型场景典型时长AnimationPlayer把关键帧录成可复用资源编辑器里可视化调参循环待机、反复使用的界面过渡模板0.2s数秒可循环Tween代码里一条链把属性从 A 插到 B起点终点运行时才知道的一次性反馈0.1s0.5sAnimationTree在多个 Animation 之间做混合与状态切换多页签、多层面板的组合调度取决于子动画一句话记忆0.3s 以内的一次性交互优先 Tween需要反复播放、要在编辑器里肉眼调参的交给 AnimationPlayer多个动画要交叉淡入才轮到 AnimationTree。三、三个最值钱的过渡效果UI 淡入淡出实现代码给你写到能跑下面三招基本能覆盖 90% 的界面过渡需求。统一用 Tween 写——交互反馈的起点终点几乎都是运行时才确定的这正是手写 Tween 比录关键帧省事的地方。淡入淡出0.25s 的浮现感预期效果面板透明度从 0 涨到 10.25s 完成看起来是浮现而不是突然亮起。这段代码把一个 Control 的透明度推到不透明缓出曲线让收尾更软func fade_in(panel: Control) - void: panel.modulate.a 0.0 # 先钉住起点防止上一次状态残留 var tween : create_tween() tween.tween_property(panel, modulate:a, 1.0, 0.25) \ .set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)滑动入场从屏外滑到原位预期效果面板从屏幕左缘外滑入尾部带减速像被放下来一样。执行顺序如下这段代码先把面板甩到左屏外再用 0.4s 滑回原位起点偏移留 20% 余量避免边缘被裁剪func slide_in(panel: Control) - void: var target : panel.position panel.position target - Vector2(panel.size.x * 1.2, 0.0) # 屏外起点 var tween : create_tween() tween.tween_property(panel, position, target, 0.4) \ .set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)缩放弹跳压下去再弹回预期效果按钮点下去先压到 0.9再弹回 1.0 并带一点过冲手感接近物理回弹。这段代码用 TRANS_BACK 自带的回弹特性0.2s 内完成快而不糊func bounce_back(btn: Button) - void: btn.scale Vector2(0.9, 0.9) # 先压下去模拟按住的形变 var tween : create_tween() tween.tween_property(btn, scale, Vector2.ONE, 0.2) \ .set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)四、缓动曲线才是灵魂Tween 缓动曲线手感对照同一句右移 200px换条曲线就是两种气质。先用手感认曲线——这里有个小坑LINEAR 和 CUBIC 是 Animation 轨道的插值类型QUART / QUINT 则长在 Tween 的过渡曲线里两套 API 别混着调。曲线手感适合LINEARAnimation 插值匀速直线机械感强进度条、焦点下划线这类信息型动画CUBICAnimation 插值 / TRANS_CUBIC起停柔和最接近人手默认选择面板滑动、淡入淡出QUARTTRANS_QUART收尾更急力量感上来了弹窗砸入、强调提示QUINTTRANS_QUINT前半段更冲戏剧化成就弹出、结算庆祝推荐直接抄这三组参数0.25s CUBIC 缓出面板滑入、淡入的万金油组合0.4s QUART 缓出需要砸出来的入场0.15s LINEAR纯状态标记快过肉眼同一个位移换曲线感受下差距func compare_easing(target: Control) - void: var tween : create_tween() tween.tween_property(target, position, target.position Vector2(200, 0), 0.3) \ .set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT) # 把 TRANS_CUBIC 换成 TRANS_QUART 再跑一遍收尾的急刹车立刻就有了需要把多条动画做交叉混合时从 AnimationTree 的状态机入手即可入口一行$AnimationTree.active true # 挂上 AnimationNode 状态机后开始混合调度五、页面切换过渡 按钮反馈交互闭环怎么做页面切换退出播完再入场预期协作流用户点导航 → 当前页播退出 → 管理器等退出结束 → 新页播入场。这段代码的关键是 await 住退出的 finished 信号——退出没播完之前不碰新页两页永远不会同框打架func switch_page(old: Control, fresh: Control) - void: var out : create_tween() out.tween_property(old, modulate:a, 0.0, 0.25) await out.finished # 退出动画播完前不翻牌 old.visible false fresh.visible true fresh.modulate.a 0.0 var inn : create_tween() inn.tween_property(fresh, modulate:a, 1.0, 0.25) \ .set_trans(Tween.TRANS_CUBIC).set_ease(Tween.EASE_OUT)按钮 hover / press两条信号就够预期效果鼠标移入放大 5%移出复位0.15s 快进快出。这段代码把 mouse_entered / mouse_exited 各挂一条 Tween不引入任何状态变量func setup_hover(btn: Button) - void: var big : func(): create_tween().tween_property(btn, scale, Vector2(1.05, 1.05), 0.15) var norm : func(): create_tween().tween_property(btn, scale, Vector2.ONE, 0.15) btn.mouse_entered.connect(big) btn.mouse_exited.connect(norm)六、上线前过一遍这份性能 Checklist上商店之前把下面这份清单过一遍。重点不是能不能跑而是跑起来玩家看不看得出单条动画关键帧不超过 3 个多了就改用缓动曲线顶替中间帧一次性反馈走 Tween只有循环或反复播放的动画才落盘成 Animation 资源同屏相关元素一整排按钮入场合并进同一条 Tween 链批量驱动高频动画资源在菜单加载时预创建别等玩家第一次点击再 new不在 _process 里每帧创建 Tween 或轮询动画状态低端机把插值降级为 LINEARUI 动效上肉眼几乎无差常见问题根因一句话解法首次交互掉帧资源首次加载/编译启动预热提前创建常用动画资源多面板同屏卡顿各页各建 Tween重排重绘叠加合并进一次 Tween 链批量驱动玩久了越来越卡旧 Tween 没结束又新建堆积未释放新 Tween 前 kill 掉旧实例七、动画不动了三步定位动画不动基本逃不出下面三个坑按顺序查坑 1轨道路径拼错——路径错误不报异常轨道只是静默失效。打印实际绑定路径和节点树逐字对for i in animation.get_track_count(): print(track , i, - , animation.track_get_path(i))高发错误漏掉开头的.、节点名大小写不一致、modulate:a写成modulate.a。坑 2关键帧时间戳超出 length——length 之外的帧永远不会被播放。先打印长度再扫一遍时间戳print(length , animation.length) for i in animation.get_track_count(): for t in animation.step_track_times(i): if t animation.length: print(越界关键帧: , t)把 length 拉长到覆盖最大时间戳即可。坑 3AnimationPlayer 没激活——新建的 Player 不会自动播先确认状态再怀疑别的print(active: , $AnimationPlayer.is_active(), , playing: , $AnimationPlayer.is_playing())两个都是 false 的话检查场景里的 autoplay 设置或者在 _ready() 里补一句 play(动画名)。八、带走这 4 条就够用了✅ 时长控制在 0.20.5s超过 0.6s 玩家就开始等了✅ 默认 CUBIC 缓动LINEAR 只留给进度条、下划线这类状态标记✅ 相关 UI 元素合并到同一条 Tween 链 / 同一个 Animation 里批量驱动✅ 启动时预创建高频动画资源避免首次交互卡顿想继续深挖从仓库里的 动画系统入门、动画轨道类型 和 Tween 类参考 读起再到 Godot 官方论坛翻翻 UI transition 相关讨论里大家踩过的坑这套 Godot 动画教程就闭环了。【免费下载链接】godot-docsGodot Engine official documentation项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表