GDScript: Document static variables

This commit is contained in:
Danil Alexeev
2023-05-23 18:12:54 +03:00
parent ccae259c15
commit 9fb9915ad9

View File

@@ -191,7 +191,7 @@ in case you want to take a look under the hood.
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| func | Defines a function. |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| static | Defines a static function. Static member variables are not allowed. |
| static | Defines a static function or a static member variable. |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
| const | Defines a constant. |
+------------+---------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -412,8 +412,8 @@ Both of these are the same::
.. _doc_gdscript_onready_annotation:
`@onready` annotation
~~~~~~~~~~~~~~~~~~~~~
``@onready`` annotation
~~~~~~~~~~~~~~~~~~~~~~~
When using nodes, it's common to desire to keep references to parts
of the scene in a variable. As scenes are only warranted to be
@@ -847,6 +847,110 @@ Valid types are:
You can turn off this check, or make it only a warning, by changing it in
the project settings. See :ref:`doc_gdscript_warning_system` for details.
Static variables
^^^^^^^^^^^^^^^^
A class member variable can be declared static::
static var a
Static variables belong to the class, not instances. This means that static variables
share values between multiple instances, unlike regular member variables.
From inside a class, you can access static variables from any function, both static and non-static.
From outside the class, you can access static variables using the class or an instance
(the second is not recommended as it is less readable).
.. note::
The ``@export`` and ``@onready`` annotations cannot be applied to a static variable.
Local variables cannot be static.
The following example defines a ``Person`` class with a static variable named ``max_id``.
We increment the ``max_id`` in the ``_init()`` function. This makes it easy to keep track
of the number of ``Person`` instances in our game.
::
# person.gd
class_name Person
static var max_id = 0
var id
var name
func _init(p_name):
max_id += 1
id = max_id
name = p_name
In this code, we create two instances of our ``Person`` class and check that the class
and every instance have the same ``max_id`` value, because the variable is static and accessible to every instance.
::
# test.gd
extends Node
func _ready():
var person1 = Person.new("John Doe")
var person2 = Person.new("Jane Doe")
print(person1.id) # 1
print(person2.id) # 2
print(Person.max_id) # 2
print(person1.max_id) # 2
print(person2.max_id) # 2
Static variables can have type hints, setters and getters::
static var balance: int = 0
static var debt: int:
get:
return -balance
set(value):
balance = -value
A base class static variable can also be accessed via a child class::
class A:
static var x = 1
class B extends A:
pass
func _ready():
prints(A.x, B.x) # 1 1
A.x = 2
prints(A.x, B.x) # 2 2
B.x = 3
prints(A.x, B.x) # 3 3
``@static_unload`` annotation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Since GDScript classes are resources, having static variables in a script prevents it from being unloaded
even if there are no more instances of that class and no other references left. This can be important
if static variables store large amounts of data or hold references to other project resources, such as scenes.
You should clean up this data manually, or use the :ref:`@static_unload <class_@GDScript_annotation_@static_unload>`
annotation if static variables don't store important data and can be reset.
.. warning::
Currently, due to a bug, scripts are never freed, even if ``@static_unload`` annotation is used.
Note that ``@static_unload`` applies to the entire script (including inner classes)
and must be placed at the top of the script, before ``class_name`` and ``extends``::
@static_unload
class_name MyNode
extends Node
See also `Static functions`_ and `Static constructor`_.
Casting
^^^^^^^
@@ -1080,15 +1184,15 @@ Lambda functions capture the local environment. Local variables are passed by va
Static functions
^^^^^^^^^^^^^^^^
A function can be declared static. When a function is static, it has no
access to the instance member variables or ``self``. This is mainly
useful to make libraries of helper functions::
A function can be declared static. When a function is static, it has no access to the instance member variables or ``self``.
A static function has access to static variables. Also static functions are useful to make libraries of helper functions::
static func sum2(a, b):
return a + b
Lambdas cannot be declared static.
See also `Static variables`_ and `Static constructor`_.
Statements and control flow
~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@ -1467,13 +1571,11 @@ If you want to use ``extends`` too, you can keep both on the same line::
class_name MyNode extends Node
.. note:: Godot's class syntax is compact: it can only contain member variables or
functions. You can use static functions, but not static member variables. In the
same way, the engine initializes variables every time you create an instance,
and this includes arrays and dictionaries. This is in the spirit of thread
safety, since scripts can be initialized in separate threads without the user
knowing.
.. note::
Godot initializes non-static variables every time you create an instance,
and this includes arrays and dictionaries. This is in the spirit of thread safety,
since scripts can be initialized in separate threads without the user knowing.
Inheritance
^^^^^^^^^^^
@@ -1589,6 +1691,19 @@ There are a few things to keep in mind here:
func _init():
super(5)
Static constructor
^^^^^^^^^^^^^^^^^^
A static constructor is a static function ``_static_init`` that is called automatically
when the class is loaded, after the static variables have been initialized::
static var my_static_var = 1
static func _static_init():
my_static_var = 2
A static constructor cannot take arguments and must not return any value.
Inner classes
^^^^^^^^^^^^^