🎬

【Godot4】シーンをスムーズ切り替える

2024/09/25に公開

0. はじめに

Godotでシーンをスムーズに切り替える、Unityで言うところのSceneManager.LoadSceneAsyncを実現する方法を紹介します。たまに「どうするんだっけ?」となるので備忘録として記事にしました。Godotの想定バージョンは4.3です。

1. 普通にシーンを切り替える

Godotでメインシーンを切り替えるには以下のメソッドを使います。ちなみにget_treeNodeのメソッドなので、Nodeを継承したクラスでしか使えません。

  • get_tree().change_scene_to_file(path: String)
  • get_tree().change_scene_to_packed(packed_scene: PackedScene)

上記のメソッドを使い普通にシーンを切り替えると、切り替え先のシーンが巨大な場合、読み込みに時間がかかり、ゲームが一瞬フリーズしてしまいます。

2. バックグラウンド読み込みを行う

GodotにはResourceをバックグラウンドで読み込む仕組みが用意されています。そこで、切り替え先のシーンをあらかじめ読み込んでおき、然るべきタイミングで読み込んだシーンに切り替えるようにします。

extends Node

@export_file("*.tscn") var scene_path: String

func load_scene() -> void:
    # 事前にシーンを読み込み
    ResourceLoader.load_threaded_request(scene_path)

    # シーン遷移のアニメーション再生処理はここで行う
    # ここでアニメーション完了をawaitすることでスムーズな遷移ができる

    # 読み込み完了するまで待機
    var status := ResourceLoader.load_threaded_get_status(scene_path)
    while status == ResourceLoader.THREAD_LOAD_IN_PROGRESS:
        await get_tree().process_frame
        status = ResourceLoader.load_threaded_get_status(scene_path)

    # 読み込み完了したのでシーン切り替え
    get_tree().change_scene_to_packed(ResourceLoader.load_threaded_get(scene_path))

ゲームのスタートボタンが押されたらload_sceneが実行されるイメージです。

シーンのロード状況はload_threaded_get_statusの第二引数から取得できます。事前読み込みのタイミングは_readyでも良いのですが、そこまで重くないシーンであれば遷移アニメーション中にロードが完了するので、アニメーションの再生直前にロードしています。

3. おわり

シーンの読み込みでゲームがフリーズしてしまうとどうしても安っぽさが出てしまいます。バックグラウンド読み込みは簡単にできる割にゲームのクオリティアップに大きな効果があるのでぜひ活用してください。

4. 参考

Discussion