Frage von BENNIBOZz3352, 50

Wie in unity lebens energie bei collision abziehen?

Ich bin dabei ein spiel zu entwickeln,wenn man dort ein objekt berührt wird das objekt zerstört und man selbst bekommt lebensenergie abgezogen wenn die lebensenergie= 0 ist, ist man futsch usw. Das ist alles schön und gut und hat auch funktioniert bis mir heute mittag der pc beim programmieren abgestürzt ist,jetzt frisst er aus irgendeinem Grund exakt das gleiche script nichtmehr,sondern zieht dann bei jeder collision (obwohl ich lebensenergie-=1 geschrieben habe) zufällig viel energie ab...woran kann das liegen????(ich musste als mein pc abgestürzt war das projekt zum teil nochmal neu bauen,da einige teile verloren gegangen waren,daher kann ich nicht garantieren,dass ich es exakt nachgebaut habe,die scripts sind jedoch sicher alle gleich)als methode (ohne das alles außenrum)sieht so aus:void OnTriggerEnter(){if (gameObject.tag=="Player"){lifepoints=lifepoints-1}} Die restlichen methoden usw funzen alle ,also die objekte werden zerstört,wenn ich dagegenlaufe nur-wie bereits erwähnt spinnt die lebensenergie,kann es daran liegen,dass in jedem frame in dem ontriggerenter an ist(also wenn ich z.b. in einem objekt stehe oder so) 1 lebenspunkt abgezogen wird?oder woran liegt es?vielen dank für eure antworten:)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von dosenbiiir, 21

Tu mir bitte einen gefallen ;) Benutze Absätze, dann ist es deutlich einfacher zu lesen, ebenso benutze für den Code die Code Funktion ;) Danke^

Zu deiner Frage. Der Code-Auschnitt kann für den Fehler nicht verantwortlich sein.
OnTriggerEnter() wird nur einmalig aufgerufen, wenn der Collider in einen anderen Collider eintritt.
Hingegen die OnTriggerStay() dann jeden Frame immer wieder aufgerufen wird.
Ebenso ziehst du definitv nur einmalig "-1" von deiner Variable ab, da kann das Problem auch nicht liegen.
Ich denke du hast beim Bauen der Scene einen Fehler gemacht. So könnte es z.B. sein, dass dein Objekt 2 Collider hat und die OnTriggerEnter mehrmals aufgerufen wird.

EDIT: Ich habe gerade gesehen, dass du gar nicht den Tag von dem berührtem Objekt abfragst, sondern den Tag deinem gameObject abfragst, worauf das Script liegt. Sofern du "gameObject" nicht anderweitig zugewiesen hast, was du aber nicht tun solltest, da der Name "gameObject" bereits von Unity verwendet wird.

Du musst deiner OnTriggerEnter Methode einen Parameter übergeben. Du kannst den Collider der Berührt wurde übergeben:

void OnTriggerEnter(Collider hit)
{
if(hit.tag == "Player"
{
//Do something
}
}

Und sonst kannst du mit "Debug.Log(); in der Console etwas ausgeben. Das hilft bei der Fehleranalyse z.B.

Debug.Log(hit.transform.name); 

Jetzt wird dir jedes mal, wenn die OnTriggerEnter aufgerufen wird, der Name des anderen Objektes angezeigt.

LG Dosenbiiir ;)

Antwort
von J0T4T4, 17

Mmmh. OnTriggerEnter() wird, wie schon der Name sagt, nur beim Eintreten aufgerufen. Ein mehrfaches Aufrufen ist also unwahrscheinlich, erst recht, wenn das Objekt sofort zerstört wird.

Leider weiß ich zu wenig, daher kann ich dir nur empfehlen:

Bau doch in OnTriggerEnter() eine debug-Ausgabe ein, die jedes mal stattfindet, wenn die Funktion aufgerufen und Leben abgezogen wird.

Meiner Meinung nach liegt bei solchen Problemen oft der Fehler im Editor - entweder hast du mehrere Objekte ineinander, mehrere haben den Tag "Player" - auf einen kleinen aber gemeinen Fehler dieser Art läuft es oft bei solchen Problemen hinaus.

Also viel Erfolg beim Suchen! ;)

Keine passende Antwort gefunden?

Fragen Sie die Community