mirror of
https://github.com/godotengine/godot-docs.git
synced 2026-01-04 14:11:02 +03:00
GDScript: Document static variables
This commit is contained in:
@@ -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
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
|
||||
Reference in New Issue
Block a user