Skip to content

An Example which Should be Added to "Coroutines with yield" #5892

@Pixelmusement

Description

@Pixelmusement

Godot version: v3.4.3.stable.official [242c05d12]

Issue description:
A fundamental issue I ran into trying to learn GDScript was that there was seemingly no clean and simple way to pause execution of an entire script. Sure, yield() can pause a FUNCTION in a script, but not the script as a whole. One of the key things I wanted to be able to do with an RPG I'm working on is script out actions and events and dialogue using GDScript directly, but it didn't seem like there was a good way to do this.

However, I couldn't accept that, so I'd been tinkering around with how yield() works trying to come up with a simple method for being able to yield an entire script and while I didn't find a definitive solution, I found a VERY simple workaround which I feel should be explained in the documentation to some extent because of how fundamental this is towards creating RPGs with Godot:

var y


func YieldScript():
	print("1st Yield Performed"); yield()
	print("2nd Yield Performed"); yield()
	print("3rd Yield Performed"); yield()
	print("4th Yield Performed"); yield()


func _process(delta):
	if Input.is_action_just_pressed("ui_accept"):
		if (y != null):
			y = y.resume()


func _ready():
	y = YieldScript()

What this code effectively does is starts the script I want to be able to suspend execution from simply and quickly and stores the yielded function in y. Then, during normal processing (or this could also be attached to a signaled function) a check is made to make sure y is not null, and if it's not resumes y while storing the resumed result into y again!

This methodology of using yield() is not explained in the documentation and I REALLY feel like it should be, along with an example to demonstrate how using yield in this manner can allow for processing a script in stages.

URL to the documentation page:
https://docs.godotengine.org/en/stable/tutorials/scripting/gdscript/gdscript_basics.html?highlight=yield#coroutines-with-yield

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:manualIssues and PRs related to the Manual/Tutorials section of the documentationcontent:example codeIssues and PRs involving code examplesenhancement

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions