Kojote Geschrieben 27. September 2017 Melden Share Geschrieben 27. September 2017 Grüße! Wie ich mit bekommen habe funktioniert mein Script nicht: if (Physics.Raycast(koordinate1, koordinate2, out hit)) { if (hit.collider.tag == "Verbindungsstueck") { // Abbruch, hier kreuzen sich Verbindungsstücke koordinate1Gesetzt = false; koordinate2Gesetzt = false; raycastUeberpruefung = false; } else { // Es kreuzen sich keine Verbindungsstücke, weiter mit der Erzeugung eines Verbindungsstückes VerbindungsstueckErzeugen(); raycastUeberpruefung = false; } } So lange koordinate1 kleiner als koordinate2 ist, funktioniert das Raycast. Ist aber koordinate1 größer als koordinate2, funktioniert das Raycast nicht mehr. Ich könnte nun noch ein zweites Raycast herein nehmen und 1 und 2 tauschen. Doch das Problem geht ja schon weiter, wenn ich im Koordinatensystem in den negativen Bereich komme. Kann mir mal einer sagen wie ich das Problem lösen kann? ^^" Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 27. September 2017 Melden Share Geschrieben 27. September 2017 Sehe ich das richtig, dass du versuchst, einen Strahl von 1 nach 2 zu schießen? Der zweite Vektor bei Raycast ist nicht das Ziel, sondern die Richtung. Wenn du bei einem Raycast ein Ziel angeben willst, musst du folgendes tun: var direction = target - start; Physics.Raycast(start, direction, out hit, direction.magnitude) Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
N00MKRAD Geschrieben 5. Oktober 2017 Melden Share Geschrieben 5. Oktober 2017 Am 27.9.2017 um 19:39 schrieb Sascha: Sehe ich das richtig, dass du versuchst, einen Strahl von 1 nach 2 zu schießen? Der zweite Vektor bei Raycast ist nicht das Ziel, sondern die Richtung. Wenn du bei einem Raycast ein Ziel angeben willst, musst du folgendes tun: var direction = target - start; Physics.Raycast(start, direction, out hit, direction.magnitude) Oder Linecast benutzen. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 5. Oktober 2017 Melden Share Geschrieben 5. Oktober 2017 Oh man, das Ding vergesse ich immer. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 5. Oktober 2017 Melden Share Geschrieben 5. Oktober 2017 Der macht im Hintergrund auch nix anderes, aber leichter zu "bedienen" public static bool Linecast(Vector3 start, Vector3 end, out RaycastHit hitInfo, [DefaultValue("DefaultRaycastLayers")] int layerMask, [DefaultValue("QueryTriggerInteraction.UseGlobal")] QueryTriggerInteraction queryTriggerInteraction) { Vector3 direction = end - start; return Physics.Raycast(start, direction, out hitInfo, direction.magnitude, layerMask, queryTriggerInteraction); } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 10. Oktober 2017 Autor Melden Share Geschrieben 10. Oktober 2017 Ich habe noch einmal eine Frage zum Ray. Ist ja eine Interessate und nützliche funktion, die ich gern weiter ausreizen würde. Ich habe ja meine Spielsteine, die nebeneinander angeordnet sind. Ich möchte nun wissen, wann der Spieler keinen Zug mehr übrig hat und auf kein weiteres Feld mehr klicken kann. Dazu wollte ich gern Raycasting benutzen. Ist es möglich mit Raycasting im Umkreis abzufragen, ob es noch ein Feld gibt, auf das der Spieler klicken kann? EDIT: Ich hab mir nun mal folgendes überlegt, leider bekomm ich jedoch einen Fehler beim hit: if (moegoechkeitspruefung == true) { int moeglicheVerbindungen = 0; for (int i = 0; i < hexagonFeld.Length; i++) { if (Vector3.Distance(hexagonFeld[i].koordinate, hexagonFeld[aktivesHexagon2].koordinate) < hexagonMaximalAbstand) { Vector3 direction = aktivesHexagon2Koordinate - hexagonFeld[i].koordinate; Physics.Raycast(aktivesHexagon1Koordinate, direction, out hit, Vector3.Distance(hexagonFeld[i].koordinate, aktivesHexagon2Koordinate)); if (hit.collider.CompareTag("Verbindungsstueck")) { // Verbindung nicht möglich } else { // Verbindung möglich moeglicheVerbindungen++; } } } if(moeglicheVerbindungen == 0) { // Der Spieler kann keinen Zug mehr machen, Spielende! pause = true; heySpielemenueSteuerung.SpielVerloren(); } else { moegoechkeitspruefung = false; Koordinatenwechsler(); } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 11. Oktober 2017 Autor Melden Share Geschrieben 11. Oktober 2017 Wollte noch einmal nachharken, hat einer hier eine Lösung, versteh das Problem einfach nicht, genau das selbe Raycasting mit dem selben Tag nutze ich an einer anderen Stelle und da gibt es kein Problem. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 11. Oktober 2017 Melden Share Geschrieben 11. Oktober 2017 Du musst hier wieder prüfen, ob der Ray überhaupt was getroffen hat: bool hitSomething = Physics.Raycast(aktivesHexagon1Koordinate, direction, out hit, Vector3.Distance(hexagonFeld[i].koordinate, aktivesHexagon2Koordinate)); if (hitSomething) { if (hit.collider.CompareTag("Verbindungsstueck")) { // Verbindung nicht möglich } else { // Verbindung möglich moeglicheVerbindungen++; } } Ich kann nicht genau beurteilen, ob deine Schleife korrekt ist. vermute aber, du musst die Richtung des Rays umdrehen: //Vector3 direction = aktivesHexagon2Koordinate - hexagonFeld[i].koordinate; Vector3 direction = hexagonFeld[i].koordinate - aktivesHexagon2Koordinate; Wegen Abfragen im "Kreis". Wenn du 3D-Collider verwendest kannst du:https://docs.unity3d.com/ScriptReference/Physics.SphereCast.html benutzen, wenn du 2D-Collider in der Szene hast, dann kann funktioniert:https://docs.unity3d.com/ScriptReference/Physics2D.CircleCast.html Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 11. Oktober 2017 Autor Melden Share Geschrieben 11. Oktober 2017 Kurz um, meine Schleife geht das Array mit den Feldern durch und überprüft ob eines in Reichweite ist, also eines was der Spieler als nächstes anklicken kann. for (int i = 0; i < hexagonFeld.Length; i++) { if (Vector3.Distance(hexagonFeld[i].koordinate, aktivesHexagon2Koordinate) < hexagonMaximalAbstand) {} } Wenn Ja, wird eine direction gemacht, so wie du mir das zeigtest: Vector3 direction = aktivesHexagon2Koordinate - hexagonFeld[i].koordinate; Dann kommt der Raycast: Physics.Raycast(aktivesHexagon2Koordinate, direction, out hit, Vector3.Distance(hexagonFeld[i].koordinate, aktivesHexagon2Koordinate)); Und dann kommt doch die Abfrage, ob er was trifft: if (hit.collider.CompareTag("Verbindungsstueck")) { // Verbindung nicht möglich } else { // Verbindung möglich moeglicheVerbindungen++; } Ich überprüfe ja, ob er etwas trifft. Trifft er ein Verbindungsstueck, ist keine Verbindung möglich, wenn ja, wird der Interger hoch gezählt. Wenn dieser 0 ist, ist keine Verbindung mehr möglich, Spiel aus, ansonsten fortsetzen. Damit frage ich doch ab oder muss er immer einen Tag treffen? Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Zer0Cool Geschrieben 11. Oktober 2017 Melden Share Geschrieben 11. Oktober 2017 Lies dir oben meinen Quellcode noch einmal genau durch (Ich habe deinen Quellcode an 2 Stellen korrigiert). Und nein, du hast bei deinem alten Code nicht! geprüft, ob der Raycast etwas trifft. Du überprüfst nur, welchen Tag der getroffene Collider besitzt.Nochmal kurz zur Erklärung: - Physics.Raycast schickt einen Ray in die Szene und gibt über ein bool zurück, ob es einen Collider getroffen hat. - hat es einen Collider in der Szene getroffen, dann wird die Variable hit gesetzt. - hat es keinen Collider getroffen, dann wird die Variable hit nicht gesetzt! In diesem Fall ist "hit" nach den Raycast "null" und wenn du versuchst "hit" zu verwenden, dann bekommst du einen Fehler in Unity. - du kannst den Tag des Colliders also nur überprüfen, wenn überhaupt ein Collider getroffen wurde Um das zu verhindern, wird der Rückgabewert von Physics.Raycast abgefragt: bool hitSomething = Physics.Raycast(aktivesHexagon1Koordinate, direction, out hit, Vector3.Distance(hexagonFeld[i].koordinate, aktivesHexagon2Koordinate)); // hitSomething == true => es wurde ein Collider in der Szene getroffen! hit wird mit "RaycastHit" befüllt. // hitSomething == false => es wurde kein Collider in der Szene getroffen! hit ist in dem Fall "null". Ich hoffe, es nun wurde es verständlicher . Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 11. Oktober 2017 Autor Melden Share Geschrieben 11. Oktober 2017 Ach so, jetzt versteh ich es. Ich dachte hit wird auf jeden Fall zurück gegeben - das war mein Denkfehler! Ich probiere es gleich noch mal aus. vor einer Stunde schrieb Zer0Cool: Ich kann nicht genau beurteilen, ob deine Schleife korrekt ist. vermute aber, du musst die Richtung des Rays umdrehen: //Vector3 direction = aktivesHexagon2Koordinate - hexagonFeld[i].koordinate; Vector3 direction = hexagonFeld[i].koordinate - aktivesHexagon2Koordinate; 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.