Code Naming Convention

Code Naming Convention

  • Rather than simply answering "what" or "how," comments can fill in the gaps and tell us "why."

  • Use the // comment to keep the explanation next to the logic.

  • Use a Tooltip instead of a comment for serialized fields.

  • Avoid Regions. They encourage large class sizes. Collapsed code is more difficult to read.

  • Use a link to an external reference for legal information or licensing to save space.

  • Use a summary XML tag in front of public methods or functions for output documentation/Intellisense.

  • Rather than simply answering "what" or "how," comments can fill in the gaps and tell us "why."

  • Use the // comment to keep the explanation next to the logic.

  • Use a Tooltip instead of a comment for serialized fields.

  • Avoid Regions. They encourage large class sizes. Collapsed code is more difficult to read.

  • Use a link to an external reference for legal information or licensing to save space.

  • Use a summary XML tag in front of public methods or functions for output documentation/Intellisense.

Naming/Casing

  • Use Pascal case (e.g. ExamplePlayerController, MaxHealth, etc.) unless noted otherwise

  • Use camel case (e.g. examplePlayerController, maxHealth, etc.) for local/private variables, parameters.

  • Avoid snake_case, kebab-case, Hungarian notation

Formatting

  • Choose K&R (opening curly braces on same line) or Allman (opening curly braces on a new line) style braces.

  • Keep lines short. Consider horizontal whitespace. Define a standard line width in your style guide (80-120 characters).

  • Use a single space before flow control conditions, e.g. while (x == y)

  • Avoid spaces inside brackets, e.g. x = dataArray[index]

  • Use a single space after a comma between function arguments.

  • Don’t add a space after the parenthesis and function arguments, e.g. CollectItem(myObject, 0);

  • Don’t use spaces between a function name and parenthesis, e.g. DropPowerUp(myPrefab, 0);

  • Use vertical spacing (extra blank line) for visual separation.

Comments

  • Rather than simply answering "what" or "how," comments can fill in the gaps and tell us "why."

  • Use the // comment to keep the explanation next to the logic.

  • Use a Tooltip instead of a comment for serialized fields.

  • Avoid Regions. They encourage large class sizes. Collapsed code is more difficult to read.

  • Use a link to an external reference for legal information or licensing to save space.

  • Use a summary XML tag in front of public methods or functions for output documentation/Intellisense.

Namespace

  • Pascal case, without special symbols or underscores.

  • Add using line at the top to avoid typing namespace repeatedly.\

  • Create sub-namespaces with the dot (.) operator, e.g. MyApplication.GameFlow, MyApplication.AI, etc.

namespace Gamepangin.StyleExample { }

Enums

  • Use a singular type name.

  • No prefix or suffix.

public enum Direction
{
    North,
    South,
    East,
    West
}

Flags Enums

  • Use a plural type name

  • No prefix or suffix.

  • Use column-alignment for binary values

[Flags]
public enum AttackModes
{
    // Decimal                         // Binary
    None = 0,                          // 000000
    Melee = 1,                         // 000001
    Ranged = 2,                        // 000010
    Special = 4,                       // 000100

    MeleeAndSpecial = Melee | Special  // 000101
}

Interfaces

  • Name interfaces with adjective phrases.

  • Use the 'I' prefix.

public interface IDamageable
{
    string DamageTypeName { get; }
    float DamageValue { get; }

    // METHODS:
    // - Start a methods name with a verbs or verb phrases to show an action.
    // - Parameter names are camelCase.
    bool ApplyDamage(string description, float damage, int numberOfHits);
}

public interface IDamageable<T>
{
   void Damage(T damageTaken);
}

Classes / Structs

  • Name them with nouns or noun phrases.

  • Avoid prefixes.

public class StyleExample : MonoBehaviour { }

Fields

  • Avoid special characters (backslashes, symbols, Unicode characters); these can interfere with command line tools.

  • Use nouns for names, but prefix booleans with a verb.

  • Use meaningful names. Make names searchable and pronounceable. Don’t abbreviate (unless it’s math).

  • Use camelCase.

  • Add an optional underscore () in front of private fields to differentiate from local variables

  • You can alternatively use more explicit prefixes: m = member variable, s_ = static, k_ = const

  • Specify (or omit) the default access modifier; just be consistent with your style guide.

public bool canJump;
private int elapsedTimeInDays;

// Use [SerializeField] attribute if you want to display a private field in Inspector.
// Booleans ask a question that can be answered true or false.
[SerializeField] private bool isPlayerDead;

Properties

  • Preferable to a public field.

  • PascalCase, without special characters.

  • Use the expression-bodied properties to shorten, but choose your preferred format. e.g. use expression-bodied for read-only properties but { get; set; } for everything else.

  • Use the Auto-Implemented Property for a public property without a backing field.

// the private backing field
private int maxHealth;

// read-only, returns backing field
public int MaxHealthReadOnly => maxHealth;

// equivalent to:
// public int MaxHealth { get; private set; }

// explicitly implementing getter and setter
public int MaxHealth
{
	  get => maxHealth;
    set => maxHealth = value;
}

// write-only (not using backing field)
public int Health { private get; set; }

// write-only, without an explicit setter
public void SetMaxHealth(int newMaxValue) => maxHealth = newMaxValue;

// auto-implemented property without backing field
public string DescriptionName { get; set; } = "Fireball";

Events

  • Name with a verb phrase.

  • Present participle means "before" and past participle mean "after."

  • Use System.Action delegate for most events (can take 0 to 16 parameters).

  • Define a custom EventArg only if necessary (either System.EventArgs or a custom struct). OR alternatively, use the System.EventHandler; choose one and apply consistently.

  • Choose a naming scheme for events, event handling methods (subscriber/observer), and event raising methods (publisher/subject) e.g. event/action = "OpeningDoor", event raising method = "OnDoorOpened", event handling method = "MySubject_DoorOpened"

Methods

  • Start a methods name with a verbs or verb phrases to show an action.

  • Parameter names are camel case.

Last updated