Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
On the whole, naming should follow C# standards.
Classes are written in PascalCase. For example RadialSlider
.
Interfaces should always have the prefix I
, as in IOpenable
.
Methods are written in PascalCase. For example DoSomething
()
.
Namespaces are all PascalCase, multiple words concatenated together, without hypens ( - ) or underscores ( _ ):
Namespaces should be used for major systems, such as Atmospherics, or Electrics. Everything else should be without namespace.
BAD:
GOOD:
This style guide is based on and expands upon it.
You can use whatever file editor you want, but is probably the most popular and recommended choice. It's free, has many features, and integrates well with Unity and Git.
If you're a student, we recommend getting a copy of which adds a lot of code hints and shortcuts that will significantly improve your code quality.
Our overarching goals are clarity, readability and simplicity. Also, this guide is written to keep Unity in mind.
This style guide is based on C# and Unity conventions, and discussions within the development team.
We recently added an file to automate the code review process, it is a file you can add to or and it will apply the formatting and style we use to your analyzers, telling you when something is out of order.
Parameters are written in camelCase.
BAD:
GOOD:
Single character values are to be avoided except for temporary looping variables. You can also use _
for unused variables, m
for network messages and e
for event bus's events.
Prefix event methods with the prefix On.
BAD:
GOOD:
Delegates are written in PascalCase.
When declaring delegates, DO add the suffix EventHandler to names of delegates that are used in events.
BAD:
GOOD:
DO add the suffix Callback to names of delegates other than those used as event handlers.
BAD:
GOOD:
Using built.in C# features, such as Action, is encouraged in place of delegates.
A class must respect the following order, from top to bottom
Events and delegates declaration.
Private enums declaration.
Private internal classes.
Member variables.
Properties.
Methods.
BAD:
GOOD:
In code, acronyms should be treated as words. For example:
BAD:
GOOD:
Exactly one class, struct, enum, or interface per source file, although inner classes are encouraged where scoping appropriate.
Access level modifiers should be explicitly defined for classes, methods and member variables. This includes defining private even though C# will implicitly add it.
Use the least accessible access modifier, except for public member that is expected to be used by other classes in the future.
Prefer single declaration per line.
BAD:
GOOD:
Spacing is especially important to make code more readable.
Indentation should be done using tabs — never spaces .
Blocks
Indentation for blocks uses tabs for optimal readability:
BAD:
GOOD:
Line Wraps
Indentation tab for line wraps should use 4 spaces (not the default 8):
BAD:
GOOD:
Lines should be no longer than 100 characters long.
There should be just one or two blank lines between methods to aid in visual clarity and organization. Whitespace within methods should separate functionality, but having too many sections in a method often means you should refactor into several methods.
All braces get their own line as it is a C# convention:
BAD:
GOOD:
Conditional statements are preferred to be enclosed with braces, irrespective of the number of lines required. Some cases can be pardoned.
BAD:
GOOD:
This section includes some rules of thumb for design patterns and code structure
Avoid throwing exceptions. Instead log and error. Methods returning values should return null in addition to logging an error
BAD:
GOOD:
Don't use Find or in other ways refer to GameObjects by name or child index when possible. Reference by reference is less error prone and more flexible. Expect people to set the fields in the inspector and log warnings if they don't.
BAD:
Prefer RequireComponent and GetComponent over AddComponent. Having the components in the inspector let's us edit them. AddComponent limits us.
BAD:
GOOD:
Properties can be used for access control to fields, and when using backing fields they can be private and let us change them in the inspector. Consider when a fields should be public and prefer properties with backing fields.
Sometimes it's just nice to see them for debugging, even if we don't change them, so consider making more of your private fields visible.
OKAY:
BETTER:
Use US English spelling.
BAD:
GOOD:
The exception here is MonoBehaviour
as that's what the class is actually called.
Switch-statements come with default
case by default (heh). If the default
case is never reached, be sure to remove it.
If the default
case is an unexpected value, it is encouraged to log and return an error
BAD
GOOD
BETTER
Whenever someone add a script implementing NetworkBehaviour, they have access to the following attributes, indicating if a given method should be server only, client only, or both :
[Server] for server only code.
[Client] for client only code.
[ServerOrClient] for both.
Make sure no methods goes without an attribute in a script inheriting NetworkBehaviour. The goal is to increase readability and to generate warnings or exceptions when clients or server are attempting to call something they should not.
Methods with [ServerOrClient] attributes should stay uncommon, they make debugging harder. If possible, try to refactor the code to avoid them.