AnimatedSpriteを使ってGodotで2Dアニメーションを作る方法

ゲーム開発において、アニメーションはプレイヤーにとって魅力的で没入感のある体験を作り出す上で重要な役割を果たします。Godotのゲームに2Dアニメーションを追加することで、キャラクターや環境に命を吹き込み、視覚的に魅力的でインタラクティブなものにすることができます。

幸いなことに、Godotは2Dアニメーションを簡単に作成して制御するための強力なツールと機能を提供しています。

Godotゲームの設定

まず、Godotゲームエンジンで基本的な2Dゲームシーンを設定します。新しいシーンを作成し、プレイヤーキャラクターとしてKinematicBody2Dノードを追加します。KinematicBody2Dの中に、プレイヤーの衝突境界を表す長方形の形状を持つCollisionShape2Dを追加します。

この記事で使用されているコードは、このGitHubリポジトリで入手可能で、MITライセンスに基づいて無料で使用することができます。

さらに、プレイヤーのアニメーションを処理するためのAnimatedSpriteノードを追加します。また、Input Mapで次の入力アクションをマップしていることを確認してください:

次に、プレイヤーの動きを制御するためのGDScriptコードを記述します。以下のスクリプトをKinematicBody2Dノードにアタッチします:

extends KinematicBody2D
const SPEED = 200
func _physics_process(delta):
var velocity = Vector2.ZERO
if Input.is_action_pressed("move_left"):
velocity.x -= SPEED
if Input.is_action_pressed("move_right"):
velocity.x += SPEED
if Input.is_action_pressed("move_up"):
velocity.y -= SPEED
if Input.is_action_pressed("move_down"):
velocity.y += SPEED
velocity = move_and_slide(velocity)

このスクリプトは、プレイヤーに一定の速度を設定し、矢印キーまたはWASDを使用して左右上下に移動できるようにします。

AnimatedSpriteにSpriteSheetを追加する

次に、AnimatedSpriteを構成して、アニメーション用にスプライトシートを使用します。AnimatedSpriteノードを選択し、ノードのプロパティタブのFramesセクションに移動します。ここで、New SpriteFramesボタンをクリックします。

Godotエディターの下部にあるSpriteFramesタブに切り替えます。SpriteFramesタブで、New Animationボタンをクリックします。各アニメーションに適切なフレームを追加して、walkidleなどのアニメーションを作成します。

さらに、プラットフォーマーゲーム用の射撃、ジャンプ、クライミングなどの他のアニメーションを作成することもできます。その後、Add Frames from SpriteSheetボタンをクリックして、スプライトシートから個々のフレームを自動的に抽出します。

GDScriptを使ってアニメーションを制御する

アニメーションを設定したら、GDScriptを使ってプログラム的に制御することができます。

アニメーションの再生と停止

アニメーションの再生を制御することは、ゲームの中で動的でインタラクティブな体験を提供するために不可欠です。GodotのAnimatedSpriteノードは、ゲームロジックに従ってアニメーションを再生したり停止したりするためのメソッドを提供しています。

KinematicBody2Dノードを拡張し、_physics_process関数の中でアニメーションの制御を処理します。play_animationstop_animationの入力を利用して、対応するアニメーションアクションをトリガーすることができます。

extends KinematicBody2D
func _physics_process(delta):
# アニメーションを再生
if Input.is_action_just_pressed("play_animation"):
$AnimatedSprite.play()
# アニメーションを停止し、最初のフレームにリセット
if Input.is_action_just_pressed("stop_animation"):
$AnimatedSprite.stop()
$AnimatedSprite.frame = 0

適切な入力アクションをマップすることで、プレイヤーにゲーム内のアニメーション再生の制御を与えることができます。

例えば、play_animationアクションをボタンの押下やゲーム内の特定のイベントにバインドすることで、プレイヤーが望むタイミングでアニメーションシーケンスをトリガーできるようにすることができます。さらに、アニメーションの実行中に再生する著作権フリーの音楽を見つけることができます。

同様に、stop_animationアクションをトリガーして、アニメーションを完全に停止させることができます。

これらのアニメーション制御メカニズムを組み込むことで、ゲームのアニメーションに奥行きとインタラクティビティを追加し、プレイヤーにとってより魅力的で没入感のある体験を作り出すことができます。

アニメーションの回転

アニメーションを回転させることで、ゲームに視覚的な興味とバリエーションを加えることができます。AnimatedSpriteノードをプログラム的に回転させて、アニメーションの向きを変更することができます。rotate()メソッドを使って、度数単位で回転を適用することができます。

extends KinematicBody2D
func _physics_process(delta):
if Input.is_action_just_pressed("rotate_animation"):
# アニメーションを45度時計回りに回転
$AnimatedSprite.rotate(deg2rad(45))

rotate_animationに関連付けられたボタンを押すと(入力マップでこのアクションを定義することができます)、rotate()メソッドがAnimatedSpriteノードで呼び出されます。deg2rad()を使って度をラジアンに変換し、ノードを時計回りに45度回転させます。

アニメーションのすべてのフレームを含むAnimatedSpriteノード全体に回転が適用されることに注意してください。したがって、特定のフレームのみを回転させたい場合は、それらを個別のAnimatedSpriteノードに分割するか、個々のフレームを反転させるなどの他のテクニックを使用する必要があります。

アニメーションを反転する

アニメーションを水平または垂直に反転させると、キャラクターの方向の変化を反映させるのに役立ちます。Godotでは、AnimatedSpriteノードは反転を制御するためのプロパティを提供しています。

アニメーションを水平に反転させるには、AnimatedSpriteflip_hプロパティをtrueに設定します。これにより、アニメーションが水平軸に沿ってミラーリングされます。同様に、flip_vプロパティをtrueに設定すると、アニメーションが垂直軸に沿ってミラーリングされます。

extends KinematicBody2D
func _physics_process(delta):
if Input.is_action_just_pressed("flip_animation"):
$AnimatedSprite.flip_h = true
# または垂直反転の場合は $AnimatedSprite.flip_v = true

プレイヤーがflip_animation入力アクションを押したら、AnimatedSpriteflip_hプロパティをtrueに設定します。これにより、アニメーションが水平に反転されます。

AnimatedSpriteでシグナルを利用する

アニメーションをプログラムで制御することに加えて、Godotはシグナルと呼ばれる強力なイベントシステムを提供しています。シグナルを使用すると、ゲームの実行中に発生する特定のイベントや変化に応答することができます。

AnimatedSpriteの場合、animation_finished()frame_changed()という2つの重要なシグナルを使用することができます。

1. animation_finished()シグナル

animation_finished()シグナルは、アニメーションが最後のフレームに達したときに、単一の再生中またはループ中に放出されます。このシグナルは、アニメーションが完了したときにアクションを実行したり、イベントをトリガーしたりする場合に便利です。

extends KinematicBody2D
func _ready():
$AnimatedSprite.connect("animation_finished", self, "_on_animation_finished")
func _on_animation_finished():
# アクションを実行したり、イベントをトリガーしたり
print("Animation finished!")
# ここに追加のコード...

connect()関数を使用して、AnimatedSpriteanimation_finished()シグナルを同じスクリプトの_on_animation_finished()メソッドに接続します。

アニメーションの再生が完了すると、_on_animation_finished()メソッドを使用して、カスタムロジックを実行したり、他の機能をトリガーしたりすることができます。

2. frame_changed()シグナル

frame_changed()シグナルは、アニメーションの現在のフレームが変化するたびに放出されます。これは、アニメーションが再生されているとき、またはプログラムでフレームを変更したときに発生する可能性があります。このシグナルを使用して、フレームの変化を検出し、それに応じて反応することができます。

extends KinematicBody2D
func _ready():
$AnimatedSprite.connect("frame_changed", self, "_on_frame_changed")
func _on_frame_changed():
# 現在のフレームに基づいてアクションを実行
var currentFrame = $AnimatedSprite.frame
print("Current frame: ", currentFrame)
# ここに追加のコード...

AnimatedSpriteframe_changed()シグナルを同じスクリプトの_on_frame_changed()メソッドに接続します。フレームが変化すると、_on_frame_changed()メソッドを使用して現在のフレームにアクセスし、フレームの値に基づいてアクションやロジックを実行することができます。

シグナルを利用することで、アニメーションの完了やフレームの変化などのアニメーションイベントに応答し、ゲームで動的な動作を取り入れたり、特定のアクションをトリガーしたりすることができます。

アニメーションを使ってGodotゲームをより魅力的にする

Godotゲームに2Dアニメーションを追加すると、プレイヤーの全体的な体験を大幅に向上させることができます。アニメーションはキャラクターに命を吹き込み、彼らの動きや行動をより視覚的に魅力的にします。歩く、走る、攻撃する、ジャンプするなどのさまざまなアクションのアニメーションを取り入れることで、動的で没入感のあるゲームプレイ環境を作り出すことができます。

さらに、アニメーションを使ってプレイヤーに視覚的なフィードバックを提供することもできます。このフィードバックはゲームをより魅力的で反応の良いものにし、プレイヤーの操作感と没入感を高めます。