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);
    }
}

Dr. René Bühling

Hi, mein Name ist René und ich möchte Dir dabei helfen, deinen Traum vom eigenen Computerspiel Wirklichkeit werden zu lassen. Mein erstes kommerziell veröffentlichtes Spiel habe ich Mitte der 1990er Jahre als Hobby-Projekt mit einem Basic-Dialekt unter Windows entwickelt. Seither verfolge ich das Thema Spieleentwicklung in Hobby, Studium und Beruf. Ich habe über 20 Jahre Erfahrung in allen Phasen des Entwicklungsprozesses, die ich gerne mit dir teilen möchte.