Partikel in der UI
Partikeleffekte für die UI sind in Unity von Haus aus nicht sonderlich gut unterstützt. Man kann zwar ein herkömmliches Partikelsystem an Childs eines Canvas hängen, aber das Rendern funktioniert z.B. nicht mit dem Modus Overlay:
Abbildung 5a: Partikelsystem als Child des grünen Play-Buttons
Abbildung 5b: Hierarchie zu 5a
In Abbildung 5a sehen wir, dass die Partikel nicht nur hinter den UI Elementen des Parent-Canvas "Foreground" verschwinden, sie liegen auch hinter dem darunterliegenden Canvas "Background". Wie kommen wir trotzdem an unser Ziel? Am leichtesten wäre es die anderen beiden Render-Modi "Camera" oder "World" zu benutzen. Das bringt jedoch auch deren Eigenheiten mit sich. Im Folgenden möchte ich zwei Ansätze vorstellen, mit denen trotzdem "Overlay" verwendet werden kann. Beide benutzen dafür eine zusätzliche Kamera.
Als erstes kann man die separate Kamera ausschließlich die UI rendern lassen und sie dann als Overlay-Kamera zur MainCamera hinzufügen. Jetzt kann man das Canvas auf "Camera" umstellen, damit es das Partikelsystem korrekt rendert und behält dabei den Overlay-Effekt, sowie Layouting für di Partikel. Bei Verwendung eines einzelnen (Root-)Canvas kann man das Canvas auch auf "Overlay" lassen und das Partikelsystem schlichtweg an der korrekten Stelle in der Welt platzieren.
Abbildung 6: Rote Partikel innerhalb eines Raw Image
Anstatt die ganze UI von der neuen Kamera rendern zu lassen, kann man auch nur das Partikelsystem rendern lassen und die Ausgabe der Kamera auf eine Rendertextur geben. Diese Rendertextur kann dann von der UI-Komponente "Raw Image" angezeigt werden. Das hat den Vorteil, dass der Effekt leicht maskiert werden kann, entweder über Masken-Komponenten oder die Größe der Textur. Es kann allerdings einiges an Tüfteln mit den Einstellungen der Rendertextur benötigen, bis man die richtigen Maße und Qualität für den eigenen Anwendungsfall raus hat. Man kann in Abbildung 6 z.B. sehen, dass oben unter dem ersten "o" ein roter Partikel abgeschnitten wird, weil dort die Grenze des Raw Image erreicht ist.
Mehrere Kameras kann man sich allerdings nicht auf jeder Plattform leisten. Ein weiterer Performance-Grund, warum Partikel besser nicht in der UI sein sollten, ist, dass Partikelsysteme meist konstant in Bewegung sind (mehr dazu im Kapitel Performance). Deswegen ist es besser Partikelsysteme in der Welt zu belassen, wenn das Spiel bzw. der Szenenaufbau dieses erlaubt.
Abbildung 7a: Szenen-Ansicht des Screen Space Camera Setups
Abbildung 7b: Ansicht im Spiel
Für die Abbildung 7a habe ich die beiden Canvasses auf "Screen Space - Camera" umgestellt und das Partikelsystem dazwischen geschoben. Im Gameview (Abbildung 7b) tauchen die Partikel nun ordnungsgemäß zwischen Vorder- und Hintergrund-Canvas auf. Bei diesem Setup entsteht natürlich die Schwierigkeit, dass man das Partikelsystem korrekt platzieren muss. Das Ganze für statische Elemente per Hand aufzusetzen erscheint noch machbar, aber sobald Dinge dynamisch werden (Bildschirmgrößen bei Mobile, Partikelsysteme dynamisch instanziieren) braucht es wieder ein selbstgeschriebenes System.
Zuletzt noch ein sehr gutes Package, was eine kostenlose Lösung für Partikel in der UI bietet: hier.