2D Sprite 動畫

前言

在本教學中,你將學習如何使用 AnimatedSprite2D 類別與 AnimationPlayer 製作 2D 動畫角色。通常你製作或下載動畫角色素材時,會有兩種常見格式:一種是每個動畫影格為單獨圖片,另一種是將所有動畫影格合成一張精靈表(Sprite Sheet)。這兩種都能用 Godot 的 AnimatedSprite2D 來做動畫。

首先,我們會用 AnimatedSprite2D 來將多張單獨圖片做成動畫。接著會用同一類別來處理精靈表的動畫。最後,還會學習利用 AnimationPlayer 搭配 Sprite2DAnimation 屬性來製作精靈表動畫的另一種方法。

備註

以下範例的美術素材由 https://opengameart.org/users/ansimuzhttps://opengameart.org/users/tgfcoder 共同提供。

用 AnimatedSprite2D 播放單張圖片序列

這種情境下,你會有一組圖片,每張都代表角色動畫的一個影格。本範例將用以下動畫:

../../_images/2d_animation_run_preview.gif

你可以在這裡下載圖片:2d_sprite_animation_assets.zip

將圖片解壓縮後放到你的專案資料夾。然後用下列節點架構建立你的場景樹:

../../_images/2d_animation_tree1.webp

備註

根節點也可以是 Area2DRigidBody2D。動畫仍然會以同樣的方式製作。一旦動畫完成,你就可以為 CollisionShape2D 形狀分配一個形狀。更多資訊請參見 物理介紹

現在選取 AnimatedSprite2D,在其 SpriteFrames 屬性中選擇「新建 SpriteFrames」。

../../_images/2d_animation_new_spriteframes.webp

點擊新的 SpriteFrames 資源,你會看到一個新的面板出現在編輯器視窗的底部:

../../_images/2d_animation_spriteframes.webp

在編輯器左側的檔案總管面板,把這 8 張單獨的圖片拖到 SpriteFrames 面板的中央區域。然後把左邊動畫名稱從「default」改成「run」。

../../_images/2d_animation_spriteframes_done.webp

Filter Animations 輸入框右上角點擊「播放」按鈕預覽動畫。這時你應該能在視窗中看到動畫,不過速度可能偏慢。可以將 SpriteFrames 面板的 速度 (FPS) 設定改為 10 來讓動畫變流暢。

你也可以點擊「新增動畫」按鈕,然後加入其他圖片來增加更多動畫片段。

動畫控制

動畫製作完成後,你可以用程式碼的 play()stop() 方法來控制動畫。舉例來說,以下程式碼可讓你按住右鍵時播放動畫,放開時停止動畫。

extends CharacterBody2D

@onready var _animated_sprite = $AnimatedSprite2D

func _process(_delta):
    if Input.is_action_pressed("ui_right"):
        _animated_sprite.play("run")
    else:
        _animated_sprite.stop()

用 AnimatedSprite2D 播放精靈表

你也可以用 AnimatedSprite2D 很簡單地播放精靈表動畫。下面用一張公有領域的精靈表來示範:

../../_images/2d_animation_frog_spritesheet.png

按右鍵圖片,選擇“圖片另存為”來下載圖片,然後將圖片複製到專案檔案夾中。

設定場景樹的方法和剛才用多張圖片時一樣。選取 AnimatedSprite2D,然後在 SpriteFrames 屬性中選擇「新建 SpriteFrames」。

點擊新建的 SpriteFrames 資源。這次在下方面板出現時,請點選「從精靈表新增影格」。

../../_images/2d_animation_add_from_spritesheet.webp

在彈出的打開檔案對話方塊中,選擇你的精靈表。

接下來會打開一個新的視窗,裡面會顯示剛才的精靈表。你首先需要修改精靈表中縱向和橫向的圖片數量,我們的這張精靈表裡橫向有四張圖片、縱向有兩張。

../../_images/2d_animation_spritesheet_select_rows.webp

然後,在精靈表中選擇動畫中想要包含的影格。這裡我們選中上面的四個,然後點擊“新增 4 影格”來建立動畫。

../../_images/2d_animation_spritesheet_selectframes.webp

現在你就可以看到在底部面板的動畫列表裡看到這個動畫了。按兩下 default(預設),然後把動畫的名稱改成 jump(跳躍)。

../../_images/2d_animation_spritesheet_animation.webp

最後,點擊 SpriteFrames 編輯器上的播放按鈕,就可以看到青蛙跳起來囉!

../../_images/2d_animation_play_spritesheet_animation.webp

用 AnimationPlayer 搭配精靈表

另一種製作精靈表動畫的方法,是用標準的 Sprite2D 節點來顯示貼圖,然後用 AnimationPlayer 來切換貼圖影格。

考慮一下這個包含 6 影格動畫的精靈表:

../../_images/2d_animation_player-run.png

按右鍵圖片,選擇“圖片另存為”下載圖片,然後將圖片複製到專案檔案夾中。

我們的目標是要讓這些影格圖片輪流播映形成動畫。先建立如下的場景樹:

../../_images/2d_animation_tree2.webp

備註

根節點也可以是 Area2DRigidBody2D。動畫仍然會以同樣的方式製作。一旦動畫完成,你就可以為 CollisionShape2D 形狀分配一個形狀。更多資訊請參見 物理介紹

將精靈表拖到 Sprite 的 Texture 屬性裡,你會看到整張表顯示在畫面上。要分割為單獨影格,請在屬性檢查器展開 Animation 區段,把 Hframes 設成 6HframesVframes 分別是精靈表的水平和垂直影格數。

../../_images/2d_animation_setframes.webp

現在嘗試調整 Frame 屬性的值,你會發現它從 05,Sprite2D 顯示的圖片也跟著改變。這就是我們等等要製作動畫的屬性。

選取 AnimationPlayer,點「動畫」再點「新增」,把新動畫命名為「walk」。將動畫長度設為 0.6,再點選「循環」按鈕讓動畫重複播放。

../../_images/2d_animation_new_animation.webp

接著選取 Sprite2D 節點,點擊鑰匙圖示來新增一個動畫軌道。

../../_images/2d_animation_new_track.webp

接著在時間軸上每個時間點(預設每 0.1 秒)都新增一個影格,直到 0 到 5 全部設定完成。你會看到這些影格已經出現在動畫軌道上:

../../_images/2d_animation_full_animation.webp

點選動畫上的「播放」鍵就能直接預覽動畫效果。

../../_images/2d_animation_running.gif

動畫控制

就像 AnimatedSprite2D 一樣,AnimationPlayer 也能用 play()stop() 方法用程式控制動畫。以下是一個示範:按住右鍵時播放動畫,放開時停止動畫。

extends CharacterBody2D

@onready var _animation_player = $AnimationPlayer

func _process(_delta):
    if Input.is_action_pressed("ui_right"):
        _animation_player.play("walk")
    else:
        _animation_player.stop()

備註

如果你同時變更動畫和其他屬性(例如平台遊戲角色轉身時,同時修改 Sprite 的 h_flip/v_flip 並播放 'turning' 動畫),要注意 play() 並不會立刻生效,而是等到 AnimationPlayer 下次被處理時才生效。這可能會讓屬性已經變動但動畫還沒開始,產生一個「破格」影格。如果這造成問題,你可以在呼叫 play() 之後馬上呼叫 advance(0),讓動畫立即套用。

總結

這些範例展示了你在 Godot 中可以用來做 2D 動畫的兩種主要類別。AnimationPlayer 雖然比 AnimatedSprite2D 複雜一些,但能提供更多功能,像是同時動畫位置、縮放等屬性。另外,AnimationPlayer 也能搭配 AnimatedSprite2D 使用。建議你多加嘗試,找出最適合你需求的工作流程。