环境
godot 4.1.2+
.net 8
正文
一般而言我们的游戏过场通常会有一些过场动画,这个时候通常一般是用来加载数据、场景,随后进入场景。我们可以在 godot4 中用下面这个方式去载入场景:
GD.Load<PackedScene>("res://scenes/LoadingScene.tscn");这样去编写好处是比较简单的,坏处是我们不知道加载进度,所以我们要更换一个实现方案:
好在 godot 默认提供了如下两个 API 去完成:
- ResourceLoader.LoadThreadedGet - 完成后获取内容
 - ResourceLoader.LoadThreadedGetStatus - 获取当前的状态
 - ResourceLoader.LoadThreadedRequest - 开始加载
 
通过这个三个 api 就可以像下面这样实现:
public partial class SceneManager : Node  
{
	private LoadingNode _loadingScene;
	// 用来确保 loading 动画是在最上面的
	public void MoveLoadingSceneToTop() {}
	public void DoLoadingStatus(string path) {}
	public async Task StartLoad(string path) 
	{
		MoveLoadingSceneToTop();
		var state = ResourceLoader.LoadThreadedRequest(path, "", true);
		{  
		    await _loadingScene.LoadingFadeIn();  
		    bool didLoadFinish;  
		    do  
		    {  
		        didLoadFinish = await DoLoadingStatus(path);  
		        await Task.Delay(TimeSpan.FromSeconds(0.1));  
		    } while (!didLoadFinish);  
		}
	}
	
}我们利用 async await 去等待 status 执行,目前调用间隔为 100ms 实际上为了获取更精确的进度,可以设置的更短一点。
下面编写一下 DoLoadingStatus 的逻辑:
private Godot.Collections.Array progress = new();
public async Task DoLoadingStatus(string currentLoadingPath)  
{  
    var loadState = ResourceLoader.LoadThreadedGetStatus(currentLoadingPath, progress);  
    switch (loadState)  
    {        
		case ResourceLoader.ThreadLoadStatus.Loaded:  
			// 完成了加载	
            break;  
        case ResourceLoader.ThreadLoadStatus.InvalidResource:  
            // 加载资源无效
            break;  
        case ResourceLoader.ThreadLoadStatus.Failed:  
            // 加载资源失败
            break;  
        case ResourceLoader.ThreadLoadStatus.InProgress:  
            // 资源在加载中
            break;  
    }  
}loading 进度的逻辑就通过 progress 传递给 loading scene 即可。
本文标题:在 godot4 中实现异步场景加载
永久链接:https://iceprosurface.com/2024/godot-loading-scene/
作者授权:本文由 icepro 原创编译并授权刊载发布。
版权声明:本文使用「署名-非商业性使用-相同方式共享 4.0 国际」创作共享协议,转载或使用请遵守署名协议。