gdscript_styleguide.rst 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. .. _doc_gdscript_styleguide:
  2. GDScript style guide
  3. ====================
  4. This style guide lists conventions to write elegant GDScript. The goal is to
  5. encourage writing clean, readable code and promote consistency across projects,
  6. discussions, and tutorials. Hopefully, this will also support the development of
  7. auto-formatting tools.
  8. Since GDScript is close to Python, this guide is inspired by Python's
  9. `PEP 8 <https://www.python.org/dev/peps/pep-0008/>`__ programming
  10. style guide.
  11. Style guides aren't meant as hard rulebooks. At times, you may not be able to
  12. apply some of the guidelines below. When that happens, use your best judgment,
  13. and ask fellow developers for insights.
  14. In general, keeping your code consistent in your projects and within your team is
  15. more important than following this guide to a tee.
  16. .. note:: Godot's built-in script editor uses a lot of these conventions
  17. by default. Let it help you.
  18. Here is a complete class example based on these guidelines:
  19. ::
  20. class_name StateMachine
  21. extends Node
  22. # Hierarchical State machine for the player.
  23. # Initializes states and delegates engine callbacks
  24. # (_physics_process, _unhandled_input) to the state.
  25. signal state_changed(previous, new)
  26. export var initial_state = NodePath()
  27. var is_active = true setget set_is_active
  28. @onready var _state = get_node(initial_state) setget set_state
  29. @onready var _state_name = _state.name
  30. func _init():
  31. add_to_group("state_machine")
  32. func _ready():
  33. connect("state_changed", self, "_on_state_changed")
  34. _state.enter()
  35. func _unhandled_input(event):
  36. _state.unhandled_input(event)
  37. func _physics_process(delta):
  38. _state.physics_process(delta)
  39. func transition_to(target_state_path, msg={}):
  40. if not has_node(target_state_path):
  41. return
  42. var target_state = get_node(target_state_path)
  43. assert(target_state.is_composite == false)
  44. _state.exit()
  45. self._state = target_state
  46. _state.enter(msg)
  47. Events.emit_signal("player_state_changed", _state.name)
  48. func set_is_active(value):
  49. is_active = value
  50. set_physics_process(value)
  51. set_process_unhandled_input(value)
  52. set_block_signals(not value)
  53. func set_state(value):
  54. _state = value
  55. _state_name = _state.name
  56. func _on_state_changed(previous, new):
  57. print("state changed")
  58. emit_signal("state_changed")
  59. .. _formatting:
  60. Formatting
  61. ----------
  62. Encoding and special characters
  63. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  64. * Use line feed (**LF**) characters to break lines, not CRLF or CR. *(editor default)*
  65. * Use one line feed character at the end of each file. *(editor default)*
  66. * Use **UTF-8** encoding without a `byte order mark <https://en.wikipedia.org/wiki/Byte_order_mark>`_. *(editor default)*
  67. * Use **Tabs** instead of spaces for indentation. *(editor default)*
  68. Indentation
  69. ~~~~~~~~~~~
  70. Each indent level should be one greater than the block containing it.
  71. **Good**:
  72. .. rst-class:: code-example-good
  73. ::
  74. for i in range(10):
  75. print("hello")
  76. **Bad**:
  77. .. rst-class:: code-example-bad
  78. ::
  79. for i in range(10):
  80. print("hello")
  81. for i in range(10):
  82. print("hello")
  83. Use 2 indent levels to distinguish continuation lines from
  84. regular code blocks.
  85. **Good**:
  86. .. rst-class:: code-example-good
  87. ::
  88. effect.interpolate_property(sprite, "transform/scale",
  89. sprite.get_scale(), Vector2(2.0, 2.0), 0.3,
  90. Tween.TRANS_QUAD, Tween.EASE_OUT)
  91. **Bad**:
  92. .. rst-class:: code-example-bad
  93. ::
  94. effect.interpolate_property(sprite, "transform/scale",
  95. sprite.get_scale(), Vector2(2.0, 2.0), 0.3,
  96. Tween.TRANS_QUAD, Tween.EASE_OUT)
  97. Exceptions to this rule are arrays, dictionaries, and enums. Use a single
  98. indentation level to distinguish continuation lines:
  99. **Good**:
  100. .. rst-class:: code-example-good
  101. ::
  102. var party = [
  103. "Godot",
  104. "Godette",
  105. "Steve",
  106. ]
  107. var character_dict = {
  108. "Name": "Bob",
  109. "Age": 27,
  110. "Job": "Mechanic",
  111. }
  112. enum Tiles {
  113. TILE_BRICK,
  114. TILE_FLOOR,
  115. TILE_SPIKE,
  116. TILE_TELEPORT,
  117. }
  118. **Bad**:
  119. .. rst-class:: code-example-bad
  120. ::
  121. var party = [
  122. "Godot",
  123. "Godette",
  124. "Steve",
  125. ]
  126. var character_dict = {
  127. "Name": "Bob",
  128. "Age": 27,
  129. "Job": "Mechanic",
  130. }
  131. enum Tiles {
  132. TILE_BRICK,
  133. TILE_FLOOR,
  134. TILE_SPIKE,
  135. TILE_TELEPORT,
  136. }
  137. Trailing comma
  138. ~~~~~~~~~~~~~~
  139. Use a trailing comma on the last line in arrays, dictionaries, and enums. This
  140. results in easier refactoring and better diffs in version control as the last
  141. line doesn't need to be modified when adding new elements.
  142. **Good**:
  143. .. rst-class:: code-example-good
  144. ::
  145. enum Tiles {
  146. TILE_BRICK,
  147. TILE_FLOOR,
  148. TILE_SPIKE,
  149. TILE_TELEPORT,
  150. }
  151. **Bad**:
  152. .. rst-class:: code-example-bad
  153. ::
  154. enum Tiles {
  155. TILE_BRICK,
  156. TILE_FLOOR,
  157. TILE_SPIKE,
  158. TILE_TELEPORT
  159. }
  160. Trailing commas are unnecessary in single-line lists, so don't add them in this case.
  161. **Good**:
  162. .. rst-class:: code-example-good
  163. ::
  164. enum Tiles {TILE_BRICK, TILE_FLOOR, TILE_SPIKE, TILE_TELEPORT}
  165. **Bad**:
  166. .. rst-class:: code-example-bad
  167. ::
  168. enum Tiles {TILE_BRICK, TILE_FLOOR, TILE_SPIKE, TILE_TELEPORT,}
  169. Blank lines
  170. ~~~~~~~~~~~
  171. Surround functions and class definitions with two blank lines:
  172. ::
  173. func heal(amount):
  174. health += amount
  175. health = min(health, max_health)
  176. emit_signal("health_changed", health)
  177. func take_damage(amount, effect=null):
  178. health -= amount
  179. health = max(0, health)
  180. emit_signal("health_changed", health)
  181. Use one blank line inside functions to separate logical sections.
  182. .. note:: We use a single line between classes and function definitions in the class reference and
  183. in short code snippets in this documentation.
  184. Line length
  185. ~~~~~~~~~~~
  186. Keep individual lines of code under 100 characters.
  187. If you can, try to keep lines under 80 characters. This helps to read the code
  188. on small displays and with two scripts opened side-by-side in an external text
  189. editor. For example, when looking at a differential revision.
  190. One statement per line
  191. ~~~~~~~~~~~~~~~~~~~~~~
  192. Never combine multiple statements on a single line. No, C programmers,
  193. not even with a single line conditional statement.
  194. **Good**:
  195. .. rst-class:: code-example-good
  196. ::
  197. if position.x > width:
  198. position.x = 0
  199. if flag:
  200. print("flagged")
  201. **Bad**:
  202. .. rst-class:: code-example-bad
  203. ::
  204. if position.x > width: position.x = 0
  205. if flag: print("flagged")
  206. The only exception to that rule is the ternary operator:
  207. ::
  208. next_state = "fall" if not is_on_floor() else "idle"
  209. Format multiline statements for readability
  210. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  211. When you have particularly long ``if`` statements or nested ternary expressions,
  212. wrapping them over multiple lines improves readability. Since continuation lines
  213. are still part of the same expression, 2 indent levels should be used instead of one.
  214. GDScript allows wrapping statements using multiple lines using parentheses or
  215. backslashes. Parentheses are favored in this style guide since they make for
  216. easier refactoring. With backslashes, you have to ensure that the last line
  217. never contains a backslash at the end. With parentheses, you don't have to
  218. worry about the last line having a backslash at the end.
  219. When wrapping a conditional expression over multiple lines, the ``and``/``or``
  220. keywords should be placed at the beginning of the line continuation, not at the
  221. end of the previous line.
  222. **Good**:
  223. .. rst-class:: code-example-good
  224. ::
  225. var angle_degrees = 135
  226. var quadrant = (
  227. "northeast" if angle_degrees <= 90
  228. else "southeast" if angle_degrees <= 180
  229. else "southwest" if angle_degrees <= 270
  230. else "northwest"
  231. )
  232. var position = Vector2(250, 350)
  233. if (
  234. position.x > 200 and position.x < 400
  235. and position.y > 300 and position.y < 400
  236. ):
  237. pass
  238. **Bad**:
  239. .. rst-class:: code-example-bad
  240. ::
  241. var angle_degrees = 135
  242. var quadrant = "northeast" if angle_degrees <= 90 else "southeast" if angle_degrees <= 180 else "southwest" if angle_degrees <= 270 else "northwest"
  243. var position = Vector2(250, 350)
  244. if position.x > 200 and position.x < 400 and position.y > 300 and position.y < 400:
  245. pass
  246. Avoid unnecessary parentheses
  247. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  248. Avoid parentheses in expressions and conditional statements. Unless
  249. necessary for order of operations or wrapping over multiple lines,
  250. they only reduce readability.
  251. **Good**:
  252. .. rst-class:: code-example-good
  253. ::
  254. if is_colliding():
  255. queue_free()
  256. **Bad**:
  257. .. rst-class:: code-example-bad
  258. ::
  259. if (is_colliding()):
  260. queue_free()
  261. Boolean operators
  262. ~~~~~~~~~~~~~~~~~
  263. Prefer the plain English versions of boolean operators, as they are the most accessible:
  264. - Use ``and`` instead of ``&&``.
  265. - Use ``or`` instead of ``||``.
  266. You may also use parentheses around boolean operators to clear any ambiguity.
  267. This can make long expressions easier to read.
  268. **Good**:
  269. .. rst-class:: code-example-good
  270. ::
  271. if (foo and bar) or baz:
  272. print("condition is true")
  273. **Bad**:
  274. .. rst-class:: code-example-bad
  275. ::
  276. if foo && bar || baz:
  277. print("condition is true")
  278. Comment spacing
  279. ~~~~~~~~~~~~~~~
  280. Regular comments should start with a space, but not code that you comment out.
  281. This helps differentiate text comments from disabled code.
  282. **Good**:
  283. .. rst-class:: code-example-good
  284. ::
  285. # This is a comment.
  286. #print("This is disabled code")
  287. **Bad**:
  288. .. rst-class:: code-example-bad
  289. ::
  290. #This is a comment.
  291. # print("This is disabled code")
  292. .. note::
  293. In the script editor, to toggle the selected code commented, press
  294. :kbd:`Ctrl + K`. This feature adds a single # sign at the start
  295. of the selected lines.
  296. Whitespace
  297. ~~~~~~~~~~
  298. Always use one space around operators and after commas. Also, avoid extra spaces
  299. in dictionary references and function calls.
  300. **Good**:
  301. .. rst-class:: code-example-good
  302. ::
  303. position.x = 5
  304. position.y = target_position.y + 10
  305. dict["key"] = 5
  306. my_array = [4, 5, 6]
  307. print("foo")
  308. **Bad**:
  309. .. rst-class:: code-example-bad
  310. ::
  311. position.x=5
  312. position.y = mpos.y+10
  313. dict ["key"] = 5
  314. myarray = [4,5,6]
  315. print ("foo")
  316. Don't use spaces to align expressions vertically:
  317. ::
  318. x = 100
  319. y = 100
  320. velocity = 500
  321. Quotes
  322. ~~~~~~
  323. Use double quotes unless single quotes make it possible to escape fewer
  324. characters in a given string. See the examples below:
  325. ::
  326. # Normal string.
  327. print("hello world")
  328. # Use double quotes as usual to avoid escapes.
  329. print("hello 'world'")
  330. # Use single quotes as an exception to the rule to avoid escapes.
  331. print('hello "world"')
  332. # Both quote styles would require 2 escapes; prefer double quotes if it's a tie.
  333. print("'hello' \"world\"")
  334. Numbers
  335. ~~~~~~~
  336. Don't omit the leading or trailing zero in floating-point numbers. Otherwise,
  337. this makes them less readable and harder to distinguish from integers at a
  338. glance.
  339. **Good**:
  340. .. rst-class:: code-example-good
  341. ::
  342. var float_number = 0.234
  343. var other_float_number = 13.0
  344. **Bad**:
  345. .. rst-class:: code-example-bad
  346. ::
  347. var float_number = .234
  348. var other_float_number = 13.
  349. Use lowercase for letters in hexadecimal numbers, as their lower height makes
  350. the number easier to read.
  351. **Good**:
  352. .. rst-class:: code-example-good
  353. ::
  354. var hex_number = 0xfb8c0b
  355. **Bad**:
  356. .. rst-class:: code-example-bad
  357. ::
  358. var hex_number = 0xFB8C0B
  359. Take advantage of GDScript's underscores in literals to make large numbers more
  360. readable.
  361. **Good**:
  362. .. rst-class:: code-example-good
  363. ::
  364. var large_number = 1_234_567_890
  365. var large_hex_number = 0xffff_f8f8_0000
  366. var large_bin_number = 0b1101_0010_1010
  367. # Numbers lower than 1000000 generally don't need separators.
  368. var small_number = 12345
  369. **Bad**:
  370. .. rst-class:: code-example-bad
  371. ::
  372. var large_number = 1234567890
  373. var large_hex_number = 0xfffff8f80000
  374. var large_bin_number = 0b110100101010
  375. # Numbers lower than 1000000 generally don't need separators.
  376. var small_number = 12_345
  377. .. _naming_conventions:
  378. Naming conventions
  379. ------------------
  380. These naming conventions follow the Godot Engine style. Breaking these will make
  381. your code clash with the built-in naming conventions, leading to inconsistent
  382. code.
  383. File names
  384. ~~~~~~~~~~
  385. Use snake_case for file names. For named classes, convert the PascalCase class
  386. name to snake_case::
  387. # This file should be saved as `weapon.gd`.
  388. class_name Weapon
  389. extends Node
  390. ::
  391. # This file should be saved as `yaml_parser.gd`.
  392. class_name YAMLParser
  393. extends Object
  394. This is consistent with how C++ files are named in Godot's source code. This
  395. also avoids case sensitivity issues that can crop up when exporting a project
  396. from Windows to other platforms.
  397. Classes and nodes
  398. ~~~~~~~~~~~~~~~~~
  399. Use PascalCase for class and node names:
  400. ::
  401. extends KinematicBody
  402. Also use PascalCase when loading a class into a constant or a variable:
  403. ::
  404. const Weapon = preload("res://weapon.gd")
  405. Functions and variables
  406. ~~~~~~~~~~~~~~~~~~~~~~~
  407. Use snake\_case to name functions and variables:
  408. ::
  409. var particle_effect
  410. func load_level():
  411. Prepend a single underscore (\_) to virtual methods functions the user must
  412. override, private functions, and private variables:
  413. ::
  414. var _counter = 0
  415. func _recalculate_path():
  416. Signals
  417. ~~~~~~~
  418. Use the past tense to name signals:
  419. ::
  420. signal door_opened
  421. signal score_changed
  422. Constants and enums
  423. ~~~~~~~~~~~~~~~~~~~
  424. Write constants with CONSTANT\_CASE, that is to say in all caps with an
  425. underscore (\_) to separate words:
  426. ::
  427. const MAX_SPEED = 200
  428. Use PascalCase for enum *names* and CONSTANT\_CASE for their members, as they
  429. are constants:
  430. ::
  431. enum Element {
  432. EARTH,
  433. WATER,
  434. AIR,
  435. FIRE,
  436. }
  437. Code order
  438. ----------
  439. This first section focuses on code order. For formatting, see
  440. :ref:`formatting`. For naming conventions, see :ref:`naming_conventions`.
  441. We suggest to organize GDScript code this way:
  442. ::
  443. 01. @tool
  444. 02. class_name
  445. 03. extends
  446. 04. # docstring
  447. 05. signals
  448. 06. enums
  449. 07. constants
  450. 08. exported variables
  451. 09. public variables
  452. 10. private variables
  453. 11. onready variables
  454. 12. optional built-in virtual _init method
  455. 13. built-in virtual _ready method
  456. 14. remaining built-in virtual methods
  457. 15. public methods
  458. 16. private methods
  459. We optimized the order to make it easy to read the code from top to bottom, to
  460. help developers reading the code for the first time understand how it works, and
  461. to avoid errors linked to the order of variable declarations.
  462. This code order follows four rules of thumb:
  463. 1. Properties and signals come first, followed by methods.
  464. 2. Public comes before private.
  465. 3. Virtual callbacks come before the class's interface.
  466. 4. The object's construction and initialization functions, ``_init`` and
  467. ``_ready``, come before functions that modify the object at runtime.
  468. Class declaration
  469. ~~~~~~~~~~~~~~~~~
  470. If the code is meant to run in the editor, place the ``@tool`` annotation on the
  471. first line of the script.
  472. Follow with the `class_name` if necessary. You can turn a GDScript file into a
  473. global type in your project using this feature. For more information, see
  474. :ref:`doc_gdscript`.
  475. Then, add the `extends` keyword if the class extends a built-in type.
  476. Following that, you should have the class's optional docstring as comments. You
  477. can use that to explain the role of your class to your teammates, how it works,
  478. and how other developers should use it, for example.
  479. ::
  480. class_name MyNode
  481. extends Node
  482. # A brief description of the class's role and functionality.
  483. # Longer description.
  484. Signals and properties
  485. ~~~~~~~~~~~~~~~~~~~~~~
  486. Write signal declarations, followed by properties, that is to say, member
  487. variables, after the docstring.
  488. Enums should come after signals, as you can use them as export hints for other
  489. properties.
  490. Then, write constants, exported variables, public, private, and onready
  491. variables, in that order.
  492. ::
  493. signal spawn_player(position)
  494. enum Jobs {KNIGHT, WIZARD, ROGUE, HEALER, SHAMAN}
  495. const MAX_LIVES = 3
  496. export(Jobs) var job = Jobs.KNIGHT
  497. export var max_health = 50
  498. export var attack = 5
  499. var health = max_health setget set_health
  500. var _speed = 300.0
  501. @onready var sword = get_node("Sword")
  502. @onready var gun = get_node("Gun")
  503. .. note::
  504. The GDScript compiler evaluates onready variables right before the ``_ready``
  505. callback. You can use that to cache node dependencies, that is to say, to get
  506. child nodes in the scene that your class relies on. This is what the example
  507. above shows.
  508. Member variables
  509. ~~~~~~~~~~~~~~~~
  510. Don't declare member variables if they are only used locally in a method, as it
  511. makes the code more difficult to follow. Instead, declare them as local
  512. variables in the method's body.
  513. Local variables
  514. ~~~~~~~~~~~~~~~
  515. Declare local variables as close as possible to their first use. This makes it
  516. easier to follow the code, without having to scroll too much to find where the
  517. variable was declared.
  518. Methods and static functions
  519. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  520. After the class's properties come the methods.
  521. Start with the ``_init()`` callback method, that the engine will call upon
  522. creating the object in memory. Follow with the ``_ready()`` callback, that Godot
  523. calls when it adds a node to the scene tree.
  524. These functions should come first because they show how the object is
  525. initialized.
  526. Other built-in virtual callbacks, like ``_unhandled_input()`` and
  527. ``_physics_process``, should come next. These control the object's main loop and
  528. interactions with the game engine.
  529. The rest of the class's interface, public and private methods, come after that,
  530. in that order.
  531. ::
  532. func _init():
  533. add_to_group("state_machine")
  534. func _ready():
  535. connect("state_changed", self, "_on_state_changed")
  536. _state.enter()
  537. func _unhandled_input(event):
  538. _state.unhandled_input(event)
  539. func transition_to(target_state_path, msg={}):
  540. if not has_node(target_state_path):
  541. return
  542. var target_state = get_node(target_state_path)
  543. assert(target_state.is_composite == false)
  544. _state.exit()
  545. self._state = target_state
  546. _state.enter(msg)
  547. Events.emit_signal("player_state_changed", _state.name)
  548. func _on_state_changed(previous, new):
  549. print("state changed")
  550. emit_signal("state_changed")
  551. Static typing
  552. -------------
  553. Since Godot 3.1, GDScript supports :ref:`optional static typing<doc_gdscript_static_typing>`.
  554. Declared types
  555. ~~~~~~~~~~~~~~
  556. To declare a variable's type, use ``<variable>: <type>``:
  557. ::
  558. var health: int = 0
  559. To declare the return type of a function, use ``-> <type>``:
  560. ::
  561. func heal(amount: int) -> void:
  562. Inferred types
  563. ~~~~~~~~~~~~~~
  564. In most cases you can let the compiler infer the type, using ``:=``::
  565. var health := 0 # The compiler will use the int type.
  566. However, in a few cases when context is missing, the compiler falls back to
  567. the function's return type. For example, ``get_node()`` cannot infer a type
  568. unless the scene or file of the node is loaded in memory. In this case, you
  569. should set the type explicitly.
  570. **Good**:
  571. .. rst-class:: code-example-good
  572. ::
  573. @onready var health_bar: ProgressBar = get_node("UI/LifeBar")
  574. Alternatively, you can use the ``as`` keyword to cast the return type, and
  575. that type will be used to infer the type of the var.
  576. .. rst-class:: code-example-good
  577. ::
  578. @onready var health_bar := get_node("UI/LifeBar") as ProgressBar
  579. # health_bar will be typed as ProgressBar
  580. This option is also considered more :ref:`type-safe<doc_gdscript_static_typing_safe_lines>` than the first.
  581. **Bad**:
  582. .. rst-class:: code-example-bad
  583. ::
  584. # The compiler can't infer the exact type and will use Node
  585. # instead of ProgressBar.
  586. @onready var health_bar := get_node("UI/LifeBar")