Jump to content
Unity Insider Forum

Raycast Objekt erkennen


Pasies

Recommended Posts

Abend,

ich bin ein Neuling in Unity und wollte erst mal die Basics kennen lernen. Allerdings komme ich hier auch nicht weiter, denn ich versuche, mit Hilfe eines Rays, Objekte zu erkennen allerdings klappt es nicht. Ich habe folgenden Code: 

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);

            Physics.Raycast(ray, out hit, 100.0f);
            
                if (hit.transform != null)
                {
                    Debug.Log(hit.transform.gameObject.name);
                }
            
        }
    }

Das Spiel ist in 2D, und alle Objekte haben auch einen Collider. Das Script habe ich der Main Camera hinzugefügt. Wenn ich nun auf die Objekte klicke, in meinem Fall nur Vierecke, passiert in der Console nichts. Wo liegt mein Fehler, oder hab ich noch was notwendiges vergessen?#

Liebe Grüße

Link zu diesem Kommentar
Auf anderen Seiten teilen

Jau - Wenn du 2D-Physik benutzt, musst du überall 2D dranhängen haben, oder es ist nicht mit dem Rest kompatibel:

  • Collider2D (BoxCollider2D, CircleCollider2D, usw.)
  • Rigidbody2D
  • Physics2D (Physics2D.Raycast, usw.)
  • OnCollisionEnter2D, OnCollisionExit2D, OnCollisionStay2D
  • OnTriggerEnter2D, OnTriggerExit2D, OnTriggerStay2D
Link zu diesem Kommentar
Auf anderen Seiten teilen

public class ObjectDetecter : MonoBehaviour
{
    // Update is called once per frame
    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            RaycastHit2D hit = Physics2D.Raycast(Input.mousePosition, Vector2.up);

            if (hit.transform != null)
            {
                Debug.Log(hit.transform.gameObject.name);
            }

        }
    }
}

Hab es jetzt mit den 2D Methoden versucht, allerdings funktioniert es trotz dessen nicht. Woran kann es liegen?

Link zu diesem Kommentar
Auf anderen Seiten teilen

"Funktioniert nicht" heißt in diesem Fall, dass in der Konsole nichts auftaucht? Der Code sieht soweit nämlich absolut in Ordnung aus.

  • Die Collider, die du zu treffen versuchst, sind auch alles Collider2D?
  • Du hältst den Mauszeiger unter einen Collider und klickst dann?
  • Du hast die Konsole offen und filterst Logs nicht heraus?
Link zu diesem Kommentar
Auf anderen Seiten teilen

Genau, in der Konsole taucht nichts auf. Ich benutze den Box Collider 2D, die Logs werden nicht gefiltert, und ja der Mauszeiger steht über einen Collider. Die Objekte werden mittels eines Scripts erstellt, für den ich einen Prefab habe, in dem Fall der Viereck. Muss ich vlt. hier noch etwas beachten? Im Anhang noch paar Bilder

1.png

2.png

3.png

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 35 Minuten schrieb Pasies:

über einen Collider.

Deswegen hatte ich gefragt:

vor 2 Stunden schrieb Sascha:

Du hältst den Mauszeiger unter einen Collider und klickst dann?

Dein Raycast geht nach oben, die Maus müsste also unterhalb einer Box sein. Sonst trifft der Ray nicht.

Aber naja.. mir ist jetzt erst der Fehler aufgefallen; ist doch im Code. Voll übersehen...

Deine Objekte sind ja so 1x1m groß. Input.mousePosition ist in Pixeln. Wenn du in der Mitte eines, sagen wir, 1080x1920-Games deinen Mauszeiger hast, dann ist Input.mousePosition entsprechend (540, 960). Deine Boxen sind aber alle so bei (1, 1), (2, 1) und so weiter. Davon abgesehen ist der Wert von Input.mousePosition unabhängig davon, was die Kamera gerade so treibt. Was du tun willst ist, Input.mousePosition in Camera.ScreenToWorldPoint zu schmeißen. Das rechnet dir deine Maus-Position auf dem Bildschirm in eine passende Position in der Welt um, je nachdem, was für einen Bildausschnitt die Kamera gerade so von der Welt rendert.

var worldPoint = Camera.ScreenToWorldPoint(Input.mousePosition);
Physics2D.Raycast(worldPoint, ...);

Ich vermute zudem, dass du gar nicht wirklich nach oben weg raycasten willst, sondern wissen willst, über welchem Objekt die Maus ist, richtig? Dann nimm mal lieber Physics2D.OverlapPoint.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ah, das mit über & unter einem Collider hab ich so gar nicht wahrgenommen :D Aber jetzt klappt es & habe einiges dazu gelernt. Noch eine Frage: Gibt es einen Grund weshalb ich Physics2D.OverlapPoint benutzen sollte, außer dass ich nur wissen will, dass unter der Maus ein Objekt ist? Da bekomme ich nämlich eine NullReferenceException, wenn ich keinen Collider treffe, im Gegensatz zum Raycast. Weiß jetzt nicht ob es später zu Problemen führen kann.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Beim 2D-Raycast schießt du halt einen Strahl entlang des Bildschirms. Du testest also mehr Pixel als nur den, wo die Maus drüber ist. Du kannst also je nach Richtung neben einen Collider klicken, und er wird trotzdem erkannt. OverlapPoint ist halt genau dafür da, nur das eine Pixel zu testen und sonst nichts.

Deine NullReferenceException kommt daher, dass du den Code ändern musst, da OverlapPoint etwas anderes zurück gibt als Raycast. Raycast gibt dir einen RaycastHit2D zurück, der mehr Infos enthält als die, welcher Collider getroffen wurde. So etwas wie "wie weit der Strahl dafür wandern musste", wo auf dem Collider der Strahl getroffen hat oder sogar, welchen Winkel zur Oberfläche der Strahl beim auftreffen hat. Das brauchst du hier alles nicht, und OverlapPoint gibt das auch alles nicht zurück... ergibt ja auch gar keinen Sinn, da es keinen Strahl gibt. Entsprechend gibt OverlapPoint einfach nur den getroffenen Collider zurück, oder null, wenn nichts getroffen wurde. Du musst also deinen Check von

if (hit.transform != null)

zu

if (hit != null)

bzw, in Unity wäre das dasselbe,

if (hit)

ändern. Wobei ich natürlich "hit" umbenennen wollen würde, weil's ja kein hit mehr ist, sondern ggf. ein Collider.

Bei hit.transform versucht Unity, dir die Transform-Komponente des getroffenen Colliders zu geben. Wenn es aber gar keinen getroffenen Collider gibt, fängt Unity aber an zu weinen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...