Wenn du dich schon mal gefragt hast warum dein Projekt 90 Sekunden braucht um ein Level mit 3 sichtbaren Actors zu laden — dieser Beitrag ist für dich. Die Antwort ist fast immer: Hard-References ziehen den gesamten Spiel-Inhalt in den Speicher.

Lass uns das fixen.

Was ist überhaupt eine Reference?

In Unreal, wenn ein Asset auf ein anderes Asset zeigt, ist das eine Reference. Dein BP_PlayerCharacter referenziert sein Mesh. Dein BP_Pickup_HealthPotion referenziert das Trank-Mesh, den Sound, das Partikelsystem.

Es gibt zwei Wege das auszudrücken:

  • Hard Reference (Object Reference / Class Reference): Unreal lädt das Ziel in den Speicher sobald das referenzierende Asset geladen wird.
  • Soft Reference (Soft Object Reference / Soft Class Reference): Unreal speichert nur den Pfad zum Ziel. Es wird erst geladen wenn du es anforderst.

Gleicher Blueprint-Pin, völlig anderer Speicherverbrauch.

Ein konkretes Beispiel

Du baust ein Inventar-System. Du hast ein BP_Item_Base Blueprint und 200 Child-Items: Waffen, Tränke, Schriftrollen, Zutaten.

In deinem BP_Player hast du ein Array-Variable: Items : BP_Item_Base[].

Das ist ein Hard-Array-Reference. Sobald BP_Player geladen wird, werden alle 200 Item-Blueprints geladen. Plus deren Meshes. Plus deren Texturen. Plus deren Soundeffekte. Willkommen bei deiner 90-Sekunden-Ladezeit.

Ändere den Array-Typ zu Items : Soft Class Reference (BP_Item_Base)[] und der Player speichert jetzt 200 Pfade. Gesamtkosten: vielleicht 8 KB. Items werden erst geladen wenn sie aufgehoben werden.

Das ist der Unterschied.

Wann was nutzen?

Hard-References nutzen wenn:

  • Das Objekt jeden Frame gebraucht wird (Player-Mesh, HUD).
  • Das Objekt sowieso immer vorhanden ist (ein globaler Manager).
  • Die Reference einmalig und klein ist.

Soft-References nutzen wenn:

  • Das Objekt bedingt ist — aufgehoben, gespawnt, geöffnet.
  • Das Objekt groß ist (Meshes, Sounds, Partikelsysteme).
  • Du viele davon in einer Liste hast (Item-Kataloge, Dialog-Bäume, Gegner-Spawn-Tabellen).

Faustregel: wenn du nicht ehrlich sagen kannst „dieses Objekt wird jetzt sofort, jedes Mal wenn dieses Asset lädt, gebraucht" — mach es soft.

Wie lade ich eine Soft-Reference?

Hard-Refs sind automatisch — nichts zu tun. Soft-Refs brauchen einen Node:

CB0

Das ist Async Load Asset (für Soft Object Reference) oder Async Load Class Asset (für Soft Class Reference). Der OnLoaded-Execution-Pin feuert sobald das Asset im Speicher ist.

Kosten: ein zusätzlicher Node und ein kurzes Async-Warten beim ersten Mal. Nutzen: dein Level lädt 10× schneller.

Typische Fehler

  • Auf eine soft-referenzierte Klasse casten ohne sie vorher zu laden. Der Cast schlägt still fehl. Erst laden, dann casten.
  • Soft-Refs in einer engen Schleife speichern. Wenn du Async Load Asset in einem Tick-Event aufrufst, lädst du jeden Frame neu. Einmal laden, Ergebnis speichern.
  • Vergessen, eine Reference zum geladenen Objekt zu behalten. Nach dem Laden das Ergebnis in eine Variable speichern. Wenn nicht, sammelt Unreal das Asset wieder ein und du lädst es nächstes Mal erneut.
  • Muster mischen. Wenn auch nur ein Node in deiner Reference-Kette eine Hard-Reference ist, wird alles dahinter mitgezogen. Verfolge die Kette.

Hard-Ref-Probleme finden

Unreal hat ein eingebautes Tool. Rechtsklick auf ein Asset → Reference Viewer (oder Alt+Shift+R). Du siehst genau, was geladen wird wenn dieses Asset angefasst wird. Wenn an deinem BP_Player 400 Dinge hängen — da fängst du an.

Für einen projektweiten Audit: Window → Developer Tools → Size Map. Wähle eine Klasse, sieh ihren Speicherverbrauch und was sie reinzieht.

Die 30-Sekunden-Zusammenfassung

  • Hard-Reference = lädt sofort, immer, vollständig.
  • Soft-Reference = lädt nur wenn du es anforderst.
  • Groß, optional oder viele → soft.
  • Immer vorhanden und klein → hard.
  • Reference Viewer (Alt+Shift+R) zeigt dir die Wahrheit.

Probier's: öffne das Asset mit den meisten Loads in deinem Projekt und check den Reference Viewer. Du wirst fast sicher mindestens ein fettes Asset finden, das du auf soft umstellen kannst.

Nächste Woche schauen wir uns Async-Loading-Patterns im Detail an — wie du lädst während ein Loading-Spinner läuft, wie du parallel lädst und wie du den klassischen „Async Load Asset im Tick"-Disaster vermeidest.

— Marco