Partikelsystem ein/ausschalten in Unity 2019
Partikelsysteme gehören zu den Komponenten, die sich in den meisten Game-Engines oft und grundlegend ändern. Auch in Unity kommt es immer wieder zu Umstrukturierungen, die dafür sorgen, dass bestehender Code nicht mehr wie gewohnt funktioniert.
Emission de/aktivieren
Das einfache Ein- und Ausschalten des Partikelsystems hat sich in Unity 2019 wieder einmal geändert. Das frühere Feld enableEmission
erscheint nun als veraltet. Statt dessen soll emission.enabled
verwendet werden, das wiederum nicht direkt, sondern nur über einen Zeiger schreibbar ist.
ParticleSystem.EmissionModule e = ps.emission; //Zeiger auf Emission-Komponente e.enabled = true; //ein/ausschalten wie gewohnt
Das Problem ist meines Erachtens noch nicht einmal die Änderung selbst. Da Partikelsysteme aus einer riesigen Menge von Einstellungen und Funktionen bestehen, macht es Sinn, die Bestandteile in Unterkomponenten zu isolieren. Jedoch sorgt die Art und Weise der Implementierung aufgrund ihrer Inkonsistenz dafür, dass der Code schwerer zu erlernen ist. An kaum einer anderen Stelle ist es nötig, einen Zeiger auf die Emissionskomponente zu holen und dann darin ein Feld zu setzen. Ähnlich ist vielleicht noch das Setzen von Transformationseigenschaften, z.B. x/y/z der Position, die ebenfalls das Anlegen einer Zwischenvariable erfordern, die dann aber zurückgeschrieben werden muss.
Komplettes Unity-Beispiel zum Nachvollziehen
- Erstelle ein neues Unity-Projekt vom Typ 3D (getestet mit Unity 2019.1)
- Füge über das Menü Game Objects > Effects > Particle System ein Partikelsystem hinzu.
- Erstelle eine C#-Datei in den Assets namens
ParticleTest.cs
und füge den unten stehenden Code ein. Speichern. - Ziehe das neue Script auf das Partikel-System-Spielobjekt.
- Starte das Spiel, klicke in den Game-Fensterbereich und schalte das Partikelsystem mit der Taste 1 ein und der Taste 2 aus.
ParticleTest.cs
using System.Collections; using System.Collections.Generic; using UnityEngine; public class ParticleTest : MonoBehaviour { private ParticleSystem ps; // Start is called before the first frame update void Start() { ps = GetComponent<ParticleSystem>(); } // Update is called once per frame void Update() { ps.enableEmission = true; ParticleSystem.EmissionModule e = ps.emission; if (Input.GetKeyUp(KeyCode.Alpha1)) e.enabled = true; if (Input.GetKeyUp(KeyCode.Alpha2)) e.enabled = false; } private Rect r = new Rect(0, 0, 500, 500); private GUIContent h = new GUIContent("Taste 1: PS an, Taste 2: PS aus"); public void OnGUI() { GUI.Label(r, h); } }