Gadakar86 Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Hallo liebe gemeinde. Ich habe ein Script geschrieben, was nicht funktioniert, und möchte mal wissen wieso. Folgendes: Habe 5 Quader, alle mit einem Tag erstellt, und zwar Quader1, Quader2, usw (Und auch demensptrechend so genannt) Wenn diese 5 Quader sich alle in einer Schlucht befinden, soll wengisten erstmal in der Konsole was erscheinen. Aber da tut sich jar nix. Für die Schlucht hab ich nen neues Gameobjekt erstellt, vergrößert, box collider hinzgefügt und is trigger aktiviert. Und das script natürlich an das Gamebojekt gemacht. Hier mein Script: using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class NeuesLevel1 : MonoBehaviour { void OnTriggerEnter2D(Collider2D other2) { if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5") { Debug.Log ("Nächstes Level"); } else Debug.Log ("Es funktioniert nicht"); } } Hat jemand nen Tipp für mich? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 == führt einen Vergleich durch. + zwischen zwei Strings konkateniert die Strings, schreibt sie also hintereinander. if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5") ist also gleichbedeutend mit if (other2.tag == "Quader1Quader2Quader3Quader4Quader5") Leider lässt sich das nicht mal eben innerhalb dieser einen Zeile fixen, weil OnTriggerEnter(2D) nur einmal aufgerufen wird, wenn ein neues Objekt den Trigger berührt. Dieses Objekt wird als Parameter übergeben (heißt bei dir "other2"). Welche Objekte sonst noch in deinem Trigger sind, ist OnTriggerEnter(2D) gänzlich egal. Du versuchst daher abzufragen, ob das eine neue Objekt alle fünf Tags hat, was natürlich nicht geht. Was du ja aber wirklich wissen willst ist, ob alle fünf Tags über Objekte im Trigger vertreten sind. Dafür musst du ein bisschen was dazu bauen. Erstmal die Frage: Brauchst du überhaupt fünf Tags? Ich lass die Sache mit "niemals überhaupt Tags benutzen" erstmal in der Kiste, aber ich vermute einfach mal, dass du immer nur ein Objekt pro Tag hast. Dass die fünf Objekte unterschiedliche Tags haben, benutzt du hier ja gar nicht, da du einfach nur schaust, ob alle fünf da sind. Du könntest dann einfach einen Tag "Quader" haben und schauen, ob (alle) fünf Objekte mit diesem Tag im Trigger sind. Um das zu machen, gibt es mehrere Möglichkeiten. Ich denke, eine einfach nachzuvollziehende ist ein Zähler. Dafür brauchst du eine int-Variable, die hochzählt, wenn ein "Quader"-Objekt den Trigger betritt, und wieder herunterzählt, wenn einer davon der Trigger wieder verlässt. Ist der Zähler bei 5 angekommen, wissen wir, dass alle 5 Objekte im Trigger sind. Das würde dann so aussehen: private int objectsInTrigger = 0; private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Quader")) { // Erhöhe um eins objectsInTrigger++; // Schaue ob es fünf sind if (objectsInTrigger == 5) { Debug.Log("Nächstes Level"); } } } private void OnTriggerExit2D(Collider2D other) { if (other.CompareTag("Quader")) { // Senke um eins objectsInTrigger--; } } Das kann man dann noch aufhübschen, z.B. indem man die 5 nicht hardcoded, sondern als Variable einfügt, die man im Editor setzen kann. Dann kannst du jedes Mal, wenn du dieses Script auf ein GameObject tust, eingeben, wie viele Quader benötigt werden. So kannst du mit demselben Script, ohne den Code abändern zu müssen, mehrere Level bauen, in denen verschieden viele Quader gebraucht werden. Sonst noch so: CompareTag ist besser als == "meinTag", da es dir eine Fehlermeldung wirft, wenn der Tag gar nicht existiert, z.B. weil du dich vertippt hast. Auch mit CompareTag sind Tags immer eine potentielle Fehlerquelle. Ich empfehle dringend, auf lange Sicht Tags komplett sein zu lassen. Wenn du mal Lust hast, kann ich erzählen, wieso... aber im Moment führt's einfach zu weit. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 Danke dir. Ich werds mal versuchen. Auch wenn ich die letzten Zeieln ehrlich gesagt nicht verstanden habe. Aber bin ja auch ein totaler Noob ^^ Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Da fehlen doch die Klammern? using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class NeuesLevel1 : MonoBehaviour { void OnTriggerEnter2D(Collider2D other2) { if (other2.tag == "Quader1" + "Quader2" + "Quader3" + "Quader4" + "Quader5") { Debug.Log ("Nächstes Level"); } else { Debug.Log ("Es funktioniert nicht"); } } } Ausserdem würde ich nicht für jeden Quader ein Tag machen, sondern einfach einen Tag und eine int Variable hochzählen lassen. Irgendwie so: using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class NeuesLevel1 : MonoBehaviour { private int _count; public int maxQuads = 5; void OnTriggerEnter2D(Collider2D other2) { if (other2.tag == "Quader") { _count++; } if(_count >= maxQuads) { Debug.Log ("Nächstes Level"); } else { Debug.Log ("BlaBla"); } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Wenn du eine Erklärung zu irgendetwas brauchst, frag einfach Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 @Saschada warst du wohl schneller😅 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 beide von euch genannten Scripte funktionieren leider nicht. Schade -,- Das untere fügt er zwar ohne Probleme ein, aber wenn alle Quads in der Schlucht sind kommt nix in der Konsole. Das erstgenannte von Sascha zeigt er Fehler an. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Uff. Wenn du Hilfe im Internet kriegst, nicht einfach den Code blind übernehmen. Verstehe, was er tut, und setze ihn in deinem Projekt um. Wenn du eine Fehlermeldung hast, dann kannst du nur Hilfe kriegen, wenn du die Fehlermeldung auch postest. Sonst müssen wir raten, und das ist albern. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 vor 5 Minuten schrieb Gadakar86: aber wenn alle Quads in der Schlucht sind kommt nix in der Konsole Hast du die Tags der Quader auch auf "Quader" geändert? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 Jomnitech ja hab ich Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 @Gadakar86 Ich nehme stark an, dass du einfach den Code 1:1 in eine Scriptdatei kopiert hast. Wenn das der Fall ist: Da gehört natürlich noch die Klassendefinition dazu, die ich weglasse, weil sie für das, was ich schreiben will, irrelevant ist. using UnityEngine; public class WieAuchImmerDeinScriptHeisst : MonoBehaviour { // DER CODE } @Jomnitech Bei dir sind die Felddeklarationen außerhalb der Klasse, und OnTriggerExit2D fehlt. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 Ich versuche ja die Codes zu verstehen, jedoch hab ich weder Studium noch Arbeitserfahrungen mit Coding... als Laie ist das durchaus viel schwerer. Der Fehlercode ist das: "Cant add script component "Schlucht" because the script class cannot be found. Make sure that there are no compile errors and the file name and class name match. Mich wunderst dass es da keine Klasse in deinem Sript gibt, Sascha? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Siehe mein Post von gerade eben Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Jomnitech Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 vor 5 Minuten schrieb Sascha: Bei dir sind die Felddeklarationen außerhalb der Klasse, und OnTriggerExit2D fehlt. Ups, danke. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 Das funktioniert immer noch nicht ich krieg die Krise. Keine Kritik jetzt an dich, sondern jetzt hab ich alles gemacht und geht trotzdem nicht: using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; public class Schlucht : MonoBehaviour { private int objectsInTrigger = 0; private void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Quader")) { // Erhöhe um eins objectsInTrigger++; // Schaue ob es fünf sind if (objectsInTrigger == 5) { Debug.Log("Nächstes Level"); } } } private void OnTriggerExit2D(Collider2D other) { if (other.CompareTag("Quader")) { // Senke um eins objectsInTrigger--; } } } Wieder die gleiche Fehlermeldung - warum? Der Klassenname stimmt doch mit dem Scriptnamen überein. Oder muss ich noch die Quader alle vom Namen, nicht vom Tag her, in Quader umbennen? Das würde ja nicht gehen, weil zwei Objekte können nicht den exakt gleichen Namen haben. Oder? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Sicher, die Datei heißt "Schlucht" (bzw. "Schlucht.cs")? Hast du evtl. noch andere Fehlermeldungen? Doppelklick auf die Fehlermeldung ganz unten öffnet die Konsole mit allen Meldungen. Was manchmal noch passieren kann ist, dass man versehentlich eine zweite Scriptdatei anlegt - z.B. durch Verschieben/Umbenennen des Scripts, und dann drückt man aber "Speichern" im Script-/Text-Editor. Plötzlich hat man zwei Scripts, und eins davon produziert den Fehler, obwohl man am anderen arbeitet. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Gadakar86 Geschrieben 27. Mai 2019 Autor Melden Share Geschrieben 27. Mai 2019 jetzt geht es. musste die alten scripte löschen, also punkt 3 von dir. Danke dir für dein Geduld und Hilfe Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. Mai 2019 Melden Share Geschrieben 27. Mai 2019 Top! Am wichtigsten ist aber, dass du auch vollständig verstehst, was da passiert. Frag also gerne nach, wenn etwas unklar ist. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.