gombolo 4 Posted November 28, 2020 Report Share Posted November 28, 2020 Hallo zusammen, ich schalte ein Objekt ein und aus....das mehrmals hintereinander über GameObject.enabled = true/bzw. false. Jetzt habe ich festgestellt...es verlangsamt die Steuerung des Spielers? Gibt es noch andere Alternativen um Objekte ein und auszuschalten? Ich habe schon Versuche mit SetActive gemacht. Auch bei dieser Variante wir der Ablauf verlangsamt. Wie macht Ihr es wenn Objekt schnell aus und eingeschaltet werden sollen? if(Input.GetKey (KeyCode.Space)) { if (this.fMuenungsfeuerZeit < Time.time && this.bFeuer == false) { //Muendungsfeuer_rechts.SetActive(true); //Muendungsfeuer_links.SetActive(true); //Muendungsfeuer_rechts.renderer.enabled = true; //Muendungsfeuer_links.renderer.enabled = true; this.fMuenungsfeuerZeit = Time.time +0.02f; this.bFeuer = true; } } if (this.fMuenungsfeuerZeit < Time.time && this.bFeuer == true) { //Muendungsfeuer_rechts.SetActive(false); //Muendungsfeuer_links.SetActive(false); //Muendungsfeuer_rechts.renderer.enabled = false; //Muendungsfeuer_links.renderer.enabled = false; this.fMuenungsfeuerZeit = Time.time +0.10f; this.bFeuer = false; } Quote Link to post Share on other sites
KaBau 22 Posted November 28, 2020 Report Share Posted November 28, 2020 Nur eine Überlegung, habe es selber nicht probiert: wenn es dir um das Sichtbar sein geht, kannst du nicht am Shader etwas ändern? Quote Link to post Share on other sites
Jog 27 Posted November 29, 2020 Report Share Posted November 29, 2020 Hallo, vor 11 Stunden schrieb gombolo: if (this.fMuenungsfeuerZeit < Time.time && this.bFeuer == false) Der Knackpunkt liegt in dieser if abfrage. Du vergleichst this.fMuenungsfeuerZeit mit Time.time, da Time.time die Zeit seit dem Spielstart zurück gibt und im Hintergrund weiter läuft hast du eine undefinierte Anzahl von aufrufen. Diese laufen so schnell ab das du einen Stottereffekt erhältst. Du musst eine Variable erstellen in der du Time.time aufaddierst und bei erreichen der gewollten zeit wieder auf Null setzt. z.b. privat float MySollwert = 0f; ....... ..... void Update() {.... MySollwert += Time.time; ..... ..... } if(Input.GetKey (KeyCode.Space)) { if (this.fMuenungsfeuerZeit < MYSollwert && this.bFeuer == false) { //Muendungsfeuer_rechts.SetActive(true); //Muendungsfeuer_links.SetActive(true); //Muendungsfeuer_rechts.renderer.enabled = true; //Muendungsfeuer_links.renderer.enabled = true; MySollwert =0f; this.bFeuer = true; } } Gruß Jog Quote Link to post Share on other sites
Thariel 98 Posted November 29, 2020 Report Share Posted November 29, 2020 Ich denke es ist nicht die Funktion SetActive(), die langsam ist, sondern es liegt eher am GameObject selbst. Wahrscheinlich gibt es da für Unity einfach "viel zu tun", um es ein/aus zu schalten. Wenn du es mit einem anderen oder leeren GameObject machst, wird es sicher sehr schnell sein. Hatte aber noch nie Performance Probleme beim ein und ausschalten. Ich denke das Problem liegt daran, dass da etwas nicht so elegant entwickelt hast. Edit: War zu langsam 🤪 Quote Link to post Share on other sites
malzbie 1,589 Posted November 29, 2020 Report Share Posted November 29, 2020 @Jog Das musst du mir mal erklären. Warum soll seine Art des Aufrufs langsamer sein, als die deine? Quote Link to post Share on other sites
Jog 27 Posted November 29, 2020 Report Share Posted November 29, 2020 vor 2 Stunden schrieb malzbie: @Jog Das musst du mir mal erklären. Warum soll seine Art des Aufrufs langsamer sein, als die deine? Hallo, @malzbie Sorry, dann habe ich mich unklar ausgedrückt. Meine Art soll nicht angeblich schneller sein , im gegen teil, ich habe bei this.fMuenungsfeuerZeit einen fix wert eingesetzt und mit if (this.fMuenungsfeuerZeit < Time.time && this.bFeuer == false) ausprobiert und hatte ca.50 mal so viele aufrufe in der gleichen Zeit (laut Profieler) als bei meiner Variante. Was die Ausführung zum Stottern gebracht hat.Mit meiner Variante war das Stottern verschwunden. Da ich den ganzen Code nicht kenne sollte das auch nur eine Vermutung von mir sein. Da ich vorher nur in C Programmiert habe kenne ich mich in C# nicht 100% aus. Ich habe das auch mal in C umgeschrieben und ausprobiert. Bei der Original Variante habe ich einen Stack Overflow hervorgerufen, bei meiner Variante nicht daher die Vermutung. Gruß Jog Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.