Jump to content
Unity Insider Forum

Mesh im Particlesystem über Code Ändern


Singular

Recommended Posts

Hallo zusammen,

 

ich habe ein Particelsystem gebastelt, dass instatiiert wird, sobald ein Objekt im Spiel zerstört wird. Es wird also vom Health Script ,des Objektes das zerstört wurde, erstellt.

Da es aber unterschiedliche Objekte gibt, die zerstört werden könnten, die alle das selbe Particelsystem verwenden, möchte ich dass das Healthscript direkt an das Particelsystem, das gerade erstellt wurde, werte weiter gibt, die wichtig sind.

Zum einen soll das Shape.Mesh geändert werden und die größe, Die Farbe der Particle soll an das Mesh angepasst werden das ihm übergeben wurde.

Wie komme ich an diese Sachen heran und wie kann ich sie ändern. Mir wird bei 

GetComponent<ParticleSystem>().shape.mesh

angezeigt, dass es sich um keine Variable handelt und sie deswegen nicht geändert werden kann. Obwohl dort aber steht, dass es ein Get und ein Set gibt. Wie komme ich dann an das Set?

oder muss ich den GetComponent<ParticleSystemMeshShapeType>()... verwenden? Wenn ja, wie?

 

Im Zuge dessen muss ich mich gerade fragen, wie komme ich den überhaupt an den Mesh meines Objektes dran?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 56 Minuten schrieb Singular:

dass es sich um keine Variable handelt und sie deswegen nicht geändert werden kann. Obwohl dort aber steht, dass es ein Get und ein Set gibt. Wie komme ich dann an das Set?

Es ist keine Variable, sondern eine Property. Und du kannst da sehr wohl dran arbeiten, aber nicht in einem Rutsch. Auf das Problem stoßen die meisten bei Transform.position.

transform.position = Vector3.zero; // geht
transform.position.x = 0f; // geht nicht

Transform.position ist eine Property, und x ist ein Member des Structs, das die Property speichert. Du kannst den Wert der Property überschreiben (set), aber du kannst nicht den Wert für x setzen, während du lesend auf die Property zugreifst. Dafür muss man z.B. so etwas machen:

var pos = transform.position;
pos.x = 0f;
transform.position = pos;

Wie du siehst, kann man alle Elemente bearbeiten, aber eben nicht auf einmal.

Bei Partikelsystem ist das auch so, nur dass aufgrund von finsterer Magie kein zurückschreiben nötig ist (wie in meinem Code die dritte Zeile). Siehe hier: https://docs.unity3d.com/ScriptReference/ParticleSystem-shape.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Cool, danke dir für die schnelle Antwort. Das hat auf jeden Fall schon mal geklappt... auch wenn ich nicht ganz dahinter gestiegen bin, was ich da eigentlich tue.

 

var sh = ps.shape;  speichert (in einfachen Worten) den "Shape Bereich" in der Variablen sh.

sh.enabled = true;  setzt wahrscheinlich nur den Hacken im Partikelsystem. Was ja eh schon der Fall ist. Kann ich also rauslassen.

sh.shapeType = ParticleSystemShapeType.Mesh;  setzt den Typ auf Mesh... Was je eh schon der Fall ist. Kann ich a... ich habe ein Deja vu.

sh.mesh = mesh;  setzt den Mesh meines Objektes in das Partikelsystem. Also das , worauf ich hinaus wollte.

 

Hab's gerade mal getestet und hab die beiden Zeilen rausgenommen. Funktioniert genauso.

Wie komme ich jetzt einfacher an das Mesh meines Objektes heran? Ich habe jetzt eine public mesh Variable erstellt und für den Test den Mesh da herein gezogen. Das geht zwar ist aber für mein Raumschiff mit knapp 30 Einzelteilen etwas umständlich.

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Minute schrieb Singular:

auch wenn ich nicht ganz dahinter gestiegen bin, was ich da eigentlich tue

Soll ich dir was sagen? Ich hab keine Ahnung was zum Geier Unity da macht. ShapeModule ist ein Struct und dass man das nicht zurückschreiben muss (wie bei transform.position) ist extrem weird. Ich nehme an, dass die Propertys von dem Struct allesamt irgendwie Dinge in C++-Land schreiben gehen mit einer Adresse, die im Struct steckt. Extrem weirder Kram, mach dir also keinen Kopf xD

vor 3 Minuten schrieb Singular:

Wie komme ich jetzt einfacher an das Mesh meines Objektes heran?

Du wirst wohl einen Haufen MeshFilter in einer Hierarchie haben, richtig? Dann könntest du mit GetComponentsInChildren<MeshFilter>() alle diese MeshFilter finden und deren Meshes besorgen. Am besten nicht in jedem Frame oder so ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Minuten schrieb Sascha:

Soll ich dir was sagen? Ich hab keine Ahnung was zum Geier Unity da macht. ShapeModule ist ein Struct und dass man das nicht zurückschreiben muss (wie bei transform.position) ist extrem weird. Ich nehme an, dass die Propertys von dem Struct allesamt irgendwie Dinge in C++-Land schreiben gehen mit einer Adresse, die im Struct steckt. Extrem weirder Kram, mach dir also keinen Kopf xD

Alles klar dann bin ich beruhigt. Dann nehme ich das einfach so hin und versuche es mir zu merken. Das erklärt allerdings auch, warum ich das auf der Unityseite nicht gefunden habe. Du wusstest wonach du suchen musst... ich halt nicht und war auf anderen Seiten für das Patrikelsystem :D

vor 21 Minuten schrieb Sascha:

Du wirst wohl einen Haufen MeshFilter in einer Hierarchie haben, richtig? Dann könntest du mit GetComponentsInChildren<MeshFilter>() alle diese MeshFilter finden und deren Meshes besorgen. Am besten nicht in jedem Frame oder so ;)

Warum nicht in jedem Frame? So halte ich die Framerate schön klein. Vor allem, wenn sich da gerade 20.000 Raumschiffe auf dem Bildschirm befinden und jeder von denen mit je 30 Teilen ausgestattet ist, die 60 mal in der Sekunde nachschauen ob ihr Mesh auch wirklich das ist, das sie gerade haben... (Ich hab ja sonst nicht zu tun also frag ich mal mein Mesh ab)

Keine Sorge, das wird einmal in der Awake Methode laufen oder in dem Moment wo das Objekt zerstört wird und fertsch.

 

Danke dir auf jeden Fall schon Mal!

Link zu diesem Kommentar
Auf anderen Seiten teilen

Nochmal ganz kurzer Nachtrag zum Thema "Mach dir keinen Kopf drum"

Um das Material meines Partikelsystems zu ändern brauche ich nur 

g.GetComponent<ParticleSystemRenderer>().material = mat;

Warum kann es nicht auch mit dem Shape so einfach sein? (brauchst nicht darauf antworten, hast du ja schon getan ;) ) 

Ich habe mich zwar bekloppt gesucht, statt "Renderer" nach "ParticleSystemRenderer" zu suchen aber was solls.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...