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) блокує ваш потік, через що ваша гра не відповідає на запити під час завантаження ресурсу.
Одним із способів обійти це є використання 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);
}