2024-11-24-GDProgressBar

2024-11-24-GDProgressBar

十一月 24, 2024

实现独立渲染的加载进度条界面(已弃用)

基本步骤

  1. 创建 CanvasLayer作为独立渲染节点

  2. 使用Godot自带的ProgressBar 作为子节点

    1. 修改颜色
    2. 添加Value
  3. 添加脚本

GDScript写法:

进度条的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
extends Control
// 获取一下进度条

// 定义读取的路径
var loading_path = ""
@onready var progressBar:ProgressBar = $ProgressBar

// 定义进度的数组和值
var progress = []
var scene_load_status = 0
fun _ready():
// 定义一个最大值
progressBar.max_value
// 传入下一个场景的路径
ResourceLoader.load_threaded_request(SceneChanger.loading_path)
pass
fun _process():
scene_load_status = ResourceLoader.load_threaded_get_status(ScenChanger.loading_path)
// 更改进度条
progressBar.value = progress[0] * 100
// 判断是否加载完毕
if scene_load_status = ResourceLoader.THEAD_LOAD_LOADED:
// 关闭加载函数
set_proess(false)
// 交互优化 停顿0.5s
await get_tree().create_timer(0.5).timeout
SceneChanger.change_scene(ReosurceLoader.load_threaded_get(SceneChanger.loading_path))
pass

场景的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
extends CanvasLayer
var loading_path = ""
@onready var animation:AnimationPlaer = $AnimationPlayer
func _ready():
self.hide()
pass
func _process(delta):
pass
func change_scene(path, isLoading:bool = false):
self.show()
self.set_layer(999)
animation.play("changer")
await animation.animation_finished
if is Loading:
loading_path = path
// 那就执行loading页面
get_tree().change_scene_to_file("res://page_loading/page_loading.tscn")
else:
// 资源加载完资源有一个自己的类型
if typeof(path) == TYPE_STRING:

get_tree().change_scene_to_file(path)
else:
get_tree().change_scene_to_packed(path)
get_tree().change_scene_to_file(path)
animation.play_backwards("changer")
await animation.animation_finished
self.set_layer(-1)
self.hide()
pass

调用时

1
SceneChanger.change_scene("res://scene2.tscn", true)

C# 写法


主要思路就是,先检查是否加载,若未加载,则运行进度条,加载后出现

定义方法,接收场景资源和进度条资源

进度条根据场景资源的加载速度来加载

使用 ResourceLoader

通常使用 ResourceLoader.load_threaded_request 将资源加载请求加入队列,其他线程会在后台进行加载。

你可以使用 ResourceLoader.load_threaded_get_status 检查状态。给 progress 传一个数组变量就可以获取进度,返回时该数组中包含一个元素,表示百分比。

最后调用 ResourceLoader.load_threaded_get 即可获取加载到的资源。

传入需要加载的场景的路径,让场景都在进度条的类下进行加载。

加载完毕后关闭进度条类。

实例化场景类。


迫真写法

我这个无敌了上面麻烦死了!!!

1
2
3
ResourceLoader.LoadThreadedRequest(resourcePath, "PackedScene", true);
ResourceLoader.ThreadLoadStatus loadState = ResourceLoader.LoadThreadedGetStatus(resourcePath, progressArray);