はじめに
Tweenとは、アニメーション技法の「in-betweening」に由来する補間の機能です。
Godotでは、主にノードプロパティ等の変化を保管することで滑らかなアニメーションを実現します。
同じくアニメーションを作成できるAnimationPlayerノードと比較すると、以下の特徴があります。
特徴 | Tween | AnimationPlayer |
---|---|---|
複雑な制御 | ×:不可能ではないが、コードがかなり煩雑になるため非推奨 | ◎:トラックやキーフレームによって詳細に制御可能 |
動的な制御 | 〇:コード上で定義が完結するため、動的なアニメーションに対応可能 | △:アニメーションは事前に定義したものの再生がメインのため苦手 |
セットアップ | 〇:コードのみで完結 | △:リソースやトラックなどの初期設定がやや煩雑 |
パフォーマンス | ◎:アニメ処理の中では軽量 | 〇:シンプルなアニメの場合はオーバーヘッドに懸念 |
リソース管理 | △:コード内で定義する都合、基本的に単発専用 | 〇:アニメごとに管理・再利用が可能 |
まとめると、それぞれ以下のように使い分けになるかと思います。
Tween:
- シンプル または 単発で十分なアニメ
- 動的な設定値の変化に対応したいアニメ
AnimationPlayer:
- 複雑で、Tweenでは難しいアニメ
- 再利用性やリソース管理が重要なアニメ
Tweenの基本
Tween を使用するときの基本的な流れは、以下になります。
- Tweenオブジェクトを作成
- (必要な場合は、)tweenの各種設定を行う
- Tweenオブジェクトから実行したい処理に対応したTweenerオブジェクトを生成・追加する
【参考】Tween関連のオブジェクトは以下の通りです。(リンクは公式ドキュメントリファレンスです)
オブジェクト名 | 概要 |
---|---|
Tween | Tweenerを使用して、スクリプト経由の汎用アニメーションに使用される軽量オブジェクト。 |
Tweener | Tweenで使用されるすべての Tweener の抽象クラス。 トゥイナーは、特定のアニメーションタスクを実行するオブジェクトです。 |
CallbackTweener | CallbackTweenerは、トゥイーン シーケンス内のメソッドを呼び出すために使用されます。 |
IntervalTweener | Tweenアニメーションにアイドル間隔を作成します。 |
MethodTweener | 抽象値を補間し、時間の経過とともに呼び出されるメソッドに提供します。 |
PropertyTweener | オブジェクトのプロパティを時間の経過とともに補間します。 |
Step1. Tweenの作成
Tweenオブジェクトを作成する時は、
SceneTree.create_tween または Node.create_tween を使用します。
var _tween = get_tree().create_tween()
var _tween = self.create_tween()
また、Tweenの特徴として、作成時は以下のことに注意する必要があります。
Step2. Tweenの設定
Tweenオブジェクトを追加したら、実際にアニメを実行するTweenerを追加する前に、処理を実行する形式に関する各種設定を行います。
ノードのバインド
作成したTweenにはbind_node()メソッドを使用してノードを紐づけることができます。
重要な点として、Node.create_tween で作成されたtweenは、自動で呼び出しノードがバインドされます。(=大体の場合はこの方法で自動バインドします)
メソッド | 概要 |
---|---|
bind_node(node: Node) | tweenを指定したノードにバインドする。 |
ノードがバインドされたTweenは、以下のような効果が得られます。
- バインドされたオブジェクトがツリー内にない時、Tween はアニメーションを停止する
- バインドされたオブジェクトが解放されると、Tween は自動的に終了します。
- 後述のポーズモードが”TWEEN_PAUSE_BOUND”(デフォルト)の場合、Tweenの実行もノードのポーズ状況に連動します
イージング(速度の緩急)
Tweenのイージング(速度の緩急)を設定するときは、set_ease()メソッドと、列挙型EaseTypeを使用します。
メソッド | 概要 |
---|---|
set_ease(ease: EaseType) | デフォルトのイージングタイプを設定 デフォルト値は EASE_IN_OUT |
EASE_IN = 0 | 補間の開始点がゆっくりで、終了点で高速になる |
EASE_OUT = 1 | 補間の開始点が高速で、終了点でゆっくりになる |
EASE_IN_OUT = 2 | 補間の開始点/終了点でゆっくりになる |
EASE_OUT_IN = 3 | 補間の開始点/終了点で高速になる |
遷移(トランジション)タイプ
遷移タイプを設定するときは、set_trans() メソッドと列挙型TransitionTypeを使用します。
メソッド | 概要 |
---|---|
set_trans(trans: TransitionType) | デフォルトのトランジションタイプを設定 デフォルト値は TRANS_LINEAR |
TRANS_LINEAR = 0 | 線形の補間 |
TRANS_SINE = 1 | 正弦関数による補間 |
TRANS_QUINT = 2 | 5次関数による補間 |
TRANS_QUART = 3 | 4次関数による補間 |
TRANS_QUAD = 4 | 2次関数による補間 |
TRANS_EXPO = 5 | 指数関数による補間 |
TRANS_ELASTIC = 6 | 弾力性を持った補間 (アニメがゆっくりになるタイミングで揺れる) |
TRANS_CUBIC = 7 | 3次関数による補間 |
TRANS_CIRC = 8 | 平方根を使用した関数による補間 |
TRANS_BOUNCE = 9 | バウンスによる補間 (アニメがゆっくりになるタイミングで跳ねる) |
TRANS_BACK = 10 | アニメの端で戻りながら補間される (ゆっくりになるタイミングで戻りが発生する) |
TRANS_SPRING = 11 | ばねのような挙動による補間 (アニメがゆっくりになるタイミングでブレる) |
イージングとトランジションの選び方については、公式ドキュメント内のチートシートや以下イージング関数の一覧サイトが参考になります。
実行順序
Tweenはデフォルトで、追加されたTweenerを追加されたものから順番に実行していきますが、以下メソッドでその設定を変更できます
メソッド | 概要 |
---|---|
parallel() | 次のTweenerを前のものと並行して実行する |
set_parallel(parallel: bool = true) | デフォルトのtweener実行設定を行う ・true : 平行に処理 ・false : 順番に処理 (デフォルト) |
chain() | 次のTweenerを前のものが終了してから実行する ※set_parallel(true)によってデフォルトが並行処理の場合に使用 |
実行設定
Tweenの実行に関する設定を行う場合は、それぞれ以下のメソッドが使用できます。
メソッド | 概要 |
---|---|
set_loops(loops: int = 0) | Tweenが繰り返される回数を設定する 引数なし(デフォルト値=0)とした場合は無限ループになります※ ※無限ループ使用時は遅延0の連続呼び出しにならないように注意 応用:Tweenのライフタイムがノードに依存する場合は、bind_nodeを使用しておくと便利 |
set_speed_scale(speed: float) | Tweenerのスピードを設定する (delay にも影響が出ることに注意) |
set_pause_mode(mode: TweenPauseMode) | SceneTree一時停止時のTweenの動作設定 デフォルト値は TWEEN_PAUSE_BOUND 列挙型TweenPauseMode : ・TWEEN_PAUSE_BOUND =0 バインドされたノードが有効なら実行 (バインド無しならPAUSE_STOPと同じ) ・TWEEN_PAUSE_STOP =1 SceneTreeとともにTweenも一時停止 ・TWEEN_PAUSE_PROCESS =2 Tweenは常に実行 |
set_process_mode(mode: TweenProcessMode) | Tweenの更新タイミングを設定 デフォルト値は TWEEN_PROCESS_IDLE 列挙型TweenProcessMode : ・WEEN_PROCESS_PHYSICS =0 Tweenは各物理フレームの後に更新 ・TWEEN_PROCESS_IDLE =1 Tweenは各プロセスフレームの後に更新 ※見た目優先ならIDLE。正確な物理動作の同期が必要ならPHYSICSを選びます |
Step3. Tweenerの追加
Tweenの設定は完了したら、Tweenオブジェクトから実行したい処理に対応したTweenerオブジェクトを追加します。
Tweenerの追加を行うには、それぞれ以下のメソッドを使用します。
メソッド | 概要 |
---|---|
tween_property(object: Object, property: NodePath, final_val: Variant, duration: float) | ・PropertyTweenerを作成し、追加する ・オブジェクトプロパティの変更に使用 |
tween_callback(callback: Callable) | ・CallbackTweener を作成し、追加する ・任意のメソッド呼び出しに使用 ・引数を指定したいときはCallable.bindを使用 |
tween_method(method: Callable, from: Variant, to: Variant, duration: float) | ・MethodTweenerを作成し、追加する ・引数をトゥイーンさせる形で、メソッドを呼び出したいときに使用 ・追加で引数を指定したいときはCallable.bindを使用 |
tween_interval(time: float) | ・IntervalTweenerを作成し、追加する ・ディレイ(遅延時間)の作成に使用 |
TweenとTweenerの関係を図にすると以下のようになります。
実行例
最後に、簡単なループTweenアニメの例を記載します。
(Step2.の設定メソッドに関してはTweener追加時にメソッドチェーンでつなげることが多いのですが、ここではわかりやすくするために1行ずつ記述しています。)
func _ready():
var _node_tween = self.create_tween()
_node_tween.set_loops(0)
_node_tween.set_trans(Tween.TRANS_SINE)
_node_tween.tween_property(self, "position",
Vector2(self.position.x + 200,
self.position.y), 1)
_node_tween.set_ease(Tween.EASE_OUT)
_node_tween.set_trans(Tween.TRANS_BOUNCE)
_node_tween.tween_property(self, "position",
Vector2(self.position.x,
self.position.y), 1)
上記コードを適当なSprite2Dノードにアタッチされたスクリプトに記述すると、以下のようなアニメを繰り返します。(Gif画像なのでカクついていますが、実際は滑らかに動いています)
その他Tween関連の処理
ここからは、その他Tweenオブジェクトの処理についてまとめます。
Tweenの操作
作成したTweenは、以下のメソッドで操作することができます。
メソッド | 概要 |
---|---|
kill() | Tweenの動作を中止し、無効にする |
stop() | トゥイーンを停止し、初期状態にリセットする (追加済みのTweenerは保持される) |
pause() | Tweenの動作を一時停止する |
play() | 停止状態のTweenを再開する |
custom_step(delta: float) | 指定した秒数(delta値)分、Tweenを進行する (主に停止状態のTweenに使用) |
Tweenの状態を確認する
Tweenオブジェクトには、作成したTweenの状態を取得するためのメソッドが用意されています。
メソッド | 概要 |
---|---|
is_valid() | Tweenが有効であればTrueを返す |
is_running() | Tweenが実行中であればTrueを返す (一時停止中や、終了状態ならFalse) |
get_loops_left() | Tweenの残りループ回数を取得 ※ -1 = 無限ループ, 0 = 終了済み |
get_total_elapsed_time() | Tweenがアニメを実行している合計時間を取得 |
interpolate_value()
interpolate_value()はやや特殊なメソッドで、使用することで、Tweenerではなく、手動で補間処理を実行することができます。
→公式ドキュメントにも記載があるとおり、@GlobalScope.lerp()による補間と似た処理になりますが、Tweenオブジェクトのプロパティであることから、前述のTween設定(イージングやトランジションなど)を利用できるのが特徴です。
コメント