Фоновая загрузка
Обычно играм необходимо загружать ресурсы асинхронно. При переключении основной сцены вашей игры (например, при переходе на новый уровень) вы можете захотеть отобразить экран загрузки с некоторой индикацией прогресса или загрузить дополнительные ресурсы во время игры.
Стандартный метод загрузки (ResourceLoader.load или более простой метод GDScript load) блокирует ваш поток, из-за чего ваша игра выглядит неотзывчивой во время загрузки ресурса.
Одним из способов решения этой проблемы является использование ResourceLoader для асинхронной загрузки ресурсов в фоновых потоках.
Использование ResourceLoader
Обычно запросы на загрузку ресурсов для пути ставятся в очередь с помощью ResourceLoader.load_threaded_request, которые затем будут загружены в потоках в фоновом режиме.
Вы можете проверить статус с помощью ResourceLoader.load_threaded_get_status. Прогресс можно получить, передав переменную-массив через progress, которая вернет массив из одного элемента, содержащий процентное значение.
Наконец, вы извлекаете загруженные ресурсы, вызывая ResourceLoader.load_threaded_get.
После вызова load_threaded_get() ресурс либо загрузится в фоновом режиме и будет мгновенно возвращён, либо загрузка заблокируется на этом этапе, как это произошло бы с load(). Чтобы гарантировать отсутствие блокировки, необходимо либо обеспечить достаточный интервал между запросом загрузки и получением ресурса, либо вручную проверить статус загрузки.
Пример
В этом примере показано, как загрузить сцену на заднем плане. Кнопка будет создавать врага при нажатии. Враг будет Enemy.tscn, который будет загружен при _ready и создан при нажатии. Путь будет "Enemy.tscn", он расположен по адресу 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);
}