はじめに
ゲームのシーンを切り替えるとき、Webを調べるとそのまま使えそうな記事が掲載されていて、
Godot4.xではどのように行うのか、非同期読み込みを用いた進捗表示画面を付けた形を模索しました。
今回は、下図(fig.1)のようなものを作りましたのでご紹介します。
fig.1 画面遷移
目次
1.シーンローダー(SceneLoader.gd)の作成
自動起動にて常駐するシーンローダーを作成します。
スクリプトは次のようになります。(script.1)
script.1 シーンローダーのスクリプト
処理の流れを解説します。
まず、現在のシーンはset_target_scene(path)メソッドに移動先シーンのフルパスを渡します。
ResourceLoaderは移動先シーンをリソースとして読み込みを開始します。
次に、process(delta)では、一定時間ごとにResourceLoaderでの読み込みの進捗状況を監視します。
load_threaded_get_statusメソッドは指定パスのリソースの読み込み状況を取得します。
これは、ResourceLoaderは読み込みキューの区別を指定パスで行っているためです。
あとはコメントの通りですが、最終行 emit_signal('_scene_loading', p[0]) のパーセント表示に配列から取り出しているのは、
load_threaded_get_statusメソッドから得られる進捗度は第2引数に要素1の配列で格納されるためです。
作成したら、プロジェクトの自動読み込みに登録します。(fig.2)
fig.2 自動読み込みに登録
2.タイトルシーン(TitleScene.tscn)の作成
起動時のシーンとしてタイトルシーンを作成します。
シーンツリーは次のようになります(fig.3)
fig.3 タイトルシーンのシーンツリー
画面に配置するものは、シーン確認用のラベル(Label)とボタンコントロール(Button)です。(fig.4)
fig.4 タイトルシーンのシーンツリー
Buttonが押された時のシグナルpressed()をTitleScene.gdに接続します。
スクリプトは次のようになります。(script.2)
script.2 タイトルシーンのスクリプト
動作としては、ボタンが押されたらシーンローダーに移動先のシーンのパスを登録して、ローディングシーンに移行します。
3.ローディングシーン(LoadingScene.tscn)の作成
シーンツリーと画面構成は下図(fig.5)のようになります。
fig.5 ローディングシーンの構成
スクリプトは下記(script.3)のとおりです。
ほぼ、参考元と同じですが一部のメソッドはGodot4.x系列用になっています。
script.3 ローディングシーンのスクリプト
4.メインシーン(MainScene.tscn)の作成
シーンツリーと画面構成は下図(fig.6)のようになります。
タイトルシーンと同じ構成です。
fig.6 メインシーンの構成
スクリプトは次のようになります。(script.4)
script.4 メインシーンのスクリプト
スクリプトもタイトルシーンとほぼ同じですが、移行先シーンのパスが違うので注意してください。
ボタンが押されたらシーンローダーに移動先のシーンのパスを登録して、ローディングシーンに移行します。
5.動作の確認
タイトルシーンを開始シーンに設定して動作の確認をします。(fig.7)
fig.7 動作の確認
移動先のシーンの読み込みがすぐ終わってしまいますので一瞬だけ進捗画面が表示されます。
シーンの確認が左上のラベルのみなので確認しづらいですがご容赦ください。
6.おわりに
非同期読み込みについて、資料があったのでなんとかなりましたが、Godot4.x系になって
メソッド名が変化したり使い方が変わったりしたので、仕組みができたときは素直に嬉しかったです。
これも先駆者の方々のおかげです。
大変お世話になりました。
最後までお読みいただき有難うございました。
7.参考資料
【Godot Engine】画面遷移時のシーンのローディングのやり方を検討してみる (ENDO (id:erudoru) 氏)
https://erudoru.hatenablog.com/entry/2018/03/26/234028
Godot Engine 4.2の日本語のドキュメント
バックグラウンド読み込み ※英語です
https://docs.godotengine.org/ja/4.x/tutorials/io/background_loading.html
ResourceLoader ※英語です
https://docs.godotengine.org/ja/4.x/classes/class_resourceloader.html#description