バックグラウンド読み込み
一般的にゲームはリソースを非同期的に読み込む必要があります。ゲームのメインシーンを切り替えるとき (新しいレベルに移行するときなど)、進行状況を示すロード画面を表示したり、ゲームプレイ中に追加のリソースをロードしたりすることがあります。
標準のロードメソッド (ResourceLoader.load または GDScript のより単純な load) はスレッドをブロックし、このロード中はゲームが応答しなくなったように見えます。
これを回避する方法の1つは、 ResourceLoader を使用してバックグラウンドスレッドでリソースを非同期にロードすることです。
ResourceLoaderの使用
一般的には ResourceLoader.load_threaded_request を使用してロードするリソースのパスをリクエストキューに入れます。これを行うとバックグラウンドのスレッドでリソースがロードされます。
ロード中のステータスは ResourceLoader.load_threaded_get_status で確認できます。進行状況(パーセント表記)は1要素の配列変数を progress 経由で渡すことによって取得できます。
最後に ResourceLoader.load_threaded_get を呼び出して、ロードされたリソースを取得します。
load_threaded_get() を呼び出すと、リソースがバックグラウンドでロードを完了しているときは即座に返されます。そうでないときは load() のようにロード完了するまでブロックされます。これがブロックされないことを保証したい場合は、ロードのリクエストとリソースの取得の間に十分な時間を確保するか、ステータスを手動で確認する必要があります。
サンプル
このサンプルではバックグラウンドでシーンをロードする方法を示します。ボタンを押すと敵がスポーンするようにします。敵は Enemy.tscn です。これを _ready でロードし、ボタンが押されたときにインスタンス化します。パスは res://Enemy.tscn です。
まずリソースのロードをリクエストして、ボタンのシグナルにメソッドを接続します。
const ENEMY_SCENE_PATH : String = "Enemy.tscn"
func _ready():
ResourceLoader.load_threaded_request(ENEMY_SCENE_PATH)
self.pressed.connect(_on_button_pressed)
using Godot;
public partial class MyButton : Button
{
private const string EnemyScenePath = "Enemy.tscn";
public override void _Ready()
{
ResourceLoader.LoadThreadedRequest(EnemyScenePath);
Pressed += OnButtonPressed;
}
}
これでボタンが押されたときに _on_button_pressed が呼び出されます。このメソッドは敵をスポーンするために使用します。
func _on_button_pressed(): # Button was pressed.
# Obtain the resource now that we need it.
var enemy_scene = ResourceLoader.load_threaded_get(ENEMY_SCENE_PATH)
# Instantiate the enemy scene and add it to the current scene.
var enemy = enemy_scene.instantiate()
add_child(enemy)
private void OnButtonPressed() // Button was pressed.
{
// Obtain the resource now that we need it.
var enemyScene = (PackedScene)ResourceLoader.LoadThreadedGet(EnemyScenePath);
// Instantiate the enemy scene and add it to the current scene.
var enemy = enemyScene.Instantiate();
AddChild(enemy);
}