Tween.set_trans
2026/4/14大约 4 分钟
最后更新日期:2026-04-16
最后同步日期:2026-04-15 | Godot 官方原文 — Tween.set_trans
Tween.set_trans
定义
Tween.set_trans 用来选择动画的"运动曲线形状"——不同的曲线会让动画产生截然不同的运动风格。
打个比方:同样是 2 秒从 A 移动到 B,你可以让物体匀速走过去(Linear),像弹簧一样弹过去(Elastic),像皮球一样砸过去再弹两下(Bounce),或者像荡秋千一样柔和地摆过去(Sine)。set_trans 就是让你选择这把"画笔"的笔触风格。
set_trans 决定了曲线的形状,而 set_ease 决定了曲线的方向(从哪端开始加速/减速)。两者配合使用能组合出丰富的动画效果。
函数签名
C#
// Tween.SetTrans 设置过渡曲线类型
public Tween SetTrans(Tween.TransitionType trans)GDScript
func set_trans(trans: int) -> Tween参数说明
| 参数 | 类型 | 必需 | 说明 |
|---|---|---|---|
trans | Tween.TransitionType / TransitionType | 是 | 过渡曲线类型,可选值见下表 |
过渡类型枚举值(常用):
| 枚举值 | 数值 | 效果描述 |
|---|---|---|
Linear | 0 | 匀速运动——全程速度不变,像传送带 |
Sine | 1 | 正弦曲线——非常柔和的加减速,最通用 |
Quad | 2 | 二次方曲线——比 Sine 稍微"尖锐"一点 |
Cubic | 3 | 三次方曲线——加减速更明显 |
Quart | 4 | 四次方曲线——更强的加减速对比 |
Quint | 5 | 五次方曲线——非常戏剧化的加减速 |
Expo | 6 | 指数曲线——开始极慢后来极快(或反过来) |
Circ | 7 | 圆弧曲线——类似 Expo 但更平滑 |
Back | 8 | 回弹——会稍微冲过目标再回来,像拉弹弓 |
Bounce | 9 | 弹跳——像皮球落地一样弹几下才停住 |
Elastic | 10 | 弹性——像弹簧一样来回振荡几次 |
返回值
返回 Tween 对象本身,支持链式调用。
代码示例
基础用法:对比 Linear 和 Bounce
C#
using Godot;
public partial class TransDemo : Node2D
{
public override void _Ready()
{
var spriteLinear = GetNode<Sprite2D>("SpriteLinear");
var spriteBounce = GetNode<Sprite2D>("SpriteBounce");
// Linear:匀速运动,全程速度一样
Tween t1 = CreateTween();
t1.SetTrans(Tween.TransitionType.Linear);
t1.TweenProperty(spriteLinear, "position:x", 400.0, 2.0);
// 运行结果: spriteLinear 匀速移动到 x=400
// Bounce:像皮球一样弹到终点
Tween t2 = CreateTween();
t2.SetTrans(Tween.TransitionType.Bounce);
t2.SetEase(Tween.EaseType.Out);
t2.TweenProperty(spriteBounce, "position:x", 400.0, 2.0);
// 运行结果: spriteBounce 在终点附近来回弹几下才停住
}
}GDScript
extends Node2D
func _ready():
var sprite_linear = $SpriteLinear
var sprite_bounce = $SpriteBounce
# Linear:匀速运动,全程速度一样
var t1 = create_tween()
t1.set_trans(Tween.TRANS_LINEAR)
t1.tween_property(sprite_linear, "position:x", 400.0, 2.0)
# 运行结果: sprite_linear 匀速移动到 x=400
# Bounce:像皮球一样弹到终点
var t2 = create_tween()
t2.set_trans(Tween.TRANS_BOUNCE)
t2.set_ease(Tween.EASE_OUT)
t2.tween_property(sprite_bounce, "position:x", 400.0, 2.0)
# 运行结果: sprite_bounce 在终点附近来回弹几下才停住实际场景:金币掉落弹跳(Bounce)
C#
using Godot;
public partial class Coin : Area2D
{
[Export] public float ExJumpHeight = 80.0f;
public override void _Ready()
{
// 金币出现时做一个弹跳效果
Sprite2D sprite = GetNode<Sprite2D>("Sprite2D");
Vector2 startPos = sprite.Position;
Vector2 topPos = startPos with { Y = startPos.Y - ExJumpHeight };
Tween tween = CreateTween();
// 先弹到最高点
tween.SetTrans(Tween.TransitionType.Sine);
tween.SetEase(Tween.EaseType.Out);
tween.TweenProperty(sprite, "position", topPos, 0.3);
// 然后掉落并弹跳
tween.SetTrans(Tween.TransitionType.Bounce);
tween.SetEase(Tween.EaseType.Out);
tween.TweenProperty(sprite, "position", startPos, 0.5);
// 运行结果: 金币先弹起到高处,然后掉下来在地面上弹跳两下停住
}
}GDScript
extends Area2D
@export var jump_height: float = 80.0
func _ready():
# 金币出现时做一个弹跳效果
var sprite = $Sprite2D
var start_pos = sprite.position
var top_pos = Vector2(start_pos.x, start_pos.y - jump_height)
var tween = create_tween()
# 先弹到最高点
tween.set_trans(Tween.TRANS_SINE)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(sprite, "position", top_pos, 0.3)
# 然后掉落并弹跳
tween.set_trans(Tween.TRANS_BOUNCE)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(sprite, "position", start_pos, 0.5)
# 运行结果: 金币先弹起到高处,然后掉下来在地面上弹跳两下停住进阶用法:弹性出现效果(Elastic)
C#
using Godot;
public partial class PopupEffect : Control
{
public override void _Ready()
{
// 弹窗从小到大弹性出现
Scale = Vector2.Zero;
Tween tween = CreateTween();
tween.SetTrans(Tween.TransitionType.Elastic);
tween.SetEase(Tween.EaseType.Out);
tween.TweenProperty(this, "scale", Vector2.One, 0.8);
// 运行结果: 弹窗从 0 放大到正常大小,过程中像弹簧一样来回振荡几次
// 最终稳定在 scale = (1, 1)
GD.Print("弹窗出现动画播放中...");
// 运行结果: 弹窗出现动画播放中...
}
}GDScript
extends Control
func _ready():
# 弹窗从小到大弹性出现
scale = Vector2.ZERO
var tween = create_tween()
tween.set_trans(Tween.TRANS_ELASTIC)
tween.set_ease(Tween.EASE_OUT)
tween.tween_property(self, "scale", Vector2.ONE, 0.8)
# 运行结果: 弹窗从 0 放大到正常大小,过程中像弹簧一样来回振荡几次
# 最终稳定在 scale = (1, 1)
print("弹窗出现动画播放中...")
# 运行结果: 弹窗出现动画播放中...注意事项
- 默认过渡类型是 Linear:如果不调用
set_trans,动画会使用匀速运动(Linear)。对于 UI 动画,建议至少用Sine或Cubic,让运动更自然。 - 链式调用时逐个设置:每个
TweenProperty之前都可以设置不同的set_trans和set_ease,这样同一个 Tween 序列中的不同步骤可以有不同的运动风格。 - Bounce 和 Elastic 配合 EaseOut 最常用:这两种效果在
EaseOut方向(先快后慢)下视觉效果最好。 - Back 会让动画"冲过头":
Back类型会让动画略微超过目标值再回来,产生"弹弓"效果。如果你需要精确停在目标位置,不要用Back。
