Optimierungstipps für Unity

Unity ist eine Spiele-Engine, die nicht nur bei Indie-Entwicklern, sondern auch bei großen Unternehmen beliebt ist.

Es verfügt über eine benutzerfreundliche Oberfläche, eine leistungsstarke Rendering-Pipeline, ein benutzerfreundliches Komponentensystem und unterstützt schließlich eine Vielzahl von Plattformen.

Aber mit einer einfach zu bedienenden Benutzeroberfläche ist es noch einfacher, Ihr Spiel zu verkomplizieren (zum Beispiel durch platzieren vieler unnötiger Objekte usw.), daher ist es wichtig, Optimierung zu haben. während des gesamten Entwicklungsverlaufs im Auge behalten.

Hier sind wichtige Tipps für die drei Hauptkategorien (Rendering, Scripting, und Audio), die Ihnen helfen, die Leistung Ihres Spiels zu verbessern:

Rendern

Tipp 1: Lassen Sie die Objekte mit der Renderer-Komponente unskaliert

Unskalierte Objekte sind solche mit einer Skalierung von (1, 1, 1). In diesem Fall muss Unity keine zusätzlichen Berechnungen durchführen, um das Objekt in jedem Frame neu zu skalieren.

Beispiel: Nehmen wir an, Sie haben ein Hausmodell, das für Ihr Level zu groß oder zu klein ist. Am natürlichsten ist es, es wie folgt zu skalieren:

Gebäudegröße ändern

Meistens ist es in Ordnung, das Objekt in der Szenenansicht zu skalieren. Wenn Sie jedoch viele duplizierte Instanzen dieses Objekts planen, ist es besser, die Skalierung in den Importeinstellungen zu ändern.

Als Erstes müssen Sie das Modell skalieren, bis es Ihren Anforderungen entspricht (z. B. wurde das Gebäude oben von (1, 1, 1) auf (0,49482, 0,49482, 0,49482) skaliert) und dann das Modell im Projekt auswählen Beachten Sie die Ansicht und notieren Sie in den Importeinstellungen den Skalierungsfaktor (normalerweise ist er entweder 1 oder 0,1).

Legen Sie den neuen Wert fest, der dem Standard-Skalierungsfaktor multipliziert mit der neuen Skalierung entsprechen sollte (in meinem Fall ist es 1 x 0,49482 = 0,49482), und klicken Sie dann auf „Anwenden“. Gehen Sie nun zurück zum Modell in der Szenenansicht und stellen Sie den Maßstab wieder auf (1, 1, 1) ein.

Einstellungen für den Unity 3D-Skalierungsfaktor

Das Objekt wird nun auf die von Ihnen benötigte Weise skaliert, wobei der Standardmaßstab (1, 1, 1) beibehalten wird.

Dieser Tipp ist besonders wichtig für animierte Objekte, die SkinnedMeshRenderer verwenden, da das Rendern dieser Komponente teurer ist und eine Skalierung von (1, 1, 1) den Rendervorgang vereinfacht.

Tipp 2: Verwenden Sie so wenig Lichter wie möglich

Es gibt drei Arten von Lichtern in Unity (Richtungslicht, Punktlicht und Scheinwerfer). In Bezug auf die Leistung ist Richtungslicht für die Wiedergabe am günstigsten, gefolgt von Punktlicht und schließlich Spotlight.

Im Allgemeinen möchten Sie nicht mehr als ein gerichtetes Licht pro Szene haben, und für die Punkt- und Punktlichter sollten Sie so wenig wie möglich (oder gar keines) verwenden.

In Bezug auf Echtzeit-Schatten verbessert es zwar den visuellen Aspekt des Spiels, verursacht aber einen hohen Leistungsaufwand. Daher ist es im Allgemeinen besser, sie zu deaktivieren oder in lightmaps und light zu integrieren Sonden.

Tipp 3: Verwenden Sie transparente Shader mit Vorsicht

Verwenden Sie Transparent- oder Partikel-Shader nur auf Oberflächen, die transparent sein müssen (z. B. Zäune, Rauchpartikel usw.).

Objekte mit Transparenz erfordern einen zusätzlichen Rendering-Durchgang, der die Leistung beeinträchtigen kann, insbesondere auf Plattformen mit begrenzten Ressourcen, wie z. B. Mobilgeräten oder Web.

Skripterstellung

Tipp 1: Komponentenverweise immer zwischenspeichern

Sie sollten Komponentenverweise immer zwischenspeichern, wenn Sie planen, bei jedem Update darauf zuzugreifen.

Sehen Sie sich zum Beispiel das folgende Skript an:

Schlecht

using UnityEngine;

public class Script1 : MonoBehaviour
{
    float someValue = 0;

    // Update is called once per frame
    void Update()
    {
        someValue = GetComponent<Script2>().someValue2;
    }
}

Hier haben wir Script1, das die Variable "someValue2" von Script2 abruft und sie einer lokalen Variablen zuweist.

Nun hat der Aufruf von nur einem GetComponent pro Frame keine Auswirkungen auf die Leistung, Sie sollten sich jedoch angewöhnen, die Komponenten, die häufig verwendet werden, zwischenzuspeichern.

Es gibt zwei Möglichkeiten, eine Komponente in einem Skript zwischenzuspeichern: Erstellen Sie entweder eine öffentliche Variable und weisen Sie sie in der Inspektoransicht zu oder erstellen Sie eine private Variable und weisen Sie sie von Start oder Awake aus zu. Sehen Sie sich das folgende Beispiel an:

Gut

using UnityEngine;

public class Script1 : MonoBehaviour
{

    float someValue = 0;

    Script2 script2Cached;

    // Use this for initialization
    void Start()
    {
        script2Cached = GetComponent<Script2>();
    }

    // Update is called once per frame
    void Update()
    {
        someValue = script2Cached.someValue2;
    }
}

Viel besser ist, dass jetzt bei jedem Update ohne Leistungsaufwand auf Script2 zugegriffen werden kann.

Machen Sie dasselbe für integrierte Komponenten wie BoxCollider, Rigidbody usw. (außer Transform und GameObject, diese werden standardmäßig bereits zwischengespeichert, sodass Sie sofort darauf zugreifen können).

Tipp 2: Verwenden Sie SendMessage mit Vorsicht

Mit SendMessage können Sie eine bestimmte Funktion (falls vorhanden) für jedes MonoBehaviour aufrufen, das an ein Spielobjekt angehängt ist.

Wenn Sie beispielsweise im Spiel mit einer Waffe schießen, können Sie schnell Schaden anrichten, wenn die Kugel den Feind trifft, ohne GetComponent und andere zusätzliche Dinge verwenden zu müssen.

Allerdings sollte diese Methode nicht zu häufig aufgerufen werden, da sie recht rechenintensiv ist.

Tipp 3: Verwenden Sie GameObject.Find und GameObject.FindWithTag mit Vorsicht

Mit GameObject.Find, GameObject.FindWithTag und GameObject.FindGameObjectsWithTag können Sie schnell nach Objekten in der Szene suchen. Diese Methoden sind viel langsamer als GetComponent und sollten nur während der Initialisierung verwendet werden.

Tipp 4: Vermeiden Sie die Verwendung von OnGUI

Historisch gesehen war OnGUI die einzige Möglichkeit, Menüs in Unity zu erstellen. Seitdem ist jedoch eine Alternative namens UI Canvas hinzugekommen, die hinsichtlich der Leistung viel besser ist und viel mehr Funktionalität bietet.

Nichtsdestotrotz bleibt OnGUI immer noch eine praktikable Möglichkeit, eine Benutzeroberfläche in Unity zu erstellen. Wenn Sie es unbedingt verwenden müssen, denken Sie daran, dass OnGUI mindestens zweimal pro Frame aufgerufen wird (doppelt so oft wie Update und LateUpdate). Tun Sie dies also nicht Verwenden Sie es für alle Berechnungen außer der Benutzeroberfläche.

Sie können beispielsweise ein separates Skript verwenden, das nur OnGUI enthält, und es bei Bedarf aktivieren/deaktivieren.

Zum Beispiel:

UIScript.cs

using UnityEngine;

public class UIScript : MonoBehaviour {

    void OnGUI()
    {
        if(GUI.Button(new Rect(5, 5, 125, 25), "Button 1"))
        {
            //Button 1 was pressed, Do Something
        }
        if (GUI.Button(new Rect(140, 5, 125, 25), "Button 2"))
        {
            //Button 2 was pressed, Do Something
        }
    }
}

Script1.cs

using UnityEngine;

public class Script1 : MonoBehaviour
{

    UIScript uiScript;

    // Use this for initialization
    void Start()
    {
        uiScript = GetComponent<UIScript>();
        uiScript.enabled = false;
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Tab))
        {
            //toggle UIScript when Tab is pressed
            uiScript.enabled = !uiScript.enabled;
        }
    }
}

Sowohl UIScript als auch Script1 sind an dasselbe GameObject angehängt. Script1 steuert, wann das Menü angezeigt wird.

Wenn der Player die Tabulatortaste drückt, wird das UIScript aktiviert und zeigt die Schaltflächen an. Durch erneutes Drücken der Tabulatortaste wird es deaktiviert und die Schaltflächen ausgeblendet.

Während UIScript deaktiviert ist, wird die OnGUI-Methode nicht aufgerufen, was wiederum die Leistung verbessert.

Tipp 5: Verwenden Sie Profiler

Profiler ist eines der wichtigsten Tools, wenn es darum geht, Engpässe und FPS-Einbrüche zu identifizieren und so die genaue Ursache der geringen Leistung leichter zu finden.

Audio

Audioclips können optimiert werden, indem sichergestellt wird, dass ihre Importeinstellungen korrekt sind.

Die optimalen Audio-Importeinstellungen hängen von der Audiolänge, der Wiedergabefrequenz und der Zielplattform ab.

Empfohlene Artikel
Der Billboard-Generator für Unity
Unity-Audioclip-Importeinstellungen für die beste Leistung
So nutzen Sie Updates in Unity
Unity optimiert Ihr Spiel mit Profiler
Verbessern der Leistung eines Mobilspiels in Unity
Twitter-Tipps für die Einheit
Vergleich von 2D- und 3D-Entwicklungsumgebungen in Unity