Ich wollte bei einem kleinen Testspiel in Unity 3d immer wenn ich ein Pickup sammle einen Partikeleffekt abspielen (das funktioniert auch wunderbar) und ihn dann nach 2 Sekunden wieder löschen, damit ich nicht irgendwann hunderttausend unbenutzte Partikeleffekte in der Welt rumstehen habe, das mit dem verzögerten löschen funktioniert aber noch nicht so ganz bei meinem Code:
fehlermeldungen gibts keine, und wenn ich es so schreibe wird der Effekt auch direkt gelöscht:
//Edit: Ich habe den Fehler gefunden, ich musste anstatt "DelayedAction(2.0f, a);", "StartCoroutine(DelayedAction(2.0f, a));" schreiben...
Code:
void OnTriggerEnter(Collider other) {
if (other.gameObject.tag == "PickUp") {
SetRandomPickupPosition();
count++;
SetCountText();
var particleClone = Instantiate(particle, pickup.transform.position, pickup.transform.rotation);
Action a = () => Destroy(particleClone);
DelayedAction(2.0f, a);
}
}
IEnumerator DelayedAction(float delay, Action action) {
yield return new WaitForSeconds(delay);
action.Invoke();
}
Code:
void OnTriggerEnter(Collider other) {
if (other.gameObject.tag == "PickUp") {
SetRandomPickupPosition();
count++;
SetCountText();
var particleClone = Instantiate(particle, pickup.transform.position, pickup.transform.rotation);
Destroy(particleClone);
}
}
IEnumerator DelayedAction(float delay, Action action) {
yield return new WaitForSeconds(delay);
action.Invoke();
}