0 votes

In GDScript, I have the following issue:

*. I create a component, call it Maker which uses a common instance of the component Inventory.
*. I have a top level scene, MakerHarness, for exercising Maker. MakerHarness contains an instance of Inventory and an instance of Maker.
*. I have another top level scene, TheGame, which contains a common instance of Inventory and many instance of Maker.
* I want Maker to call Inventory functions.

Is there a best way to do this? Here's what I've tried:

Option 1: AutoLoad as a singleton

I create a project wide Project Settings/AutoLoad with an Inventory instance. I use this to call functions anywhere.

  • Means that the Inventory scene must always be in a working state before I can do any other development.
  • As I have other classes, there will many scenes that must compile and load correctly before any other work can be done.
  • Can call is normally, e.g., Inventory.add_item(...)

Option 2: AutoLoad a global singleton named g.

I create a scene that just has instance variables, e.g., var Inventory. In both MakerHarness and TheGame, in the _ready(), I do g.Inventory = $Inventory.

  • I don't see explicit documentation about the order of AutoLoad instantiation
  • I can create mock in the global. The mocks would be used unless real classes are explicitly set. This allows me to write complex code in any order.
  • Only slightly clunky to call. It needs one line per singleton in each harness or top level's _ready() function. Calls in other code are just an indirect: g.Inventory.add_item(...).

Option 3: Use a global signal

I haven't tried this, but it seems like I could have a global singleton that can emit a signal ApplicationReady to handle processing deferred until the entire application is ready.
* I pass any global references as signal parameters.
* Receiving handler has code like Inventory = params["Inventory"] and items are called naturally like Inventory.add_item(...)
* Cannot connect the signal from the gui, must call connect() from each component's _ready().

With Godot there always seems to be more. Is there a better way I just don't know about? Has anyone done the Option 3?

Godot version v3.4.3
in Engine by (329 points)

1 Answer

+1 vote

Well personally I use global autoload scripts for quite a few things, I have one for various functions and another separate autoload script for shared variables. I cannot say that is necessarily the best but it certainly works.

One simple thing I can mention though I think it is likely you are aware of this but do you know that there is an onready function in the godot scripts?

e.g.

Onready var example = true

this will ensure that the var will not be created until the node has been fully instantiated.

by (2,139 points)

Thank you for your comment.

Welcome to Godot Engine Q&A, where you can ask questions and receive answers from other members of the community.

Please make sure to read Frequently asked questions and How to use this Q&A? before posting your first questions.
Social login is currently unavailable. If you've previously logged in with a Facebook or GitHub account, use the I forgot my password link in the login box to set a password for your account. If you still can't access your account, send an email to [email protected] with your username.