Optimieren Sie die Leistung Ihres mobilen Spiels: Tipps zu Profiling, Speicher und Code-Architektur von Unitys Top-Ingenieuren

Unser Accelerate Solutions-Team kennt den Quellcode in- und auswendig und unterstützt eine Vielzahl von Unity-Kunden, damit diese das Beste aus der Engine herausholen können. Bei ihrer Arbeit tauchen sie tief in die Projekte der Entwickler ein, um herauszufinden, an welchen Stellen die Leistung optimiert werden kann, um Geschwindigkeit, Stabilität und Effizienz zu verbessern. Wir haben uns mit diesem Team, das sich aus den erfahrensten Software-Ingenieuren von Unity zusammensetzt, zusammengesetzt und sie gebeten, uns von ihrem Fachwissen über die Optimierung mobiler Spiele zu berichten.
Als unsere Techniker begannen, ihre Erkenntnisse über die Optimierung von Handyspielen mit uns zu teilen, wurde uns schnell klar, dass es viel zu viele großartige Informationen für einen einzigen Blogbeitrag gab, den wir geplant hatten. Stattdessen haben wir beschlossen, ihren Wissensschatz in ein umfassendes E-Book (das Sie hier herunterladen können) sowie in eine Reihe von Blogbeiträgen zu verwandeln, die einige dieser 75+ umsetzbaren Tipps beleuchten.
Im ersten Beitrag dieser Serie erfahren Sie, wie Sie die Leistung Ihres Spiels mit Profiling, Speicher und Code-Architektur verbessern können. In den nächsten Wochen werden wir zwei weitere Beiträge veröffentlichen: Der erste wird sich mit der UI-Physik befassen, gefolgt von einem weiteren über Audio und Assets, Projektkonfiguration und Grafik.
Möchten Sie die komplette Serie jetzt sehen? Laden Sie das vollständige E-Book kostenlos herunter.
Auf geht's!
Wo könnte man besser beginnen als mit der Profilerstellung und dem Prozess der Erfassung und Auswertung von mobilen Leistungsdaten? Hier beginnt die Optimierung der mobilen Leistung erst richtig.
Profilierung früh, oft und auf dem Zielgerät
Der Unity Profiler liefert wichtige Leistungsinformationen über Ihre Anwendung, aber er kann Ihnen nicht helfen, wenn Sie ihn nicht benutzen. Erstellen Sie ein Profil für Ihr Projekt in der frühen Entwicklungsphase, nicht erst, wenn Sie kurz vor der Auslieferung stehen. Untersuchen Sie Störungen oder Ausschläge, sobald sie auftreten. Wenn Sie eine "Leistungssignatur" für Ihr Projekt entwickeln, werden Sie neue Probleme leichter erkennen können.
Während die Profilerstellung im Editor Ihnen einen Eindruck von der relativen Leistung der verschiedenen Systeme in Ihrem Spiel vermitteln kann, bietet die Profilerstellung auf jedem einzelnen Gerät die Möglichkeit, genauere Erkenntnisse zu gewinnen. Profilieren Sie einen Entwicklungs-Build auf Zielgeräten, wann immer dies möglich ist. Denken Sie daran, ein Profil zu erstellen und sowohl für die Geräte mit der höchsten als auch für die mit der niedrigsten Spezifikation zu optimieren, die Sie unterstützen wollen.
Zusammen mit dem Unity Profiler können Sie die nativen Tools von iOS und Android für weitere Leistungstests auf den jeweiligen Engines nutzen:
- Unter iOS verwenden Sie Xcode und Instrumente.
- Unter Android verwenden Sie Android Studio und Android Profiler.
Bestimmte Hardware kann die Vorteile zusätzlicher Profiling-Tools nutzen (z. B. Arm Mobile Studio, Intel VTune und Snapdragon Profiler). Weitere Informationen finden Sie unter Profiling von mit Unity erstellten Anwendungen.
Konzentration auf die Optimierung der richtigen Bereiche
Stellen Sie keine Vermutungen darüber an, was die Leistung Ihres Spiels verlangsamt. Verwenden Sie den Unity Profiler und plattformspezifische Tools, um die genaue Ursache einer Verzögerung zu finden.
Natürlich ist nicht jede hier beschriebene Optimierung für Ihre Anwendung geeignet. Etwas, das bei einem Projekt gut funktioniert, lässt sich möglicherweise nicht auf Ihr Projekt übertragen. Ermitteln Sie echte Engpässe und konzentrieren Sie Ihre Bemühungen auf das, was Ihrer Arbeit zugute kommt.
Verstehen, wie der Unity Profiler funktioniert
Der Unity Profiler kann Ihnen helfen, die Ursachen für Lags oder Freezes zur Laufzeit zu erkennen und besser zu verstehen, was in einem bestimmten Frame oder zu einem bestimmten Zeitpunkt passiert. Aktivieren Sie standardmäßig die CPU- und Speicherspuren. Sie können zusätzliche Profiler-Module wie Renderer, Audio und Physik überwachen, wenn dies für Ihr Spiel erforderlich ist (z. B. bei physiklastigem oder musikbasiertem Gameplay).

Erstellen Sie die Anwendung für Ihr Gerät, indem Sie Development Build und Autoconnect Profiler aktivieren, oder stellen Sie die Verbindung manuell her, um die Startzeit der Anwendung zu beschleunigen.

Wählen Sie die zu profilierende Plattform aus. Die Schaltfläche Aufzeichnen zeichnet mehrere Sekunden der Wiedergabe Ihrer Anwendung auf (standardmäßig 300 Bilder). Gehen Sie zu Unity > Preferences > Analysis > Profiler > Frame Count, um diesen Wert bis auf 2000 zu erhöhen, wenn Sie längere Captures benötigen. Dies bedeutet zwar, dass der Unity-Editor mehr CPU-Leistung erbringen und mehr Speicherplatz beanspruchen muss, kann aber je nach Szenario nützlich sein.
Hierbei handelt es sich um einen instrumentenbasierten Profiler, der ein Profil der Codezeitpunkte erstellt, die explizit in ProfileMarker verpackt sind (z. B. die Start- oder Update-Methoden von MonoBehaviour oder bestimmte API-Aufrufe). Wenn Sie das Deep Profiling Settingverwenden, kann Unity außerdem den Anfang und das Ende jedes Funktionsaufrufs in Ihrem Skriptcode profilieren, um Ihnen genau mitzuteilen, welcher Teil Ihrer Anwendung eine Verlangsamung verursacht.

Bei der Erstellung eines Profils für Ihr Spiel empfehlen wir Ihnen, sowohl Spikes als auch die Kosten für einen durchschnittlichen Frame in Ihrem Spiel zu berücksichtigen. Das Verständnis und die Optimierung der teuren Operationen, die in jedem Frame auftreten, können für Anwendungen, die unter der Ziel-Framerate laufen, nützlicher sein. Bei der Suche nach Spikes sollten Sie zuerst teure Operationen (z. B. Physik, KI, Animation) und die Garbage Collection untersuchen.
Klicken Sie in das Fenster, um einen bestimmten Frame zu analysieren. Verwenden Sie als Nächstes entweder die Timeline- oder die Hierarchieansicht für Folgendes:
- Die Timeline zeigt die visuelle Aufschlüsselung des Timings für ein bestimmtes Bild. So können Sie sich ein Bild davon machen, wie sich die Aktivitäten zueinander und zu den verschiedenen Themen verhalten. Verwenden Sie diese Option, um festzustellen, ob Sie CPU- oder GPU-gebunden sind.
- Hierarchie zeigt die Hierarchie der ProfileMarker, die in Gruppen zusammengefasst sind. Damit können Sie die Stichproben nach Zeitaufwand in Millisekunden sortieren(Zeit ms und Selbst ms). Sie können auch die Anzahl der Funktionsaufrufe und den verwalteten Heap-Speicher(GC Alloc) auf dem Frame zählen.

Einen vollständigen Überblick über den Unity Profiler finden Sie hier. Diejenigen, die sich noch nicht mit dem Profiling beschäftigt haben, können sich auch diese Einführung in das Unity Profiling ansehen.
Bevor Sie etwas in Ihrem Projekt optimieren, speichern Sie die Profiler-Datendatei. Implementieren Sie Ihre Änderungen und vergleichen Sie die gespeicherten Daten vor und nach der Änderung. Verlassen Sie sich auf diesen Zyklus, um die Leistung zu verbessern: profilieren, optimieren und vergleichen. Dann ausspülen und wiederholen.
Verwendung des Profile Analyzers
Mit diesem Tool können Sie mehrere Frames von Profiler-Daten zusammenfassen und dann Frames von Interesse lokalisieren. Möchten Sie sehen, was mit dem Profiler passiert, nachdem Sie eine Änderung an Ihrem Projekt vorgenommen haben? Die Vergleichsansicht ermöglicht es Ihnen, zwei Datensätze zu laden und zu unterscheiden, so dass Sie Änderungen testen und deren Ergebnis verbessern können. Der Profile Analyzer ist über den Paketmanager von Unity verfügbar.

Arbeit mit einem bestimmten Zeitbudget pro Rahmen
Für jedes Bild gibt es ein Zeitbudget, das sich nach den angestrebten Bildern pro Sekunde (FPS) richtet. Im Idealfall lässt eine Anwendung, die mit 30 FPS läuft, etwa 33,33 ms pro Bild zu (1000 ms / 30 FPS). Bei einer Zielvorgabe von 60 FPS verbleiben also 16,66 ms pro Bild.
Geräte können dieses Budget für kurze Zeiträume überschreiten (z. B. für Zwischensequenzen oder Ladesequenzen), aber nicht für längere Zeit.
Berücksichtigung der Gerätetemperatur
Bei mobilen Geräten empfehlen wir jedoch nicht, diese maximale Zeit konsequent zu nutzen, da das Gerät überhitzen kann und das Betriebssystem die CPU und GPU thermisch drosseln kann. Wir empfehlen, nur etwa 65 % der verfügbaren Zeit zu nutzen, um die Abklingzeit zwischen den Frames zu berücksichtigen. Ein typisches Frame-Budget beträgt etwa 22 ms pro Frame bei 30 FPS und 11 ms pro Frame bei 60 FPS.
Die meisten mobilen Geräte verfügen nicht über eine aktive Kühlung wie ihre Desktop-Pendants. Physikalische Wärmemengen können sich direkt auf die Leistung auswirken.
Wenn das Gerät heiß läuft, kann der Profiler eine schlechte Leistung feststellen und melden, auch wenn dies kein Grund zur langfristigen Besorgnis ist. Um eine Überhitzung des Profils zu vermeiden, sollten Sie das Profil in kurzen Bursts erstellen. Dadurch wird das Gerät gekühlt und die realen Bedingungen werden simuliert. Generell empfehlen wir, das Gerät 10-15 Minuten abkühlen zu lassen, bevor Sie erneut ein Profil erstellen.
Bestimmen Sie, ob Sie GPU-gebunden oder CPU-gebunden sind
Der Profiler kann Ihnen sagen, ob Ihre CPU länger braucht als Ihr zugewiesenes Frame-Budget, oder ob der Schuldige Ihr Grafikprozessor ist. Dies geschieht durch die Ausgabe von Markierungen mit dem Präfix Gfx wie folgt:
- Wenn Sie die Markierung Gfx.WaitForCommands sehen, bedeutet dies, dass der Rendering-Thread bereit ist, Sie aber möglicherweise auf einen Engpass auf dem Hauptthread warten.
- Wenn Sie häufig auf Gfx.WaitForPresent stoßen, bedeutet dies, dass der Hauptthread bereit war, aber darauf wartete, dass die GPU das Bild präsentiert.
Unity verwendet eine automatische Speicherverwaltung für Ihren benutzergenerierten Code und Ihre Skripte. Kleine Datenstücke, wie z.B. werttypisierte lokale Variablen, werden dem Stack zugewiesen. Größere Datenmengen und längerfristiger Speicherplatz werden dem verwalteten Heap zugewiesen.
Der Garbage Collector identifiziert regelmäßig ungenutzten Heap-Speicher und gibt ihn frei. Dies geschieht zwar automatisch, aber der Prozess der Untersuchung aller Objekte im Heap kann dazu führen, dass das Spiel stottert oder langsam läuft.
Um die Speichernutzung zu optimieren, müssen Sie darauf achten, wann Sie Heap-Speicher zuweisen und freigeben, und wie Sie die Auswirkungen der Garbage Collection minimieren. Weitere Informationen finden Sie unter Verwalteten Heap verstehen.

Verwenden des Memory Profilers
Dieses separate Add-on (verfügbar als Experimental- oder Preview-Paket im Package Manager) kann einen Schnappschuss des verwalteten Heap-Speichers erstellen, um Probleme wie Fragmentierung und Speicherlecks zu identifizieren.
Klicken Sie in der Strukturansicht, um eine Variable zu dem nativen Objekt zu verfolgen, das den Speicher belegt. Hier können Sie häufige Probleme mit dem Speicherverbrauch erkennen, z. B. übermäßig große Texturen oder doppelte Assets.
Lernen Sie, wie Sie den Memory Profiler in Unity nutzen können, um die Speichernutzung zu verbessern. Sie können auch unsere offizielle Memory Profiler-Dokumentation einsehen.
Reduzieren Sie die Auswirkungen der Garbage Collection (GC)
Unity verwendet den Boehm-Demers-Weiser-Garbage-Collector, der die Ausführung Ihres Programmcodes anhält und die normale Ausführung erst wieder aufnimmt, wenn seine Arbeit abgeschlossen ist.
Achten Sie auf bestimmte unnötige Heap-Zuweisungen, die GC-Spitzen verursachen können:
- Streicher: In C# sind Strings Referenztypen, keine Werttypen. Reduzieren Sie die unnötige Erstellung oder Manipulation von Zeichenfolgen. Vermeiden Sie das Parsen von String-basierten Datendateien wie JSON und XML; speichern Sie stattdessen Daten in ScriptableObjects oder Formaten wie MessagePack oder Protobuf. Verwenden Sie die StringBuilder-Klasse, wenn Sie Strings zur Laufzeit erstellen müssen.
- Unity-Funktionsaufrufe: Einige Funktionen erzeugen Heap-Zuweisungen. Zwischenspeichern Sie Verweise auf Arrays, anstatt sie in der Mitte einer Schleife zuzuweisen. Nutzen Sie auch die Vorteile bestimmter Funktionen, die die Erzeugung von Müll vermeiden. Verwenden Sie z. B. GameObject.CompareTag, anstatt eine Zeichenkette manuell mit GameObject.tag zu vergleichen (da die Rückgabe einer neuen Zeichenkette Müll erzeugt).
- Boxen: Vermeiden Sie die Übergabe einer werttypisierten Variablen anstelle einer referenztypisierten Variablen. Dadurch wird ein temporäres Objekt erstellt, und der damit verbundene potenzielle Müll konvertiert den Wertetyp implizit in einen Objekttyp (z. B. int i = 123; object o = i). Versuchen Sie stattdessen, konkrete Überschreibungen mit dem Werttyp bereitzustellen, den Sie übergeben möchten. Für diese Überschreibungen können auch Generika verwendet werden.
- Koroutinen: Obwohl yield keinen Müll produziert, wird ein neues WaitForSeconds-Objekt erstellt. Zwischenspeichern und Wiederverwenden des WaitForSeconds-Objekts, statt es in der yield-Zeile zu erstellen.
- LINQ und reguläre Ausdrücke: In beiden Fällen entsteht Müll durch Boxen hinter den Kulissen. Vermeiden Sie LINQ und reguläre Ausdrücke, wenn die Leistung ein Problem darstellt. Schreiben Sie for-Schleifen und verwenden Sie Listen als Alternative zur Erstellung neuer Arrays.
Möglichst zeitnahe Müllabfuhr
Wenn Sie sicher sind, dass ein Einfrieren der Garbage Collection keine Auswirkungen auf einen bestimmten Punkt in Ihrem Spiel haben wird, können Sie die Garbage Collection mit System.GC.Collect auslösen.
Unter Automatische Speicherverwaltung verstehen finden Sie Beispiele dafür, wie Sie dies zu Ihrem Vorteil nutzen können.
Verwendung des inkrementellen Garbage Collectors zur Aufteilung der GC-Arbeitslast
Anstatt eine einzige, lange Unterbrechung während der Programmausführung zu verursachen, verwendet die inkrementelle Garbage Collection mehrere, viel kürzere Unterbrechungen, die die Arbeitslast über viele Frames verteilen. Wenn die Garbage Collection die Leistung beeinträchtigt, versuchen Sie, diese Option zu aktivieren, um zu sehen, ob sie das Problem der GC-Spitzen reduzieren kann. Nutzen Sie den Profile Analyzer, um den Nutzen für Ihre Anwendung zu überprüfen.

Die Unity PlayerLoop enthält Funktionen zur Interaktion mit dem Kern der Spiel-Engine. Diese Struktur umfasst eine Reihe von Systemen, die für die Initialisierung und die Aktualisierung pro Frame zuständig sind. Alle Ihre Skripte werden sich auf diese PlayerLoop stützen, um Gameplay zu erzeugen.
Bei der Profilerstellung sehen Sie den Anwendercode Ihres Projekts unter der PlayerLoop (mit den Editor-Komponenten unter der EditorLoop).


Lernen Sie die PlayerLoop und den Lebenszyklus eines Skripts kennen.
Mit den folgenden Tipps und Tricks können Sie Ihre Skripte optimieren.
Verstehen der Unity PlayerLoop
Vergewissern Sie sich, dass Sie die Ausführungsreihenfolge der Frameschleife von Unity verstehen. Jedes Unity-Skript führt mehrere Ereignisfunktionen in einer bestimmten Reihenfolge aus. Sie sollten den Unterschied zwischen "Awake", "Start", " Update" und anderen Funktionen kennen, die den Lebenszyklus eines Skripts bestimmen.
Die spezifische Reihenfolge der Ausführung von Ereignisfunktionen finden Sie im Ablaufdiagramm des Skriptlebenszyklus.
Minimierung von Code, der bei jedem Frame ausgeführt wird
Überlegen Sie, ob der Code bei jedem Frame ausgeführt werden muss. Verschieben Sie unnötige Logik aus Update, LateUpdate und FixedUpdate. Diese Ereignisfunktionen sind praktische Orte, um Code zu platzieren, der bei jedem Frame aktualisiert werden muss, während jegliche Logik, die nicht mit dieser Frequenz aktualisiert werden muss, extrahiert wird. Führen Sie die Logik nach Möglichkeit nur dann aus, wenn sich die Dinge ändern.
Wenn Sie Update verwenden müssen , sollten Sie den Code alle n Frames ausführen. Dies ist eine Möglichkeit zur Anwendung von Time-Slicing, einer gängigen Technik zur Verteilung einer hohen Arbeitslast auf mehrere Frames. In diesem Beispiel wird die ExampleExpensiveFunction einmal alle drei Frames ausgeführt:
Unbekannter Blocktyp "codeBlock", bitte geben Sie einen Serializer dafür in der `serializers.types` prop an
Vermeiden Sie schwere Logik in Start/Awake
Wenn Ihre erste Szene geladen wird, werden diese Funktionen für jedes Objekt aufgerufen:
- Aufwachen
- OnEnable
- Start
Vermeiden Sie teure Logik in diesen Funktionen, bis Ihre Anwendung ihr erstes Bild gerendert hat. Andernfalls kann es zu längeren Ladezeiten als nötig kommen.
Einzelheiten zum ersten Laden einer Szene finden Sie in der Reihenfolge der Ausführung von Ereignisfunktionen.
Vermeiden Sie leere Unity-Ereignisse
Auch leere MonoBehaviours benötigen Ressourcen, daher sollten Sie leere Update- oder LateUpdate-Methoden entfernen.
Verwenden Sie Präprozessoranweisungen, wenn Sie diese Methoden zum Testen verwenden:
Unbekannter Blocktyp "codeBlock", bitte geben Sie einen Serializer dafür in der `serializers.types` prop an
Hier können Sie das Update in-Editor zum Testen verwenden, ohne dass unnötiger Overhead in Ihr Build einfließt.
Debug Log-Anweisungen entfernen
Protokollanweisungen (insbesondere in Update, LateUpdate oder FixedUpdate) können die Leistung beeinträchtigen. Deaktivieren Sie Ihre Log-Anweisungen, bevor Sie einen Build erstellen.
Um dies einfacher zu machen, sollten Sie ein Conditional-Attribut zusammen mit einer Vorverarbeitungsrichtlinie erstellen. Erstellen Sie zum Beispiel eine benutzerdefinierte Klasse wie diese:
Unbekannter Blocktyp "codeBlock", bitte geben Sie einen Serializer dafür in der `serializers.types` prop an

Erzeugen Sie Ihre Protokollnachricht mit Ihrer benutzerdefinierten Klasse. Wenn Sie den ENABLE_LOG-Präprozessor in den Player-Einstellungen deaktivieren, verschwinden alle Ihre Log-Anweisungen auf einen Schlag.
Hash-Werte anstelle von String-Parametern verwenden
Unity verwendet keine Stringnamen, um Animator-, Material- und Shader-Eigenschaften intern anzusprechen. Um die Geschwindigkeit zu erhöhen, werden alle Eigenschaftsnamen in Eigenschafts-IDs umgewandelt, und diese IDs werden tatsächlich zur Adressierung der Eigenschaften verwendet.
Wenn Sie eine Set- oder Get-Methode für einen Animator, ein Material oder einen Shader verwenden, nutzen Sie die Integer-Methode anstelle der String-Methode. Die String-Methoden führen einfach ein String-Hashing durch und leiten dann die gehashte ID an die Integer-Methoden weiter.
Verwenden Sie Animator.StringToHash für Animator-Eigenschaftsnamen und Shader.PropertyToID für Material- und Shader-Eigenschaftsnamen.
Wählen Sie die richtige Datenstruktur
Die Wahl der Datenstruktur wirkt sich auf die Effizienz aus, da die Iteration Tausende von Malen pro Frame erfolgt. Sie wissen nicht, ob Sie eine Liste, ein Array oder ein Wörterbuch für Ihre Sammlung verwenden sollen? Befolgen Sie den MSDN-Leitfaden zu Datenstrukturen in C# als allgemeinen Leitfaden für die Auswahl der richtigen Struktur.
Vermeiden Sie das Hinzufügen von Komponenten zur Laufzeit
Der Aufruf von AddComponent zur Laufzeit ist mit einigen Kosten verbunden. Unity muss beim Hinzufügen von Komponenten zur Laufzeit prüfen, ob es sich um doppelte oder andere erforderliche Komponenten handelt.
Die Instanziierung eines Prefab mit den gewünschten Komponenten, die bereits eingerichtet sind, ist im Allgemeinen leistungsfähiger.
GameObjects und Komponenten zwischenspeichern
GameObjects.Find, GameObject.GetComponent und Camera.main (in Versionen vor 2020.2) können sehr teuer sein, so dass es am besten ist, sie nicht in Update-Methoden aufzurufen. Rufen Sie sie stattdessen in Start auf und speichern Sie die Ergebnisse zwischen.
Hier ist ein Beispiel, das die ineffiziente Verwendung eines wiederholten GetComponent-Aufrufs zeigt:
Unbekannter Blocktyp "codeBlock", bitte geben Sie einen Serializer dafür in der `serializers.types` prop an
Rufen Sie GetComponent stattdessen nur einmal auf, da das Ergebnis der Funktion zwischengespeichert wird. Das zwischengespeicherte Ergebnis kann in Update ohne weitere Aufrufe von GetComponent wiederverwendet werden.
Unbekannter Blocktyp "codeBlock", bitte geben Sie einen Serializer dafür in der `serializers.types` prop an
Objektpools verwenden
Instantiate and Destroy kann Garbage und Garbage Collection (GC) Spikes erzeugen und ist im Allgemeinen ein langsamer Prozess. Anstatt regelmäßig GameObjects zu instanziieren und zu zerstören (z.B. Kugeln aus einer Pistole zu schießen), sollten Sie Pools von vorab zugewiesenen Objekten verwenden, die wiederverwendet und recycelt werden können.

Erstellen Sie die wiederverwendbaren Instanzen zu einem Zeitpunkt im Spiel (z. B. während eines Menübildschirms), an dem eine CPU-Spitze weniger auffällig ist. Verfolgen Sie diesen "Pool" von Objekten mit einer Sammlung. Während des Spiels aktivieren Sie bei Bedarf einfach die nächste verfügbare Instanz, deaktivieren Objekte, anstatt sie zu zerstören, und geben sie in den Pool zurück.

Dies reduziert die Anzahl der verwalteten Zuweisungen in Ihrem Projekt und kann Probleme mit der Garbage Collection verhindern.
Erfahren Sie hier, wie Sie ein einfaches Object-Pooling-System in Unity erstellen können.
ScriptableObjects verwenden
Speichern Sie unveränderliche Werte oder Einstellungen in einem ScriptableObject anstelle eines MonoBehaviours. Das ScriptableObject ist ein Asset, das sich im Projekt befindet und das Sie nur einmal einrichten müssen. Es kann nicht direkt an ein GameObjects angehängt werden.
Erstellen Sie Felder im ScriptableObject, um Ihre Werte oder Einstellungen zu speichern, und verweisen Sie dann in Ihren MonoBehaviours auf das ScriptableObject.

Die Verwendung dieser Felder aus dem ScriptableObject kann eine unnötige Duplizierung von Daten bei jeder Instanziierung eines Objekts mit diesem MonoBehaviour verhindern.
Sehen Sie sich dieses Tutorial Einführung in ScriptableObjects an, um zu erfahren, wie ScriptableObjects Ihr Projekt unterstützen können. Die entsprechende Dokumentation finden Sie auch hier.
Im nächsten Blogbeitrag werden wir uns die Grafik- und GPU-Optimierung genauer ansehen. Wenn Sie jedoch schon jetzt auf die gesamte Liste der Tipps und Tricks des Teams zugreifen möchten, finden Sie hier unser E-Book in voller Länge.

Laden Sie unser E-Book herunter
Wenn Sie mehr über integrierte Support-Services erfahren möchten und Ihrem Team direkten Zugang zu Ingenieuren, Expertenrat und Best-Practice-Anleitungen für Ihre Projekte geben wollen, dann sehen Sie sich hier die Erfolgspläne von Unity an.
Wir möchten Ihnen helfen, Ihre Unity-Anwendungen so performant wie möglich zu gestalten. Wenn Sie also mehr über Optimierungsmöglichkeiten wissen möchten, schreiben Sie uns bitte in die Kommentare.