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?