概要
Godotで2Dゲーム開発を始めると、キャラクターに命を吹き込むためにAnimatedSprite2DとAnimationPlayerという2つのノードに出会います。多くのチュートリアルでは、まず手軽なAnimatedSprite2Dから紹介されます。しかし、開発が進むにつれて、こんな壁にぶつかることがあります。
- 「歩きアニメーションはできたけど、攻撃モーションに合わせて当たり判定を有効にする方法がわからない…」
- 「ジャンプの頂点で一瞬だけスプライトを切り替えたいのに、タイミングがずれる…」
- 「UIをもっとリッチに、フワッと表示させたいけど、どうすればいいんだろう?」
AnimatedSprite2Dの手軽さの先にある、AnimationPlayerの強力な機能を理解することで、ゲームの表現力は大きく向上します。この記事では、両者の違いと、それぞれの最適な使い分けについて解説します。
2つのアニメーションシステムの基本
まずは、両者の基本的な役割と特徴を整理しましょう。この2つは競合するものではなく、それぞれに得意な役割がある補完的な関係です。
| AnimatedSprite2D | AnimationPlayer | |
|---|---|---|
| 得意なこと | スプライトシートの連続再生 | あらゆるプロパティの時間制御 |
| 設定方法 | インスペクタでSpriteFramesを作成 | タイムラインでキーフレームを打つ |
| シンプルさ | ◎ (非常に簡単) | △ (学習コストあり) |
| 機能性 | △ (スプライト再生のみ) | ◎ (万能) |
| 主な用途 | 単純なキャラクターモーション | 複雑な連携、演出、UIアニ メーション |
AnimatedSprite2Dは「スプライトアニメ専用のシンプルな再生機」、AnimationPlayerは「ゲーム内のあらゆるものを動かせる万能なタイムラインエディタ」と覚えておくと良いでしょう。
AnimatedSprite2D: シンプルさが魅力
AnimatedSprite2Dは、スプライトアニメーションを最も手軽に実装するためのノードです。プログラミング初心者でも、数分でキャラクターを歩かせることができます。
設定方法
AnimatedSprite2Dノードを追加します。- インスペクタの
AnimationプロパティでNew SpriteFramesを選択します。 - 画面下の
SpriteFramesパネルが開くので、defaultアニメーションの名前をwalkなどに変更します。 - ファイルシステムから
walkモーションのスプライト画像をパネルにドラッグ&ドロップします。 AnimationプロパティのAutoplayにチェックを入れるか、スクリプトからplay()を呼び出せば、アニメーションが再生されます。
実践的なコード例
キャラクターの移動状態に合わせてアニメーションを切り替える、最も一般的なコードです。
# CharacterBody2D.gd
@onready var animated_sprite: AnimatedSprite2D = $AnimatedSprite2D
func _physics_process(delta: float) -> void:
var direction = Input.get_axis("ui_left", "ui_right")
if direction:
velocity.x = direction * SPEED
else:
velocity.x = move_toward(velocity.x, 0, SPEED)
# アニメーションの制御
if is_on_floor():
if direction != 0:
animated_sprite.play("walk")
animated_sprite.flip_h = direction < 0
else:
animated_sprite.play("idle")
else:
animated_sprite.play("jump")
move_and_slide()
このシンプルさがAnimatedSprite2Dの最大の魅力です。
AnimationPlayer: あらゆるプロパティを操る万能ツール
AnimationPlayerは、AnimatedSprite2Dが持つシンプルさと引き換えに、強力なパワーと柔軟性を提供します。その本質は「時間軸に沿って、あらゆるプロパティの値を記録・再生する」ことにあります。
AnimationPlayerでできること
- スプライトアニメーション:
Sprite2Dノードのtextureやframeプロパティにキーを打つ。 - 動きと変形:
position,rotation,scaleを動かして、キャラクターをジャンプさせたり、UIをスライドインさせたりする。 - 色の変化:
modulateプロパティをアニメーションさせて、ダメージ時の点滅やフェードアウトを表現する。 - 当たり判定の制御:
CollisionShape2Dのdisabledプロパティを操作し、攻撃モーションの特定のフレームでのみ当たり判定を有効化する。 - サウンドの再生:
AudioStreamPlayerのplay()メ ソッドを特定のタイミングで呼び出す(Call Method Track)。 - シェーダーパラメータの操作: シェーダーの
uniform値を動かして、特殊効果を作る。 - カットシーン制作: カメラ(
Camera2D)の移動、キャラクターのセリフ表示、イベント発生などを一つのタイムラインで管理する。
実践的なコード例:攻撃アニメーションと当たり判定の連携
AnimationPlayerの真価が発揮される典型的な例です。
シーン構成:
- Player (CharacterBody2D)
- Sprite2D
- CollisionShape2D
- AnimationPlayer
- AttackArea (Area2D)
- AttackCollision (CollisionShape2D) # 初期状態ではdisabled
AnimationPlayerの設定:
AnimationPlayerを選択し、新規アニメーションattackを作成します。- タイムラインの長さを
0.6秒などに設定します。 Sprite2Dを選択し、Frameプロパティの横にある鍵マークをクリックしてトラックを追加します。タイムライン上で、攻撃モーションに合わせてフレーム番号のキーを打ちます。AttackCollisionを選択し、disabledプロパティのトラックを追加します。アニメーション開始時(0.0s)にdisabled=trueのキーを打ち、攻撃がヒットするフレーム(0.3sなど)でdisabled=falseのキーを、攻撃が終わるフレーム(0.5sなど)でdisabled=trueのキーを打ちます。AudioStreamPlayerを追加し、streamに攻撃音を設定します。0.3sの位置でAdd Track > Call Method Track