-
Notifications
You must be signed in to change notification settings - Fork 10
Code Style Document
Valk edited this page Aug 4, 2025
·
66 revisions
If the following looks overwhelming to you, you can ignore it, I will refactor your pull request to align with this style.
There's also a saying, "Rules were made to be broken". For example should it be called PlayerMovementComponent or PlayerComponentMovement? There is no wrong answer here.
- Indentation: 4 spaces.
- Line Endings: LF.
- Curly Braces: Always expand unless the expression(s) / statement(s) are short.
- Using Directives: Above namespace.
Code Examples
// bad
public void Init(){
if(_disabled)
{
return;
}
for(int x;x<3;x++){ GD.Print(x);} // Never inline blocks like this
}
// good
public void Init()
{
if (_disabled)
return; // Not much text between _disabled and return so removing {} is okay
for (int x; x < 3; x++) // A little bit more text here so we use {}
{
GD.Print(x);
}
}- PascalCase: Types, methods, properties, constants, events.
- camelCase: Private fields, local variables, method args.
- Private fields: Always prefix with an underscore.
-
Events: Avoid prefixing events with
Onas subscribers should use this instead.
Code Examples
private const int FPS_MAX; // hard to read
private const int FPSMax; // hard to read
private const int FpsMax; // goodpublic event Action OnDeactivated; // can no longer use On prefix in subscribers, avoid
public event Action Deactivated; // good- var Keyword: Never use unless the type is absurdly long.
- C# Events: Always use over Godot signals.
-
Explicit Private Modifiers: Always specify
private. - File Scoped Namespaces: Always use.
Code Examples
// bad
namespace Template
{
// Code
}
// good
namespace Template;
// Code// Avoid completely
[Signal] public delegate void Deactivated();
// Good
public event Action Deactivated;// Outside functions
int health; // easy to mistake this for a local member
private int _health; // good
// Inside functions
int health; // goodvar health = 100; // bad
int health = 100; // good
// Absurdly long type, this looks awful
foreach (KeyValuePair<Dictionary<int, List<string>>, List<Dictionary<int, int>>> kvp in abomination)
// Clean
foreach (var kvp in abomination)- Public Functions: Only use for singletons, otherwise avoid if possible.
- Private Functions: Use when possible.
-
Events: Never use unless you set them to
nullin_TreeExit()orDispose(). Improper use can lead to random engine crashes.
Godot exports being at the top of the script and private static functions near the bottom. Do not worry too much about this.
- Godot Exports
- Events
- Properties
- Fields
- Godot Overrides
- Public Functions
- Private Functions
- Private Static Functions
- Private Classes and Enums
Please familiarize yourself with these principles.