Jump to content
Unity Insider Forum

Unity Particle System, Emissions Module, rate Over Time verändern via Skript ...


Kasi2302

Recommended Posts

Hallo,

Bitte helf mir... 🙏

Ich beschäftige mich seit ungefähr einer Woche mit diesem Problem, habe viel gelesen und via Google gesucht, aber es gibt immer Compilerfehler.

Bisher konnte ich alle Probleme selbst lösen, aber diesmal bekomme Ich es einfach nicht hin.

Ich verwende "Unity 2020.3.1f1" für mein Projekt. Ich schreibe ein Skript, das den Ablauf in der aktuellen Szene steuern soll.

Der konstante Emissionswert "rateOverTime" sollte zu einem bestimmten Zeitpunkt mit dem Skript geändert werden.

Leider funktioniert es nicht, Ich kann einfach nicht auf das Emissionsmodul des Particle Systems zugreifen ...

Das Skript möchte Ich jedoch nicht an das Partikelsystem angehängen, sondern es befindet sich in einem leeren Spielobjekt.

Ich habe sogar das Beispiel aus der Unity-Dokumentation für das EmissionModule 2020.3 ausprobiert, das ebenfalls einen Compilerfehler erzeugt.

 

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour
{
private ParticleSystem ps;
public float emissionrate = 1.0f;

void Start()
{
ps = GetComponent<ParticleSystem>();
}

void Update()
{
var emission = ps.emission;
emission.rateOverTime = emissionrate;
}
}

 

Folgender Fehler kommt dann immer:

NullReferenceException: Do not create your own module instances, get them from a ParticleSystem instance
UnityEngine.ParticleSystem+EmissionModule.set_rateOverTime (UnityEngine.ParticleSystem+MinMaxCurve value) (at <ac4201de60e7407889b38ca75ea7dc7e>:0)
SceneMainController.Update () (at Assets/Scripts/SceneMainController.cs:44)

Ich habe den Namen meines Partikelsystems als "Particle System" belassen, möchte ihn aber in "vfx_fog" umbenennen.
Bitte berücksichtigt dies in Euren Antworten.

LG

Kasi


 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

vor 2 Stunden schrieb Kasi2302:

Compilerfehler

Du hast da aber eine Exception, das ist kein Kompilierfehler. Die Konsole zeigt sowohl Kompilierfehler (Code ist ungültig und kann nicht kompiliert werden) als auch Exceptions (ein Fehler ist bei der Ausführung passiert) zusammen an. Wenn du auf "clear" drückst, werden aus der Konsole alle Exceptions entfernt, aber die Kompilierfehler bleiben drin. Wenn du dann also noch einen Fehler hast, dann musst du ihn fixen, ansonsten kannst du das Spiel nochmal laufen lassen. Und der Code, den du da hast, sieht in Ordnung aus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, sorry, habe mich falsch ausgedrückt, der Fehler tritt bei der Ausführung auf.

Schön wäre aber, wenn mir jemand helfen könnte...

Bei den Neueren Unity Versionen ab Version 2020 wurde leider viel geändert, was die Syntax der Befehle betrifft.

Ich habe im Internet schon viele Varianten der Befehlsstruktur gefunden um das cEmissions Modul anzusprechen, doch keine von denen hat bisher funktioniert.

Weil es ja auch eine Rolle spielt ob das Script direkt ins ParticleSystem eingebunden ist oder in einem leeren gameObjekt platziert ist.

Ich brauche die richtige syntax / Befehlsstruktur für ein leeres GameObject !!!

Ich möchte den konstanten Emissionswert mit einer Schleife verringern, damit der Nebel langsam verschwindet.

Ich habe auch schon verschiedene Tests mit einem public GameObject ausprobiert und das ParticleSystem da rein gezogen, auch das klappt leider nicht. 😪

Bitte helft mir...

LG

Kasi

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich kann das Script natürlich gerne posten, nur da steht das selbe drin, wie im Beispiel un d daher müsste es eigentlich funktionieren.

Das script ist noch lange nicht fertig, jetzt ist es erstmal ein Test um das Emissions Modul anzusprechen, was leider nicht funktioniert.

Der Wert "rateOverTime" steht jetzt auf 50 und soll durch das Script nach einer Verzögerung von 5 Sekunden auf 1 gesetzt werden, die Schleife baue ich ein, wenn es endlich funktioniert.

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using TMPro;

public class SceneMainController : MonoBehaviour
{

    float size = 0f;
    float readsize;
    public TMP_Text TextComponent;
    private float timer = 0;
    private float timerMax = 0;
    private ParticleSystem ps;
    public float emissionrate = 1.0f;



    // Start is called before the first frame update
    void Start()
    {
        Screen.sleepTimeout = (int)0f;
        Screen.sleepTimeout = SleepTimeout.NeverSleep;

        readsize = TextComponent.fontSize;
        TextComponent.fontSize = 0f;

        ps = GetComponent<ParticleSystem>();


    }

    // Update is called once per frame
    void Update()
    {
        
        if (!Waited(5)) return;


        var emission = ps.emission;
        emission.rateOverTime = emissionrate;


        if (!Waited(5)) return;

        if (size < readsize)
        {
            size = size + 0.5f;
            TextComponent.fontSize = size;
        }

        else
        {
            return;
        }


    }

    private bool Waited(float seconds)
    {
        timerMax = seconds;

        timer += Time.deltaTime;

        if (timer >= timerMax)
        {
            return true; //max reached - waited x - seconds
        }

        return false;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab das Script kopiert und bei mir eingefügt; läuft ohne Probleme. Keine Fehlermeldungen und macht was es soll.

Deine Fehlermeldung habe ich gekriegt, wenn ich das Script auf ein GameObject gepackt habe, das gar kein ParticleSystem hat... würde vermuten, da ist das Problem. Dein Script muss schon auf dasselbe GameObject wie das ParticleSystem.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Aber genau das möchte ich ja ebend nicht, hatte ich auch geschrieben, da es das zentrale script ist, welches die Scene steuert.

Deshalb liegt es in einem leeren GameObjekt, hatte ich auch geschrieben.

Gibt es denn eine Lösung ???

Denn selbst in einem leeren Game Object muss es ja funktionieren, nur die Syntax / Befehlsstruktur muss dann anders lauten.

Selbst, wie gesagt, mit ...

public ParticleSystem ps;

... geht es nicht, wenn ich das ParticleSystem in das GameObject rein ziehe...

Bitte Bitte, kennt jemand die richtige Syntax / Befehlsstruktur für mein Skript im leeren GameObject ???

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jetzt komm mal bitte runter und hör mit deinem Gebettel in jedem Post auf, ich bin doch schon dabei...

vor 4 Minuten schrieb Kasi2302:

Gibt es denn eine Lösung ???

Ja, natürlich gibt's die.

Du musst halt deine GetComponent-Zeile rauslöschen, weil sie die Referenz, die du durch das Reinziehen im Editor setzt, wieder überschreibt. Und zwar mit "null", denn es gibt ja kein ParticleSystem auf diesem GameObject. Das kannst du im Editor auch sehen, nachdem du den Play Mode startest. Da steht dann wieder "None" in dem Feld. Also einfach weg mit der Zeile und fertig.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...