惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
C
Check Point Blog
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
D
Docker
Engineering at Meta
Engineering at Meta
AWS News Blog
AWS News Blog
S
Security Affairs
U
Unit 42
P
Palo Alto Networks Blog
V
Visual Studio Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 司徒正美
博客园 - Franky
宝玉的分享
宝玉的分享
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog

碎言

不懂就别瞎掰掰:【程序员的常识】写的什么玩意? AI 辅助编程下的程序设计与代码编写 使用 Next.js 和 Tailwind CSS 构建可编辑和删除的 ToDo 待办事项应用 探索编程新境界:MarsCode 助你一臂之力 使用 Next.js 和 Tailwind CSS 搭建静态图片展示站点并部署到 Vercel AI 辅助编程:免费工具的优缺点及官网一览 GitHub push更新总是失败,写个python脚本解决 把博客从GitHub迁移到到了vercel ComfyUI 和 Flux.1 安装与使用教程 Flux.1 入门必知:硬件、环境、模型 Git项目的子文件夹中的内容无法同步到远程仓库的解决方法 blender流体Fluid使用中没有流体、流体穿模等一些问题的解决方法 博客聚合网站:积薪,竟然关闭了! blender日常使用中的一些技巧 虽然只有我自己在用,但还是更新了碎言博客的源代码, 与其在迷茫中困惑,不如在努力中前进 差点忘了我还有一个博客... 秧歌、博客和AI 终于熬到了新手上路 好久没有更新博客了。。。 老妈大腿骨骨折,最近一直在医院护理 Hello, September! Ubuntu开机自动启动Docker容器运行WordPress Docker 简单快速安装部署WordPress Docker下安装MySQL 加碘盐能防核辐射的话,还怕什么核战争? shields.io 一个简洁、一致、清晰的徽章 Ubuntu下使用root登录ssh的设置 GitHub Actions 构建、部署 Next.js项目 我又用回了"IE"--edge ubuntu-22-live-server 设置固定IP Next项目部署GitHub pages的一些坑 整理了一个下午的收藏夹...... 短暂而忙碌的暑假即将谢幕 GitHub Actions 是干什么用的? 放弃Next.js重构博客:经验、教训与未来技术探索 关于Google LCP 问题:超过了2.5秒 验证已通过 仅用了几个小时就使用next.js重构博客的所有功能 关于使用Next.js重构博客构思的记录 使用Tailwind css和JavaScript实现一个简单的返回顶部功能 罗技K380 F1-F12 功能键锁定 PHILIPS猛禽SPK8404机械键盘手感真是超赞! 局域网的DNS设置192.168.0.1与8.8.8.8,114.114.114.114有什么区别? 史诗结合的浪漫:《长安三万里》 聊 聊 友 情 链 接 1767个中文博客的数据洞察:中文博主都喜欢干啥? python requests 设置读取超时时间 八月回顾:博客之路,一路前行 Docker基础学习笔记和常用命令汇总 vim常用命令整理 Ubuntu 22 安装Docker过程记录 使用python结合feedparser模块编写自己的私人RSS订阅程序 博客大数据分析:38880条博文揭示博主最爱写什么? Windows下国产杀毒软件还有选择吗?火绒安全可以一试。 export exports module.exports 这三个命令的区别是什么如何使用? 时代的变迁:从56K拨号上网到1G光纤的回忆 理工计算机专业准大学生如何选配笔记本? 使用JavaScript编写自己的私人RSS订阅程序 如何使用CSS为博客标题设置彩虹颜色? 最终还是决定使用传统的网线来解决千兆速率问题。 1300M USB双频2.4+5G无线网卡的一些常识和使用技巧 Python Gui新框架:NiceGui之初体验 pycharm 正在关闭项目(closing project)无法关闭退出程序的解决方法! 速度与优雅:博客性能优化之旅 久了,博客主题就会一直做减法 七月的焦虑 在react中使用复制插件clipboard.js react中如把HTML代码转成字符串进行渲染? react useEffect()中使用lodash库中的防抖debounce react useEffect() 为什么在开发模式的时候会执行两次? 七年之痒!别了我曾深爱的MacBookPro 前端React+Material UI开发环境的快速搭建 一键更新Github部署的静态博客 编程新手学习过程中如何更好的提问? Typed.js 一款有意思的网页打字机效果库 解决错误 ERROR [WinError 10049] 在其上下文中,该请求的地址无效。 Stable Diffusion 相关教程与模型的记录 Stable Diffusion ControlNet openpose 报错无法使用 在react或vue中使用localStorage存储数据 使用React+Vite+TailwindCSS+daisyUI打造一个简单的ToDos 碎言静态博客 聊聊Python中的装饰器 npm更换源与nrm安装与配置 pip临时修改下载源 Vue快速学习笔记(9)Vuetify配置及简单使用 Vue快速学习笔记(8)webpack4.X配置Vue开发打包环境 Vue快速学习笔记(5)使用路由vue-router(1) Vue快速学习笔记(4)Vue组件中的数据传递 Vue快速学习笔记(3)Vue的组件 Vue快速学习笔记(2)Vue中的监听与计算属性 Vue快速学习笔记(1)Vue实例基础 基于Django构建的小学生英文单词背写检测考试系统。 如何在Python程序中使用配置文件.ini(ConfigParser) 写在我的博客PV10万时:聊聊编程与画画 python3函数学习笔记简单总结 PythonINI配置文件读写的简单方法 Python open()函数文件打开、读、写操作总结 Python os.path模块中一些常用方法的整理总结 Python 采集数据三步曲之[Requests + re.py模块进行数据采集] Python 采集数据三步曲之[Requests开源协议的HTTP 库]
Godot 4 补间动画 (Tween) 指北
J.sky · 2026-01-18 · via 碎言

为什么选择 Tween?

Godot 4 带来的全新 Tween 系统,摒弃了传统的节点式操作,改用全代码驱动,更加简洁且强大。

Tween:适合程序化、动态的 UI 反馈、物品掉落、数值平滑变化(纯代码控制)。

核心语法

创建一个最基本的平移动画:

var tween = create_tween()
tween.tween_property($Sprite2D, "position", Vector2(600, 300), 1.0)

只需两行,对象就会在 1 秒内平滑移动到目标位置。

让动画有灵魂:Transition 与 Ease

  1. set_trans():过渡类型 (TransitionType) 这是最核心的参数,决定了动画的“性格”。
枚举常量 (Tween.TransitionType)动画效果描述最佳用途
TRANS_LINEAR匀速。没有任何加减速。简单的旋转、血条数值变化。
TRANS_SINE正弦。非常柔和的加速减速。缓慢漂浮、呼吸灯效果。
TRANS_QUAD二次方。基础的加减速。最常用的平滑移动。
TRANS_CUBIC三次方。比 Quad 更明显的加减速。强调动作起伏。
TRANS_QUART四次方。加速感更强。快速切入/切出。
TRANS_EXPO指数级。极端的加减速。闪电般的瞬间移动。
TRANS_ELASTIC弹性。像皮筋拉伸后的回弹。Q弹的按钮、果冻物体。
TRANS_BOUNCE反弹。像球落地后的弹跳。物理掉落效果、菜单撞击边缘。
TRANS_BACK回退。先往后拉一点再冲出去。蓄力感的动作、浮窗弹出。
TRANS_SPRING弹簧。真实的物理弹簧震荡。Godot 4 新增,比 Elastic 更自然。
  1. set_ease():缓动模式 (EaseType)这个参数决定了上面选定的曲线如何应用在时间轴上。
枚举常量 (Tween.EaseType)逻辑描述视觉表现
EASE_IN入场加速。动画开始时很慢,然后加速。常用于离开屏幕。
EASE_OUT出场减速。动画开始时很快,快结束时减慢。UI 动画最常用。
EASE_IN_OUT两头慢中间快。开始和结束都有缓冲。适合循环往复的动作。
EASE_OUT_IN两头快中间慢。较少使用。
  1. 黄金组合建议 如果你不知道该选什么,可以尝试这些经过验证的经典组合:
  • 自然的 UI 弹出: set_trans(Tween.TRANS_BACK).set_ease(Tween.EASE_OUT)

  • 丝滑的淡入淡出: set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)

  • 有打击感的移动: set_trans(Tween.TRANS_QUART).set_ease(Tween.EASE_OUT)

  • 极度夸张的点击反馈: set_trans(Tween.TRANS_ELASTIC).set_ease(Tween.EASE_OUT)

动态演示

你可以将下面的脚本挂载到一个空的 Node2D 场景中。运行后,它会生成一排图标,演示各种常见的 Tween 曲线。

extends Node2D

# 使用 Godot 的默认图标作为演示物体
var icon_texture = preload("res://icon.svg")

# 定义我们要演示的配置组合
var setups = [
    {"name": "Linear", "trans": Tween.TRANS_LINEAR, "ease": Tween.EASE_IN_OUT},
    {"name": "Sine Out", "trans": Tween.TRANS_SINE, "ease": Tween.EASE_OUT},
    {"name": "Back Out", "trans": Tween.TRANS_BACK, "ease": Tween.EASE_OUT},
    {"name": "Bounce Out", "trans": Tween.TRANS_BOUNCE, "ease": Tween.EASE_OUT},
    {"name": "Elastic Out", "trans": Tween.TRANS_ELASTIC, "ease": Tween.EASE_OUT},
    {"name": "Quint In", "trans": Tween.TRANS_QUINT, "ease": Tween.EASE_IN}
]

func _ready():
    # 为每种配置创建一个演示行
    for i in range(setups.size()):
        create_demo_row(i, setups[i])

func create_demo_row(index, config):
    # 1. 创建并添加精灵
    var sprite = Sprite2D.new()
    sprite.texture = icon_texture
    sprite.scale = Vector2(0.5, 0.5)
    sprite.position = Vector2(100, 100 + index * 100)
    add_child(sprite)
    
    # 2. 创建并添加标签文字
    var label = Label.new()
    label.text = config["name"]
    label.position = Vector2(20, 70 + index * 100)
    add_child(label)
    
    # 3. 启动循环动画函数
    animate_sprite(sprite, config)

func animate_sprite(sprite, config):
    var start_pos = Vector2(100, sprite.position.y)
    var end_pos = Vector2(1000, sprite.position.y)
    
    # 创建 Tween
    var tween = create_tween().set_loops() # 无限循环
    
    # 设置当前行的过渡和缓动参数
    tween.set_trans(config["trans"])
    tween.set_ease(config["ease"])
    
    # 动画序列:移动到右边 -> 等待 -> 瞬移回左边
    tween.tween_property(sprite, "position", end_pos, 2.0)
    tween.tween_interval(0.5)
    tween.tween_property(sprite, "position", start_pos, 0.0) # 瞬移回起始点
    tween.tween_interval(0.5)

运行游戏后的效果:

效果图

这段代码展示了几个关键技巧:

  • set_loops(): 让动画自动重复。注意在 Godot 4 中,不带参数的 set_loops() 表示无限循环。

  • tween_interval(): 在往返运动之间加入停顿,方便观察终点的回弹或碰撞效果。

  • 瞬移技巧: 将 duration 设置为 0.0 的 tween_property 可以当作“瞬间改变属性”来使用。

  • 动态组合: 你可以轻松地在 setups 数组里添加更多组合,比如对比 EASE_IN 和 EASE_OUT 的区别。

总结与建议

UI 弹出:首选 TRANS_BACK + EASE_OUT。

打击感:试试 TRANS_QUINT 或 TRANS_EXPO。

生命周期:不需要手动 queue_free(),Tween 运行完会自动消失。

中断处理:如果需要在动画中途停止,可以调用 tween.kill()。