Jump to content
Unity Insider Forum

Raycast von Camera auf Mausposition


Singular

Recommended Posts

Hallo zusammen,

ich möchte mit der Maus auf ein Objekt klicken können und das ganze über Raycasts lösen. Heißt ich erstelle einen Raycast von der Cameraposition aus in Richtung des Mauszeigers. Soweit und einfach der Gedankengang.

Problem ist allerdings, wenn ich das ganze über Input.mousePosition laufen lasse, kommt es nur auf die Position des Mauszeigers im Fenster an und nicht auf welches Objekt ich tatsächlich geklickt habe. Wie kann ich die Richtung in der Spielwelt nehmen und nicht die auf dem Canvas?

            RaycastHit hit;

            if (Physics.Raycast(transform.position, Input.mousePosition, out hit))
            {
                Debug.Log("getroffen");
            }

Mehr Code gibt es noch nicht :D.
Das ich auf den Canvas ziele weiß ich dadurch, dass ich ein Objekt mal einfach der Mausposition habe folgen lassen.

Danke im Voraus.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin!

Raycast will einen Richtungsvektor haben, aber Input.mousePosition ist die Position des Mauszeigers auf dem Bildschirm... in Pixeln. Das passt so gar nicht zusammen.

Was du brauchst, ist eine Funktion, die dir die Mausposition in einen Kamera-Richtungsvektor umrechnet. Und die heißt Camera.ScreenPointToRay. Da kriegst du nicht nur den Richtungsvektor, sondern direkt den ganzen Ray in die Hand.

Insgesamt sieht das so aus:

var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

if (Physics.Raycast(ray, out var hit))
{
  Debug.Log("getroffen");
}

Ich hab die Deklaration der hit-Variable auch direkt in den Methodenaufruf gezogen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja so halb... ich habe vergessen, dass ich mich zwar in einer 3D Umgebung befinde aber einen 2D Collider anvisieren möchte...

        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = cam.ScreenPointToRay(Input.mousePosition);

            RaycastHit2D hit = Physics2D.Raycast(transform.position, ray.direction);

            if (hit.collider != null)
            {
                Debug.Log(hit.collider);
            }
        }

Das Problem ist, dass meine Mausposition scheinbar auf der selben stelle bleibt auch wenn ich die Kamera bewege. Dadurch muss ich die Kamera an die Richtige position bewegen, damit ich das gewünschte objekt anklicken kann...

Link zu diesem Kommentar
Auf anderen Seiten teilen

Physics2D.Raycast ist ein 2D-Raycast. Es ist nicht einfach ein 3D-Raycast, der Collider2D treffen kann. Es ist ein Strahl, der innerhalb der 2D-Physik-Ebene etwas treffen kann.

Wenn du eine perspektivische Kamera hast und dann damit schauen willst, wo auf einer imaginären Ebene du bist, dann kannst du dafür den Plane.Raycast nehmen. Damit findest du dann den Punkt auf der 2D-Physik-Ebene und kannst mit Physics2D.OverlapPoint schauen, ob da ein Collider2D an diesem Punkt ist.

if (Input.GetMouseButtonDown(0))
{
  var ray = cam.ScreenPointToRay(Input.mousePosition);
  
  var physicsPlane = new Plane(Vector3.forward, Vector3.zero);
  if (physicsPlane.Raycast(ray, out var distance))
  {
    var hitPoint = ray.GetPoint(distance);
    
    var collider = Physics2D.OverlapPoint(hitPoint);
    if (collider)
    {
      Debug.Log(collider);
    }
  }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Moin,

Ist es nicht einfacher gleich das GO mit einer OnMouse Funktion aufzurufen ?

using UnityEngine;

[RequireComponent (typeof(Collider2D))]
[RequireComponent (typeof(SpriteRenderer))]
public class MouseOverTest : MonoBehaviour
{
    SpriteRenderer renderer;
    void Start()
    {
        renderer = GetComponent<SpriteRenderer> ();
    }

    private void OnMouseOver()
    {
        renderer.color = Color.red;
    }

    private void OnMouseExit()
    {
        renderer.color = Color.white;
    }
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Ja, das ist simplerer Code. Aber es ist nicht immer das, was man braucht. Manchmal bedeutet dieser Ansatz, dass man das eine oder andere Script, das dieses Muster implementiert, auf Dutzende oder gar hunderte Objekte packen muss. Manchmal können sich auch Collider überlappen, und man will das auch erfassen. Und manchmal kennt einfach ein zentrales Raycast-Script ein Objekt (z.B. die Spielfigur), das mit dem angeklickten Objekt arbeiten soll. Baut man das mit OnMouseOver, muss man sich direkt Gedanken machen, wie das Click-Script dieses Objekt kennenlernen soll.

Für manche Fälle ist ein Script wie deins absolut passend. Aber in nicht wenigen Fällen ist die obere Variante besser.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...