From bed15943557e14a4132fa9a024a31101413266d2 Mon Sep 17 00:00:00 2001 From: eitanbariboa Date: Sat, 29 Jun 2024 00:45:58 +0300 Subject: [PATCH] First init --- .gitattributes | 2 + README.md | 80 +++++++++++++- addons/AsyncSceneManager/AsyncScene.gd | 101 ++++++++++++++++++ .../Examples/SceneChanging.gd | 19 ++++ .../Examples/scene_main.tscn | 15 +++ .../Examples/scene_to_load.tscn | 12 +++ addons/AsyncSceneManager/Icon.jpg | Bin 0 -> 16707 bytes addons/AsyncSceneManager/Icon.jpg.import | 34 ++++++ project.godot | 18 ++++ 9 files changed, 280 insertions(+), 1 deletion(-) create mode 100644 .gitattributes create mode 100644 addons/AsyncSceneManager/AsyncScene.gd create mode 100644 addons/AsyncSceneManager/Examples/SceneChanging.gd create mode 100644 addons/AsyncSceneManager/Examples/scene_main.tscn create mode 100644 addons/AsyncSceneManager/Examples/scene_to_load.tscn create mode 100644 addons/AsyncSceneManager/Icon.jpg create mode 100644 addons/AsyncSceneManager/Icon.jpg.import create mode 100644 project.godot diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..8ad74f7 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Normalize EOL for all files that Git considers text files. +* text=auto eol=lf diff --git a/README.md b/README.md index 025e634..abfe7ff 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,80 @@ -# AsyncScene +## AsyncScene - Asynchronous Scene Loader + This Godot tool provides a simple way to load scenes asynchronously, improving your game's loading times and user experience. + +### Features + +- Load scenes in the background without freezing the main thread. +- Replace the current scene or add the loaded scene additively. +- Choose between immediate or manual scene switching after loading. +- Track loading progress with a percentage value. +- Receive notifications upon successful or failed scene loading. + +### Installation + +1. Copy the `AsyncScene.gd` script into your project. +2. Optionally, you can create a new resource type for easier access: + - Go to **Project > Project Settings > Plugins > Resource** and click "Create a Resource Type". + - Choose a name (e.g., "AsyncScene") and link it to the `AsyncScene.gd` script. + +### Usage + +**1. Loading a scene:** + +```gdscript +extends Node2D + +var scene : AsyncScene + +func _ready() -> void: + # Replace the current scene immediately after loading: + scene = AsyncScene.new( "res://path/to/your/scene.tscn", AsyncScene.LoadingSceneOperation.ReplaceImmediate) + + # Replace the current scene manually after loading (call scene.ChangeScene() later): + # scene = AsyncScene.new("res://path/to/your/scene.tscn", AsyncScene.LoadingSceneOperation.Replace) + + # Add the loaded scene to the current scene tree: + # scene = AsyncScene.new("res://path/to/your/scene.tscn", AsyncScene.LoadingSceneOperation.Additive) + + # Connect to the OnComplete signal to get notified when loading is finished: + scene.OnComplete.connect(on_scene_load_complete) + +func on_scene_load_complete(): + # Do something after the scene is loaded, e.g., hide loading screen. + pass +``` + +**2. Manually switching to the loaded scene (if using Replace mode):** + +```gdscript +func _process(delta): + if scene and scene.isCompleted: + scene.ChangeScene() +``` + +**3. Accessing loading progress:** + +```gdscript +func _process(delta): + if scene: + print("Loading progress: ", scene.progress, "%") +``` + +**4. Unloading the loaded scene:** + +```gdscript +scene.UnloadScene() +``` + +**5. Getting the loading status:** + +```gdscript +var status = scene.GetStatus() # Returns a string like "THREAD_LOAD_IN_PROGRESS", "THREAD_LOAD_LOADED", etc. +``` + +### Example + +Check the provided `example.tscn` scene for a practical demonstration of how to use the AsyncScene tool. + + +This readme provides a basic overview of the AsyncScene tool and its usage. You can further customize and extend this tool to suit your specific needs. diff --git a/addons/AsyncSceneManager/AsyncScene.gd b/addons/AsyncSceneManager/AsyncScene.gd new file mode 100644 index 0000000..c47f13b --- /dev/null +++ b/addons/AsyncSceneManager/AsyncScene.gd @@ -0,0 +1,101 @@ +extends Node +class_name AsyncScene + + +enum LoadingSceneOperation { + ReplaceImmediate, ## Replaces scene as soon as it loads + Replace, ## Doesn't Replace scene immediate, and need to call ChangeScene(using the same path) + Additive ## Adding to the tree another scene +} +var status_names = { + ResourceLoader.THREAD_LOAD_IN_PROGRESS: "THREAD_LOAD_IN_PROGRESS", + ResourceLoader.THREAD_LOAD_FAILED: "THREAD_LOAD_FAILED", + ResourceLoader.THREAD_LOAD_INVALID_RESOURCE: "THREAD_LOAD_INVALID_RESOURCE", + ResourceLoader.THREAD_LOAD_LOADED: "THREAD_LOAD_LOADED" +} + +var timer : Timer = Timer.new() +signal OnComplete +var packedScenePath : String = "" +var myRes : PackedScene = null +var currentSceneNode : Node = null +var progress : float = 0 +var isCompleted : bool = false +var typeOperation : LoadingSceneOperation = LoadingSceneOperation.ReplaceImmediate + +func _init(tscnPath : String, setOperation : LoadingSceneOperation = LoadingSceneOperation.ReplaceImmediate ) -> void: + packedScenePath = tscnPath + typeOperation = setOperation + if not ResourceLoader.exists(tscnPath): + printerr("Invalid scene path " + tscnPath) + return + ResourceLoader.load_threaded_request(tscnPath,"",true) + call_deferred("_setupUpdateSeconds") + + + +func ChangeScene() -> void: + if not isCompleted: + printerr("Scene hasn't been loaded yet") + return + Engine.get_main_loop().root.get_tree().change_scene_to_packed(myRes) + currentSceneNode = Engine.get_main_loop().root.get_tree().current_scene + +func GetStatus() -> String: + return status_names.get(_getStatus()) + +#region Private + +func _additiveScene() -> void: + currentSceneNode = myRes.instantiate() + Engine.get_main_loop().root.call_deferred("add_child",currentSceneNode) + + +## Unloading +func UnloadScene() -> void: + if not isCompleted: + printerr("Scene hasn't been loaded yet") + return + currentSceneNode.queue_free() + queue_free() + + +func _setupUpdateSeconds() -> void: + Engine.get_main_loop().root.add_child(timer) + timer.one_shot = false + timer.autostart = true + timer.set_wait_time(0.1) + timer.timeout.connect(_check_status) + timer.start() + + +func _getStatus() -> ResourceLoader.ThreadLoadStatus: + return ResourceLoader.load_threaded_get_status(packedScenePath) + + +func _check_status() -> void: + if isCompleted : return + if _getStatus() == ResourceLoader.THREAD_LOAD_LOADED: + myRes = ResourceLoader.load_threaded_get(packedScenePath) + if typeOperation == LoadingSceneOperation.ReplaceImmediate: + ChangeScene() + elif typeOperation == LoadingSceneOperation.Additive: + _additiveScene() + _complete() + elif _getStatus() == ResourceLoader.THREAD_LOAD_INVALID_RESOURCE: + _complete() + elif _getStatus() == ResourceLoader.THREAD_LOAD_FAILED: + _complete() + elif _getStatus() == ResourceLoader.THREAD_LOAD_IN_PROGRESS: + var progressArr : Array = [] + ResourceLoader.load_threaded_get_status(packedScenePath,progressArr) + progress = progressArr.front() * 100 + + + +func _complete() -> void: + timer.queue_free() + OnComplete.emit() + isCompleted = true + progress = 100 +#endregion diff --git a/addons/AsyncSceneManager/Examples/SceneChanging.gd b/addons/AsyncSceneManager/Examples/SceneChanging.gd new file mode 100644 index 0000000..c4f2971 --- /dev/null +++ b/addons/AsyncSceneManager/Examples/SceneChanging.gd @@ -0,0 +1,19 @@ +extends Node2D + +var scene : AsyncScene = null +@export var scenePath : String = 'res://addons/AsyncSceneManager/Examples/scene_to_load.tscn' + + +func _ready() -> void: + #scene = AsyncScene.new(scenePath,AsyncScene.LoadingSceneOperation.Replace) loading and later changing using scene.ChangeScene() + #scene = AsyncScene.new(scenePath,AsyncScene.LoadingSceneOperation.ReplaceImmediate) Immediately changing the scene after loading + scene = AsyncScene.new(scenePath,AsyncScene.LoadingSceneOperation.Additive) #Loading Scene additively to another scene + scene.OnComplete.connect(complete) #Binding to signal after complete loading + +func complete() -> void: + #scene.UnloadScene() Unloading scene + #scene.ChangeScene() Changing the main scene manually + print("Loading complete") + pass + + diff --git a/addons/AsyncSceneManager/Examples/scene_main.tscn b/addons/AsyncSceneManager/Examples/scene_main.tscn new file mode 100644 index 0000000..5d94655 --- /dev/null +++ b/addons/AsyncSceneManager/Examples/scene_main.tscn @@ -0,0 +1,15 @@ +[gd_scene load_steps=2 format=3 uid="uid://ca76hnnn8ums7"] + +[ext_resource type="Script" path="res://addons/AsyncSceneManager/Examples/SceneChanging.gd" id="1_bldvc"] + +[node name="scene_main" type="Node2D"] +script = ExtResource("1_bldvc") + +[node name="Label" type="Label" parent="."] +offset_left = 452.0 +offset_right = 1152.0 +offset_bottom = 261.0 +theme_override_font_sizes/font_size = 191 +text = "Scene 1" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/addons/AsyncSceneManager/Examples/scene_to_load.tscn b/addons/AsyncSceneManager/Examples/scene_to_load.tscn new file mode 100644 index 0000000..afb67b5 --- /dev/null +++ b/addons/AsyncSceneManager/Examples/scene_to_load.tscn @@ -0,0 +1,12 @@ +[gd_scene format=3 uid="uid://dqojfek3b58la"] + +[node name="scene_to_load" type="Node2D"] + +[node name="Label" type="Label" parent="."] +offset_top = 289.0 +offset_right = 700.0 +offset_bottom = 550.0 +theme_override_font_sizes/font_size = 191 +text = "Scene 2" +horizontal_alignment = 1 +vertical_alignment = 1 diff --git a/addons/AsyncSceneManager/Icon.jpg b/addons/AsyncSceneManager/Icon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d147a98935457d1803c888ae8877eec93a64b347 GIT binary patch literal 16707 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 Kzt0BlCjUQ8CZ87o literal 0 HcmV?d00001 diff --git a/addons/AsyncSceneManager/Icon.jpg.import b/addons/AsyncSceneManager/Icon.jpg.import new file mode 100644 index 0000000..db32f09 --- /dev/null +++ b/addons/AsyncSceneManager/Icon.jpg.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://bbtg7trios1jk" +path="res://.godot/imported/Icon.jpg-f9230da019f0fcfc56881806ec8dc408.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://addons/AsyncSceneManager/Icon.jpg" +dest_files=["res://.godot/imported/Icon.jpg-f9230da019f0fcfc56881806ec8dc408.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/project.godot b/project.godot new file mode 100644 index 0000000..88bd518 --- /dev/null +++ b/project.godot @@ -0,0 +1,18 @@ +; Engine configuration file. +; It's best edited using the editor UI and not directly, +; since the parameters that go here are not all obvious. +; +; Format: +; [section] ; section goes between [] +; param=value ; assign values to parameters + +config_version=5 + +[application] + +config/name="AsyncSceneManager" +config/features=PackedStringArray("4.3", "Forward Plus") + +[debug] + +gdscript/warnings/untyped_declaration=2