Repository navigation
Code Conventies
Alle assets moeten de naamgeving volgen om samenhang te behouden.
Naamgeving Conventies
Alle assets gebruiken PascalCasing in de naam dit betekent dat elke eerste letter van Elk woord een hoofdletter is. Voor spaties vermijden we _ en worden worden dus aan elkaar gezet.
Bijvoorbeeld: PlayerMaterial
Voor assets met verschillende iteraties (bijv high poly en low poly modellen) gebruiken we _Low waar "Low" het type van de iteratie is.
Let op: zorg ervoor dat modellen ook de juiste naam hebben in de 3D software.
Verschillende soorten textures (BaseColor, Normal, ORM, Alpha, etc.) krijgen verschillende navoegsels. Als ze genummerd zijn komt de navoegsel hierna.
| Navoegsel | Type |
|---|---|
| _BC | Base Color |
| _N | Normal |
| _ORM | Oclussion Rougness Metallic |
| _A | Alpha |
| _H | Height |
| _M | Mask |
Voor assets met meerdere varianten gebruiken we een _01 waar het getal de index van de asset is.
Let op: Assets die geen nummering nodig hebben, hebben ook geen getallen in de naam.
Code Stijl & Naamgeving
Scopes worden met de Allman brace style gedefinieerd. Bij if met 1 lijn hebben geen scope als er geen ander else of if else statements bij staan.
if (true)
DoThis();if (true)
{
DoThis();
}
else
{
DoThat();
}Elk script heeft een namespace de namespace naam is de folder hiërarchie vanaf de scripts folder.
Bijvoorbeeld:
namespace Player.PlayerMovement
{
}Classes worden in losse bestanden aangemaakt.
Singletons zijn classes waar maar 1 instantie van kan zijn. Dit wordt gedaan door een static field/property.
public class Player
{
public static Player instance;
// constructor om een instance te maken als er nog geen is (Start() of Awake() voor MonoBehaviours)
public Player()
{
if (instance != null)
{
return;
}
instance = this;
}
}Managers zijn classes die meerdere objecten bij moeten houden. En wordt zo aangegeven:
public class GridManager
{
}Handlers zijn classes die 1 specifiek ding regelen. En wordt zo aangegeven.
public class GridHandler
{
}Private inspector fields worden gedefinieerd met de [SerializeField] attribute. De naam is camelCased.
[SerializeField] private string name;Public fields zijn camelCased.
public string name;Private fields zijn camelCased met een _ ervoor.
private string _name;Protected fields zijn camelCased net als public fields.
protected string name;Als je een public field aanmaakt die niet door de inspector gezien te hoeven worden gebruiken we niet de [HideInInspector] attribute. In plaats daarvan gebruiken we properties. Met properties kunnen we namelijk ook nog extra functionaliteit toevoegen via de getters en setters. Als we de property nog in het script willen aanpassen gebruiken we een private association field. Dit wordt dan zo gedefinieerd:
private int _number;
public int Number
{
get {
_number = value;
}
set {
return _number:
}
}Als we de value van de property niet veel nodig hebben gebruiken we de default get en set.
public int Number
{
get;
set;
}Properties zijn altijd PascalCased.
Method namen zijn altijd PascalCased.
public void DoThis()
{
}Remote Procedure Calls (RPCs) zijn ook PascalCased met een Rpc navoegsel.
[Rpc(SendTo.Server)]
public void DoOnServerRpc()
{
}Method parameters namen zijn camelCased met een _ voorvoegsel.
public void DoThat(int _number)
{
}Structs staan altijd in een los C# bestand. De naam van een struct is altijd PascalCased. Structs gebruiken we als een soort data object die door meerdere classes gebruikt moet worden, als er voor de data inheritence nodig is gebruiken we een class.
public struct MoveData
{
}Enums staan in een los C# bestand als het door meer objecten gebruikt moet worden en nested in een class als alleen die class de enum gebruikt. De naam van een enum is altijd PascalCased met een E voorvoegsel.
public enum EBoatType
{
}Interfaces staan atijd in een los C# bestand. De naam van een Interface is altijd PascalCased met een I voorvoegsel.
public interface IDamageable
{
}Unity UI Toolkit
Voor UI gebruiken we Unity's nieuwe UI systeem de UI Toolkit. Dit nieuwe systeem werkt als een soort website layout met HTML en CSS. Je kan de UI builder tool gebruiken maar ook zelf de UXML en USS schrijven.
Omdat de Multiplayer Widgets plugin met het oude uGUI systeem en alle classes ontoegankelijk zijn voor ons, kunnen we deze widgets niet gebruiken met de UI Toolkit. Hierdoor hebben wij besloten om voor alleen deze UI elementen uGUI te gebruiken.
UXML is als een soort HTML en geeft de layout aan van alle elementen. Elk UXML element heeft zijn eigen C# class, je kan dus ook zelf je eigen UXML elementen maken. Elk UXML document begint met een root uxml element:
<ui:UXML xmlns:ui="Unity.UIElements">
</ui:UXML>Sommige elementen hebben een text attribuut. Dit is de text die in het element komt te staan.
<ui:Button text="Press Me" />Elk soor VisualElement heeft een name en een class attribuut. De name is als een soort HTML id dus is het anders voor elk element. De class is net als de HTML class en kan dus door meerdere elementen gebruikt worden.
<ui:VisualElement name="panel" class="menu">
</ui:VisualElement>In een element definiëren we eerst de name dan de class en dan de text. Alle name en class attributen zijn kebab-cased.
<ui:Label name="title" class="title-element" text="Slagschip" />USS is als een soort CSS en geeft de stijl van de UXML aan. class worden aangegeven met een . voorvoegsel en name worden aangegeven met een # voorvoegsel.
#title {
}
.title-element{
}Porperties worden aangepast van hoe ze in de UI builder staan van boven naar beneden.
root {
display
position
flex
align
width
height
margin
padding
text
background
border
transform
cursor
transition
}Een van de nadelen van de ui toolkit is dat het geven van functionaliteit aan dingen zoals knoppen erg lastig is omdat we geen UnityEvent voor de knoppen meer hebben. Hier hebben wij een oplossing voor bedacht. Elk GameObject wat de UIDocument heeft geven we losse MonoBehaviours die de UIDocument's functionaliteit beheren.
[RequireComponent(typeof(UIDocument))]
public class MainMenuHandler : MonoBehaviour
{
}