Jump to content
Unity Insider Forum

[Guide] Unity Project Folder Structure


John

Recommended Posts

  Hallo Leute,

mir ist schon oftmals passiert oder habe es in anderen Projekten mitbekommen. Das ein wichtiges Thema von Projekten nicht beachtet wird oder definiert wird ohne den tieferen Sinn zu hinterfragen. Es handelt sich hierbei um die Folder-Struktur in Unity Projekten. Der ein oder andere definiert eine wohlgeformte Definition seiner Folder-Struktur und in Laufe der Zeit wird Sie immer unaufgeräumter da man sich am Anfang nicht ausreichend Gedanken gemacht hat was man alles benötigt. So kommt es schnell dazu das man Dateien dort hinterlegt wo sie eigentlich nicht hinkommen und schnell gereht die ganze Folder-Struktur aus dem Ruder.

Ich möchte in diesem Guide euch meine Folder-Struktur erklären die sich aus dem laufenden von Projekten her raus entwickelt hat und eine gute Verbindung zu Unity bietet.

Fangen wir mit dem Grundlegendsten an das wir uns stellen müssen:

Was habe ich alles für Daten?

Dies ist ein bisschen schwierig auf dem ersten Anhieb zu beantworten, deshalb deferieren wir wohlgeformte Kategorien die uns dabei helfen unsere Dateien besser einzuordnen. Das wären zu einem folgende:

  • Assets/Files/...
  • Assets/UnityAssets/...
  • Assets/Source/...

Files

In diesem Folder finden alle unsere importierten Dateien die wir von außen holen Platz. Das wären zum einen z.B.

  • .../Files/Meshes/...
  • .../Files/Textures/...
  • .../Files/Audios/...
  • .../Files/Fonts/...
  • .../Files/BalancingSheets/...
  • .../Files/..

Unter Files finden wirklich alle Dateien Platz die von anderen Applikation kommen und keine Verbindung zu Unity haben. Direkt unter dem Files-Folder folgen weiter Folders die jeweils eine Unter-Kategorie bilden die mit einer Mehrzahl angeben wird. (z.b. Meshes, Textures, BalancingSheets) Ich möchte hier nochmal rauspicken es finden auch solche Dateien Platz wie zum Beispiel Xml/Json die eigentlich nur Balancing-Daten beinhalten.

 

Man Trifft schnell auch auf Edge-Cases wie zum Beispiel:

Ich besitze jeweils folgende Dateien wo soll ich die am besten hin packen?

  • CaptainPirate.fbx
  • CaptainPirate@idle.fbx
  • CaptainPirate@attack.fbx
  • CaptainPirate@die.fbx
  • CaptainPirate@walk.fbx
  • CaptainPirate@hit.fbx
  • ...

Im Grunde ist es wie folgt CaptainPirate.fbx ist jeweils ein reines mesh ohne jegliche Animationen. Die anderen jeweiligen Files sind welche die im besten Fall nur die reine Animation Information besitzen ohne tatsächlich das ganze Mesh. Man könnte jeweils dafür eine eigene Kategorie anlegen unter Files die das Ganze für einen handelt das würde dann wie folgt aussehen:

Hier sind alle CaptainPirates@*.fbx hinterlegt:

  • Assets/Files/Animations/Characters/CaptainPirate/...

Die Tatsächlich Mesh-Datei ist unter folgen Folder platziert:

  • Assets/Files/Meshes/Characters/CaptainPirate/CaptainPirate.fbx

So hat man jeweils eine saubere Definition was jeweils animierte Meshes sind und welche Statische. Ein anderer Ansatz der durch aus möglich wäre und den ich sogar bevorzuge ist jeweils den Unterschied direkt unter dem Meshes-Folder zu machen das würde dann wie folgt aussehen:

Dynamic Meshes die jeweils eine Animation besitzen:

  • .../Meshes/Dynamic/...

Rein Statische

  • .../Meshes/Static/...

Wieso ich hier vermeide jeweils Animations zu benutzen zum einen wen man in Unity Animationen angelegt ist es jeweils schwer diese zu differenzieren in welchen Folder man diese packen soll. (dazu aber mehr im UnityAssets Abschnitt)

Wie wir bereits gesehen habe legen wir unter Files direkt die Meshes Kategorien und versuchen Sie jeweils nach Sinn zu Bündeln so ist das später navigieren im Project-Window viel leichter, wenn wir gebündelte Daten haben.

In den Files Ordner werden alle Files hinterlegt die außerhalb von Unity kommen, dazu wird jeweils eine Unterkategorie erstellt wo die Files dort in ihrem eigenen Folder Platz finden.

UnityAssets

Die UnityAssets-Kategorie beinhaltet alle Unity-Assets Files (*ausgenommen .cs-, .js-, .boo oder shader-files). Das wären z.B. wie folgt:

  • Assets/UnityAssets/Materials/...
  • Assets/UnityAssets/Prefabs/...
  • Assets/UnityAssets/Animations/... (Animations die mithilfe von Unity erstellt worden sind!)
  • Assets/UnityAssets/Skyboxs/...
  • Assets/UnityAssets/PhyicalMaterials/...
  • Assets/UnityAssets/Scenes/...
  • Assets/UnityAssets/ScriptableObjects/...
  • Assets/UnityAssets/AnimatorController/...
  • Assets/UnityAssets/...

Tatsächlich wird hier alles Unity-Basierendes liegen und hat durchaus hier seine Berechnung. Hier gilt genau das gleich wie bereits in dem Files-Folder, jeweils Unter-Kategorien zu bilden und für die jeweilige Datei einen Folder anlegen. Wir greifen das Example von vorhin vom CaptainPirate auf:

  • Assets/UnityAssets/Materials/Characters/CaptainPirate.mat
  • Assets/UnityAssets/Prefabs/Characters/CaptainPirate.prefab
  • Assets/UnityAssets/AnimatorController/Characters/BasicCharacterController.controller

Wie man hier sieht alles ist jeweils in seinem Sub-Folder. Ich hatte jetzt bewusst für das CaptainPirate.prefab kein weitern Folder angelegt, da man diese beruhigt in dem Characters Folder verweilen kann. Eine gute Überlegung wäre falls man mehrere Typen von Characters hat diese zu unterteilen wie z.B.

  • Assets/UnityAssets/Prefabs/Characters/BossCharacters/CaptainPirate.prefab 
  • Assets/UnityAssets/Prefabs/Characters/RegularCharacters/Pirate.prefab 

Man sollte hier abwägen ab welchen grad es Sinn macht einen weitere Unter-Kategorie einzuführen. In dem falle mit verschieden Character-Typen sehe ich durch aus einen Sinn hinter diese jeweils in einzelne Folder aufzuteilen.

Der UnityAssets Folder beinhaltet alle Dateien die von Unity direkt kommen ausgenommen die jeweiligen Source-Files (.cs-, .js-, .boo oder shader-files). 

Source

Der Source-Folder ist der Ort an dem man seine ganzen Source/Script-Files hinterlegen kann. Hier schaut man auch das man jeweils unterscheidet von System, Game,

  • Assets/Source/Game/Shop/Provider/ShopItemProvider.cs
  • Assets/Source/System/Crashlytics/Log/CrashLogProvider.cs
  • Assets/Source/System/HttpRest/Get/Interface/IGet.cs

Im Grunde gelten hier genau die gleichen Regeln wie bereits oben schon genannt. Versuchen jeweils alles Zusammenzufassen eine Kategorie dafür zu finden und falls es geht diese nochmal in einer Unter-Kategorie aufzuteilen um die Übersicht und das Verständnis zu verbessern.

Ein Wichtiger Teil der Oftmals zu kurz kommt sind "Namespaces" mit Hilfe einer Sauber Folder-Struktur ergibt sich das von ganz allein: 

  • Assets/Source/System/Crashlytics/Log/CrashLogProvider.cs
using Pwhh.System.Log

namespace Pwhh.System.Crashlytics.Log
{
  public class CrashLogProvider : Log
  {
    //...
  }
}

Conclusion 

Ein sauber Folder-Struktur ist sehr wichtig, das oftmals unterschätz wird, egal ob in einem kleinen Projekt oder einem großen. Man sollte sich Gedanken darübermachen wie man was benennt und wo man es hinterlegt. Mit Kategorien wird es einem erleichtert seine jeweilige Datei an den passenden Ort zu hinterlegen.

Files/.. & UnityAssets/... & Source/...

ist ein guter Anfang seine Kategorien darauf aufzubauen.

Wichtige Hinweise

Unity-Folders

Unity hat jeweils schon Vordefinierte Folder-Names die Funktionalitäten bieten:

  • Assets
  • Editor
  • Resources
  • Editor Default Resources
  • Gizmos
  • Plug-ins
  • Standard Assets
  • StreamingAssets
  • Hidden Assets

Wichtig ist ihr jeweils sich über den genauen nutzen dieses Folder bewusst zu werden und in jeweils dort immer verwenden welchen Content er beinhaltet. Ein Beispiel wäre es wen man ein Tool für Unity schreibt und dort gerne Custom Icons verwenden möchte die man von außerhalb reinimportiert. Das würde folgendermaßen gelöst:

  • Assets/Files/Icons/Editor Default Resources/TranslationIcon.png

Unity bietet durch aus die Möglichkeit mehrere dieser Folders in seinem Projekt zu haben. Dieses sollte man dazu nutzen auch dort Ordnung reinzubekommen.

Externe Tools/Packages

Oftmals ist es so, dass man externe Package verwendet diese nicht die gleiche Folder-Struktur aufweist. Hier fällt mir nur eine Lösung ein.

Es hängt jeweils von der Größe des externen Packages ab, wenn es ein kleines kann man dieses per Hand selbst einpflegen und in die entsprechenden Folder reinlegen.

Falls es ein durchaus größeres ist wäre es vll. die Überlegung eine weitere Kategorie zu Files, UnityAssets und Source hinzufügen. Das wäre dann ein Third-Party Folder wo alle diejenigen Packages hinterlegt werden die größer sind und wo es schwierig ist diese jeweils in die Folder-Struktur zu integrieren. Hier besonders Aufpassen das kann der Indikator dafür sein das seine Folder-Struktur schnell mal aus den Ruder läuft!

Schnelle Navigation und Zugriff

Unity bietet die Funktion jeweils jedes Objekt im Project-Windows mit Labels zu versehen, durch aus mehreren. Dies bietet die Möglichkeit neben der Searchbar direkt nach den Labels zu filtern und man bekommt eine Overview von allen Objekten die dieses Label besitzen. ( Unity Docs , Assets Workflow Labels Docu )

Oftmals habe ich gehört und gesehen das viele Leute gerne ein Folder Erstellen von zum Beispiel einem Character wo sie direkt im Unter-Folder den Sub-Folder:

  • Material
  • Texture
  • Prefabs
  • Scripts

Dies Struktur kann sehr schnell unsauber werden vor allem wen sich andere Objekte das gleich Material benutzen das in diesem einen Folder verwendet wird. Deshalb würde ich dieses sehr bewusst vermeiden, alles in einen Folder rein zu verfrachten.

 

Ich hoffe ihr habt einen guten Überblick bekommen wie wichtig eine gute Folder-Struktur. Falls ihr Anregungen habt oder euer Erfahrungen teilen möchtet mit euer Folder Struktur. Fühlt euch freie ebenfalls ist Feedback sehr erwünscht.

 

Mfg.

-John

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Lädt...
×
×
  • Neu erstellen...