Jump to content
Unity Insider Forum

Denkfehler beim Ray


Kojote

Recommended Posts

Grüße!

Ich hab ein kleines Problem mit einem Ray, ich vermute es ist ein Denkfehler, aber ich komm einfach nicht bei meinem Problem weiter. Ausgangsbasis ist eine Bodenplattform, auf die sich der Charakter stellen kann. Wenn er dies gemacht hat, soll in Blickrichtung des Charakters ein Ray abgeschossen werden, um die Zielposition der Schwebeplattform zu ermitteln.

Dafür habe ich dieses Codestück:

if (charakter.transform.rotation == Quaternion.Euler(0, 180, 0)) {
            // Charakter schaut Negativ Z
            if (SchienenAchsentestZ() == true) {
                rayDirection = transform.forward * -1;
                rayCasting = true;

                zielPosition = new Vector3(rayAufschlag.x, 1, rayAufschlag.z -2);
                Debug.Log(rayAufschlag.x + " " + 1 + " " + (rayAufschlag.z - 2));

                aktionsVorbereitung = true;
            } else {
                charakter.gameObject.transform.parent = null;
                aktionswechslerCharakter = true;
            }
        }

Mit rayDirection lege ich fest in welche Richtung der Ray abgeschossen wird, dass funktioniert.

rayCasting ist ein Boolean der in der Fixed-Update Methode den Ray abschießt:

        // Ray
        if (rayCasting == true) {
            Physics.Raycast(transform.position, rayDirection, out hit);
            Debug.Log(hit.transform.gameObject.name);
            rayAufschlag = hit.transform.position;
            rayCasting = false;
        }

Der Ray trifft in die richtige Richtung und unter rayAufschlag wird der Vector3 des zu treffenden Objektes gespeichert, dass funktioniert auch. Er trifft das richtige Objekt und speichert auch den richtigen Vector3.

Nun zum Problemteil:

Vector3 zielPosition = new Vector3(rayAufschlag.x, 1, rayAufschlag.z -2);

Obwohl er mir ausgiebt, der Vector von rayAufschlag wäre "20, 1, -10" kommt nach dieser Vector3 Berechnung eine zielPosition von "0, 1, -2" zustande.

Wie kommt er darauf, habt ihr eine Idee?

Schon einmal Danke und Grüße von Kojote

Link zu diesem Kommentar
Auf anderen Seiten teilen

Erstmal ist das '== true' unnötig.. ^^

 

Was macht denn 'SchienenAchsentestZ()' ?

Kann es sein, dass er nur einmal in die 'if' rein geht? Dann setzt er 'rayCasting' auf 'true', aber der Raycast selbst wird noch nicht durchgeführt, weshalb 'rayAufschlag' noch (0, 0, 0) ist bzw. 'zielPosition' (0, 1, -2).

Danach wird der Raycast in FixedUpdate aufgerufen und 'rayAufschlag' gesetzt, aber die Zielposition wird nicht neu berechnet.

 

Warum ziehst du denn den Raycast in die FixedUpdate? Nur weil er über 'Physics' aufgerufen wird, müssen Raycasts nicht automatisch in die FixedUpdate. Das machen sie im Beispiel in der Dokumentation zumindest auch nicht so.. 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ich denke auch, deine Reihenfolge ist das Problem. Du setzt rayCasting auf true, setzt die zielPositions Werte und später berechnest du erst den Raycast. Ich würde deinen Raycast mit in die if schleife oder als extra Funktion/Vector3 return darin einbauen und dann zielPosition = RayCastFunction(); z.B. machen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Zitat

Was macht denn 'SchienenAchsentestZ()' ?

Es ist eine Methode die überprüft ob der Charakter in Richtung einer Schiene schaut, auf der sich der Charakter bzw. die Schwebeplattform bewegen kann. Ist noch nicht perfekt, da muss ich mir noch was besseres einfallen lassen, aber funktioniert.

Zitat

Warum ziehst du denn den Raycast in die FixedUpdate? Nur weil er über 'Physics' aufgerufen wird, müssen Raycasts nicht automatisch in die FixedUpdate. Das machen sie im Beispiel in der Dokumentation zumindest auch nicht so.. 

Das ging mir auch schon durch den Kopf, dass der Ray zu spät abgeschossen wird. Aber bisher dachte ich, er muss immer in der FixedUpdate sein. 😮

Laut dieser Dokumentation machen die das Ray immer in die Update und in die Fixed-Update Methode: https://docs.unity3d.com/ScriptReference/Physics.Raycast.html

Link zu diesem Kommentar
Auf anderen Seiten teilen

Hab noch mal ne Frage mit dem Ray. Der Ray soll aus globaler Sicht abgeschossen werden, nicht aus lokaler Sicht.

Ich habe dazu folgendes im Code. Dieser legt fest in welcher Richtung der der Ray abgeschossen wird. Der Ray sol dabei immer in die Richtung abgeschossen werden, in die der Charakter schaut.

// Charakter schaut Positiv Z
rayRichtung = transform.forward;

// Charakter schaut Negativ Z
rayRichtung = transform.forward * -1;

// Charakter schaut Positiv X     
rayRichtung = transform.right;

// Charakter schaut Negativ X
rayRichtung = transform.right * -1;

Laut Doku sollte sich das tranform.forward bzw. tranform.right doch an den Globalen Richtungsangaben richten?! Jedoch wenn ich das Objekt drehe kommen ganz andere Ergebnisse heraus.

Was mache ich denn falsch?

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 17 Stunden schrieb Kojote:

Laut Doku sollte sich das tranform.forward bzw. tranform.right doch an den Globalen Richtungsangaben richten?!

Nein, das wäre Vector3.forwardTransform.forward ist die lokale Vorwärtsrichtung des Objekts. Warum solltest du auch ein bestimmtes Objekt fragen, um die globale Z-Achse zu bekommen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...