Jump to content
Unity Insider Forum

Raycast Koordinatenproblem


Kojote

Recommended Posts

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

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

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

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

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

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

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

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

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

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...