Entwicklung - Unity3D - Web

Online-Gedächtnis - Stichpunkte zur Erinnerungshilfe

NAVIGATION - SEARCH

Inspector- / Editorverschönerung

Code-Tags welche Auswirkungen auf die Darstellung im Inspector haben.

[Range(0, 100)]
public float MyValue;

[Header("Hi there!")]
public string TheHeader = "Header!";
[Tooltip("This is THE VALUE!")]
[ContextMenuItem("Reset", "resetTheValue")]
public float TheValue = 42.0f;
[Space(50)]
public string TheString = "THE STRING";

private void resetTheValue()
{
    TheValue = 42;
}

Listen:


private ReorderableList list;

list = new ReorderableList(property.serializedObject, property.FindPropertyRelative("tagList"), true, true, true, true);
list.drawHeaderCallback += rect => GUI.Label(rect, label);
list.drawElementCallback += (rect, index, active, focused) =>
{
    rect.height = 16;
    rect.y += 2;
    EditorGUI.PropertyField(rect, 
        list.serializedProperty.GetArrayElementAtIndex(index), 
        GUIContent.none);
};
list.DoList(position);

Quelle: Gamasutra

Mobile GPU - Optimierung

  • Niedrige Vertex-Anzahl bei Modellen
  • "Occlusion culling" (auch automatisch durch "viewing frustrum" - Sichtweite der Kamera)
  • komplexe Shader vermeiden, "Mobile"-Versionen nutzen (vorallem keine "fragment shader", also Pro-Pixel-Shader)
  • Texturen komprimieren und Größe reduzieren
  • Mipmaps nutzen (nicht für UI!)
  • Level of Detail (LoD) anwenden
  • wenige Materialen verwenden -> besseres "batching", siehe DrawCall - Optimierungen
  • Texturen zusammenfassen in "texture atlases" (dann auch entsprechend Renderer.sharedMaterial verwenden)
  • Light Mapping ("baking") verwenden, siehe Licht - Optimierungen
  • Transparenz vermeiden (bzw. alpha cut/test Shader)
  • wenige Lichter
  • Post Processing minimieren
Läuft das Spiel schneller bei niedrigerer Auflösung? -> Füllratenproblem
  • Alpha-testing Shader gegen Alpha-blend austauchen
  • einfachere Shader verwenden (Mobile, kein pow, exp, log, sin, tan usw.)

DrawCall - Optimierungen

Static Batching

Statische Objekte sollten als "static" markiert werden, Unity fasst diese Objekte dann in einem DrawCall zusammen.
Allerdings nur Objekte, welche das selbe Material verwenden. D.h. hier sollten "Texture atlases" verwendet werden.



Dynamic Batching

Unity fasst nicht statische Objekte automatisch fürs "Dynamic Batching" zusammen.
Bedingungen:
  • Objekte welche unter 900 vertex (Ecken) haben
  • gleiche Skalierung
  • gleiches Material
  • keine Lightmaps
  • keine Multi-Pass Shader

Licht - Optimierungen

Objekte welche statischen Schatten ("baked") empfangen sollen, sollten im Modell "Generate Lightmap UVs" aktiviert haben.
Unity nutzt dann den 2. UV-Kanal zum Ablegen der Schatteninformationen.
Weiterhin sollten die Objekte in der Szene statisch sein, siehe DrawCall - Optimierungen.

In den Lighting-Einstellungen der Szene sollte dann "Baked GI" aktiviert sein. (Nicht mit "Precomputed Realtime GI" kombinieren!)


Ausführung der Berechnung bzw. "Auto"Aktivierung nicht vergessen.

Arbeitsspeicher - Optimierung

Texturen
  • wenn machbar auf Mipmaps verzichten
  • komprimieren
  • Read/Write abschalten
  • Größe anpassen

Analyse und Maßnahmen

  • Profiler.GetRuntimeMemorySize() RAM-Verbrauch durch Objekte
  • Resources.UnloadAsset (Referenz bleibt bestehen) 
  • Resources.UnloadUnusedAssets (unreferenzierte)
  • Vor und nach dem Laden eines Levels System.GC.Collect
  • structures -> Stack, classes -> Heap
  • foreach vermeiden, da Enumeratoren erschaffen werden
    • analog anonyme Methoden und Lambdas
  • AssetBundles verwenden
  • strings nicht konkatenieren, ansonsten StringBuilder nutzen
  • Asset pool verwenden bei häufigen Objekten, wie z.B. Geschosse

Kameraposition übernehmen

Platziert man die Szenenansicht an gewünschter Stelle, kann man diese via Strg + Shift + f als Transformdaten, für das aktuell selektierte Objekt übernehmen.
Sehr praktisch wenn man eine Kamera ausrichten möchte.

Hinweis auf Playmode

Die Farbe des Editors lässt sich für den Playmode einstellen, so merkt man immer wenn man "live" ist.

Edit -> Preferences -> Colors -> Playmode tint

Layer ausblenden

Für z.B. Wegpunkte ist es hilfreich 3D Elemente wie eine Sphere einzubinden, um die Wegpunkte ordentlich platzieren zu können.


Damit diese nicht im Spiel gerendert werden bekomme diese einen eigenen Layer. Dieser Layer kann anschliessend an der betreffenden Kamera deaktiviert werde.