【Godot4.3】Tweenアニメーションの基本的な使い方

GodotEngine

はじめに

Tweenとは、アニメーション技法の「in-betweening」に由来する補間の機能です。
Godotでは、主にノードプロパティ等の変化を保管することで滑らかなアニメーションを実現します。

同じくアニメーションを作成できるAnimationPlayerノードと比較すると、以下の特徴があります。

特徴TweenAnimationPlayer
複雑な制御×:不可能ではないが、コードがかなり煩雑になるため非推奨◎:トラックやキーフレームによって詳細に制御可能
動的な制御〇:コード上で定義が完結するため、動的なアニメーションに対応可能△:アニメーションは事前に定義したものの再生がメインのため苦手
セットアップ〇:コードのみで完結△:リソースやトラックなどの初期設定がやや煩雑
パフォーマンス◎:アニメ処理の中では軽量〇:シンプルなアニメの場合はオーバーヘッドに懸念
リソース管理△:コード内で定義する都合、基本的に単発専用〇:アニメごとに管理・再利用が可能

まとめると、それぞれ以下のように使い分けになるかと思います。

Tween:

  • シンプル または 単発で十分なアニメ
  • 動的な設定値の変化に対応したいアニメ

AnimationPlayer:

  • 複雑で、Tweenでは難しいアニメ
  • 再利用性やリソース管理が重要なアニメ

Tweenの基本

Tween を使用するときの基本的な流れは、以下になります。

  1. Tweenオブジェクトを作成
  2. (必要な場合は、)tweenの各種設定を行う
  3. Tweenオブジェクトから実行したい処理に対応したTweenerオブジェクトを生成・追加する

【参考】Tween関連のオブジェクトは以下の通りです。(リンクは公式ドキュメントリファレンスです)

オブジェクト名概要
TweenTweenerを使用して、スクリプト経由の汎用アニメーションに使用される軽量オブジェクト。
TweenerTweenで使用されるすべての Tweener の抽象クラス。 トゥイナーは、特定のアニメーションタスクを実行するオブジェクトです。
CallbackTweenerCallbackTweenerは、トゥイーン シーケンス内のメソッドを呼び出すために使用されます。
IntervalTweenerTweenアニメーションにアイドル間隔を作成します。
MethodTweener抽象値を補間し、時間の経過とともに呼び出されるメソッドに提供します。
PropertyTweenerオブジェクトのプロパティを時間の経過とともに補間します。

Step1. Tweenの作成

Tweenオブジェクトを作成する時は、
 SceneTree.create_tween または Node.create_tween を使用します。

var _tween = get_tree().create_tween()
var _tween = self.create_tween()

また、Tweenの特徴として、作成時は以下のことに注意する必要があります。

Tween作成時のの注意点
  • Tweenは即座に実行されるため、基本的にアニメを開始するタイミングで作成する
  • ある1つのプロパティに対して、変更を行うTweenは1つにしておく
    →同一プロパティを変更するTweenが複数あると、最新のもので上書きされてしまう
  • 1度実行したTween(Tweener)は再利用できないため、都度新規作成する
    (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

列挙型 EaseType:

EASE_IN = 0補間の開始点がゆっくりで、終了点で高速になる
EASE_OUT = 1補間の開始点が高速で、終了点でゆっくりになる
EASE_IN_OUT = 2補間の開始点/終了点でゆっくりになる
EASE_OUT_IN = 3補間の開始点/終了点で高速になる

遷移(トランジション)タイプ

遷移タイプを設定するときは、set_trans() メソッドと列挙型TransitionTypeを使用します。

メソッド概要
set_trans(trans: TransitionType)デフォルトのトランジションタイプを設定
デフォルト値は TRANS_LINEAR

列挙型 TransitionType :

TRANS_LINEAR = 0線形の補間
TRANS_SINE = 1正弦関数による補間
TRANS_QUINT = 25次関数による補間
TRANS_QUART = 34次関数による補間
TRANS_QUAD = 42次関数による補間
TRANS_EXPO = 5指数関数による補間
TRANS_ELASTIC = 6弾力性を持った補間
(アニメがゆっくりになるタイミングで揺れる)
TRANS_CUBIC = 73次関数による補間
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設定(イージングやトランジションなど)を利用できるのが特徴です。

おすすめの本①
おすすめの本➁(Godot)
GodotEngine
ひらまめ(hiramame)をフォローする
ひらまめゲーム制作研究室

コメント

タイトルとURLをコピーしました