Attention: Here be dragons
This is the latest
(unstable) version of this documentation, which may document features
not available in or compatible with released stable versions of Godot.
Checking the stable version of the documentation...
バックグラウンド読み込み
一般的にゲームはリソースを非同期的に読み込む必要があります。ゲームのメインシーンを切り替えるとき (新しいレベルに移行するときなど)、進行状況を示すロード画面を表示したり、ゲームプレイ中に追加のリソースをロードしたりすることがあります。
標準のロードメソッド (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);
}