Tween.set_ease
2026/4/14大约 4 分钟
最后更新日期:2026-04-16
最后同步日期:2026-04-15 | Godot 官方原文 — Tween.set_ease
Tween.set_ease
定义
Tween.set_ease 用来控制动画的"节奏感"——是先快后慢、先慢后快,还是两头慢中间快。
打个比方:你开车从 A 到 B。如果你"起步慢慢加速"那就是 EaseIn;如果"到终点慢慢减速"那就是 EaseOut;如果"起步慢、中间快、到站也慢"那就是 EaseInOut。set_ease 就是让你选择这种"加速/减速方式"的。
它通常和 set_trans(过渡曲线形状)配合使用。set_trans 决定了曲线是什么形状(正弦、指数、弹性等),而 set_ease 决定了曲线的"方向"(前半段用还是后半段用还是前后都用)。
函数签名
C#
// Tween.SetEase 设置缓动方向
public Tween SetEase(Tween.EaseType ease)GDScript
func set_ease(ease: int) -> Tween参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
ease | Tween.EaseType / EaseType | 是 | 缓动方向,可选值见下表 |
缓动类型枚举值:
| 枚举值 | 数值 | 效果描述 |
|---|---|---|
EaseIn | 0 | 先慢后快——开头缓缓启动,越到后面越快 |
EaseOut | 1 | 先快后慢——开头很快,快到终点时慢慢减速 |
EaseInOut | 2 | 两头慢中间快——起步和到达时都慢,中间快 |
EaseIn 配合弹性/回弹等会有不同的视觉效果 |
返回值
返回 Tween 对象本身,支持链式调用。
代码示例
基础用法:对比三种缓动方向
C#
using Godot;
public partial class EaseDemo : Node2D
{
public override void _Ready()
{
var sprite1 = GetNode<Sprite2D>("Sprite1");
var sprite2 = GetNode<Sprite2D>("Sprite2");
var sprite3 = GetNode<Sprite2D>("Sprite3");
// EaseIn:先慢后快(慢慢启动,猛地到位)
Tween t1 = CreateTween();
t1.SetEase(Tween.EaseType.In);
t1.SetTrans(Tween.TransitionType.Sine);
t1.TweenProperty(sprite1, "position:x", 400.0, 2.0);
// 运行结果: sprite1 开始移动很慢,越往后越快
// EaseOut:先快后慢(猛地出发,慢慢停下)
Tween t2 = CreateTween();
t2.SetEase(Tween.EaseType.Out);
t2.SetTrans(Tween.TransitionType.Sine);
t2.TweenProperty(sprite2, "position:x", 400.0, 2.0);
// 运行结果: sprite2 开始移动很快,接近终点时减速
// EaseInOut:两头慢中间快(平滑的加减速)
Tween t3 = CreateTween();
t3.SetEase(Tween.EaseType.InOut);
t3.SetTrans(Tween.TransitionType.Sine);
t3.TweenProperty(sprite3, "position:x", 400.0, 2.0);
// 运行结果: sprite3 慢慢启动 → 中间加速 → 慢慢停下
}
}GDScript
extends Node2D
func _ready():
var sprite1 = $Sprite1
var sprite2 = $Sprite2
var sprite3 = $Sprite3
# EaseIn:先慢后快(慢慢启动,猛地到位)
var t1 = create_tween()
t1.set_ease(Tween.EASE_IN)
t1.set_trans(Tween.TRANS_SINE)
t1.tween_property(sprite1, "position:x", 400.0, 2.0)
# 运行结果: sprite1 开始移动很慢,越往后越快
# EaseOut:先快后慢(猛地出发,慢慢停下)
var t2 = create_tween()
t2.set_ease(Tween.EASE_OUT)
t2.set_trans(Tween.TRANS_SINE)
t2.tween_property(sprite2, "position:x", 400.0, 2.0)
# 运行结果: sprite2 开始移动很快,接近终点时减速
# EaseInOut:两头慢中间快(平滑的加减速)
var t3 = create_tween()
t3.set_ease(Tween.EASE_IN_OUT)
t3.set_trans(Tween.TRANS_SINE)
t3.tween_property(sprite3, "position:x", 400.0, 2.0)
# 运行结果: sprite3 慢慢启动 → 中间加速 → 慢慢停下实际场景:按钮弹跳效果(EaseOut 更自然)
C#
using Godot;
public partial class BounceButton : Button
{
public override void _Ready()
{
Pressed += _OnPressed;
}
private void _OnPressed()
{
// 按钮被点击后放大再缩回,使用 EaseOut 让回弹更自然
Tween tween = CreateTween();
tween.SetEase(Tween.EaseType.Out);
tween.SetTrans(Tween.TransitionType.Back); // 回弹效果
// 放大到 1.2 倍
tween.TweenProperty(this, "scale", new Vector2(1.2f, 1.2f), 0.1);
// 缩回原始大小
tween.TweenProperty(this, "scale", new Vector2(1.0f, 1.0f), 0.3);
// 运行结果: 按钮先快速放大,然后带有回弹感地缩回,手感很好
}
}GDScript
extends Button
func _ready():
pressed.connect(_on_pressed)
func _on_pressed():
# 按钮被点击后放大再缩回,使用 EaseOut 让回弹更自然
var tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_BACK) # 回弹效果
# 放大到 1.2 倍
tween.tween_property(self, "scale", Vector2(1.2, 1.2), 0.1)
# 缩回原始大小
tween.tween_property(self, "scale", Vector2(1.0, 1.0), 0.3)
# 运行结果: 按钮先快速放大,然后带有回弹感地缩回,手感很好进阶用法:滑入屏幕动画(EaseIn 强调"从静止启动")
C#
using Godot;
public partial class SlideInPanel : Panel
{
public override void _Ready()
{
// 面板初始在屏幕左侧外面
Position = new Vector2(-300, 0);
// 延迟 0.5 秒后滑入
Tween tween = CreateTween();
tween.SetEase(Tween.EaseType.Out);
tween.SetTrans(Tween.TransitionType.Cubic);
tween.TweenProperty(this, "position:x", 0.0, 0.6);
// 运行结果: 面板从左侧快速滑入,到达位置时平稳减速停下
GD.Print("面板开始滑入动画...");
// 运行结果: 面板开始滑入动画...
}
}GDScript
extends Panel
func _ready():
# 面板初始在屏幕左侧外面
position = Vector2(-300, 0)
# 延迟 0.5 秒后滑入
var tween = create_tween()
tween.set_ease(Tween.EASE_OUT)
tween.set_trans(Tween.TRANS_CUBIC)
tween.tween_property(self, "position:x", 0.0, 0.6)
# 运行结果: 面板从左侧快速滑入,到达位置时平稳减速停下
print("面板开始滑入动画...")
# 运行结果: 面板开始滑入动画...注意事项
- 默认值是 EaseInOut:如果不调用
set_ease,默认使用EaseInOut(两头慢中间快),这对于大多数场景已经足够自然。 - 必须配合
set_trans使用才有意义:set_ease只决定曲线的方向,曲线的形状(正弦、指数、弹性等)由set_trans决定。两者配合才能得到想要的运动效果。 - 链式调用时的作用范围:
set_ease只影响它之后的第一个动画步骤(TweenProperty/TweenInterval等),不会影响之前已经添加的步骤。 - 推荐组合:
EaseOut+Back常用于按钮弹跳;EaseOut+Cubic常用于 UI 滑入;EaseIn+Sine常用于物体离场消失。
