Jump to content
Unity Insider Forum

Partikelsystem abspielen und wieder zerstören


Garzec

Recommended Posts

Guten Abend,

für das Spiel "Schiffe versenken" habe ich zwei Partikelsysteme entworfen. Bei einem Treffer, wird auf dem Feld eine Explosion erzeugt, ansonsten ein WaterSplash.

 

Da die beiden Systeme default mäßig eine Transform Größe von 1,1,1 haben, möchte ich, dass sie beim Erzeugen eine relative Größe zum Feld haben, damit der Radius wirklich nur auf dieses Feld begrenzt ist.

 

Nun ist das Problem, dass das Partikelsystem 1. beim Abspielen sehr seltsam aussieht und 2.riesig ist, also nicht auf dem Feld.

 

Ich packe da noch ein Video dazu.

 

Zu den relevanten Codestellen:

 

Meine Datenklasse...

   public GameObject ParticlesExplosion { get { return particlesExplosion; } }
   public GameObject ParticlesWatersplash { get { return particlesWatersplash; } }

 

Der Controller

private void PlayerClick()
   {
    if (cellData.IsEnemyCell) // Zelle auf Gegnerseite
    {
	    if (!cellData.WasActivated) // Zelle noch nicht geklickt
	    {
		    if (cellData.IsShipCell) // Treffer?
		    {
			    cellView.SetCellColor(cellData.HitColor); // Farbe ändern
			    CreateParticleEffect(cellData.ParticlesExplosion); // Explosion erzeugen
		    }
		    else // kein Treffer
		    {
			    cellView.SetCellColor(cellData.NoHitColor); // Farbe ändern
			    CreateParticleEffect(cellData.ParticlesWatersplash); // WaterSplash erzeugen
		    }
		    cellData.WasActivated = true; // Zelle kann nicht mehr geklickt werden
		    DestroyParticleEffect(cellData.ParticlesExplosion); // Daten wieder löschen
		    DestroyParticleEffect(cellData.ParticlesWatersplash); // Daten wieder löschen
	    }
    }
   private void CreateParticleEffect(GameObject particles)
   {
    GameObject particleSystem = Instantiate(particles, new Vector3( // Die Position der Zelle
			   gameObject.transform.position.x,
			   gameObject.transform.position.y + cellData.ParticlesHeight, // etwas höher als die Zelle
			   gameObject.transform.position.z), particles.transform.rotation); // Rotation des Partikelsystems
    particleSystem.transform.parent = gameObject.transform; // Partikelsystem zum Kind der Zelle machen, damit die Größe relativ bleibt
   }
   private void DestroyParticleEffect(GameObject particles)
   {
    Destroy(particles, 5);
   }
   }

 

So und dann noch das Video zum angucken (Habs verlinkt, hochladen konnte ichs als .flv nicht)

 

https://sendvid.com/udprmgbr

 

Wäre super, wenn mir da jemand helfen könnte :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

DestroyParticleEffect(cellData.ParticlesExplosion); // Daten wieder löschen
DestroyParticleEffect(cellData.ParticlesWatersplash); // Daten wieder löschen

Du zerstörst an dieser Stelle die Prefabs, die immer instanziiert werden, nicht die Instanzen. Soll das so sein?

 

Was die kaputte Größe angeht, habe ich ganz stark

particleSystem.transform.parent = gameObject.transform;

im Verdacht. Das "gameObject.transform" oder einer seiner Parents hat mit Sicherheit eine Skalierung anders als 1,1,1.

Das führt dazu, dass das Objekt als Child runterskaliert wird:

  • Parent (scale 2,2,2)
    • Child (scale 1,1,1)

Bei diesem Beispiel würde das Child auf 2,2,2 hochskaliert werden, weil es relativ zum Parent die Größe 1,1,1 hat.

 

Im Prinzip würde ich Objekte mit Children nach Möglichkeit nicht skalieren um solche Probleme zu verhindern.

Du kannst aber auch SetParent statt "parent =" benutzen. Die Methode hat einen Parameter, die die absolute Skalierung erhalten kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für den Tipp,

 

ich habe die Methode mal daraufhin zusammengefasst zu

 

GameObject particleSystem = Instantiate(particles, new Vector3(
			   gameObject.transform.position.x,
			   gameObject.transform.position.y,
			   gameObject.transform.position.z), particles.transform.rotation);
    Destroy(particleSystem, 5);

 

Die Methode

particleSystem.transform.SetParent(gameObject.transform, false);

ist sehr hilfreich, leider wird dadurch, dass die Zellen nun auf 1,0.2,1 stehen, das Partikelsystem stark verschoben, von daher lasse ich das mit dem Kindobjekt, da die Partikelsysteme sowieso nach einer gewissen Zeit zerstört werden sollen.

 

Und nein, das Zerstören sollte nicht so sein, sondern auf die korrekte Weise :P aber durch deine Frage habe ich auch den Fehler entdeckt und das dementsprechend oben in der Methode angepasst. Danke :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...