2016-08-05 14 views
0

Ich versuche, Mausklick auf 2D-Sprite auf einer 3D-Szene zu erkennen.Physics2D.OverlapPoint() zurück immer Null

Alle meine Sprite haben einen Box Collider 2D (gut platziert) und ein Skript, aber hit ist null die ganze Zeit. Ich habe auch versucht, die Funktion Update() auf ein Skript auf GameEngine GameObject zu setzen, aber ich habe das gleiche Ergebnis.

 void Update() { 
    if (Input.GetMouseButtonDown(0)) { 
     Vector2 mouse_position = Camera.main.ScreenToWorldPoint (Input.mousePosition); 
     Collider2D hit = Physics2D.OverlapPoint (mouse_position); 

     if (hit) { 
      Debug.Log ("Hit" + hit.transform.name); 
     } else { 
      Debug.Log (hit); 
     } 
    } 
} 

void OnMouseDown() { 
    Debug.Log ("Hit " + this.name); 
} 

enter image description here

+1

ich empfehlen würde UnityEngine.EventSystems und Umsetzung der folgende diese Schnittstellen IPointerClickHandler IPointerDownHandler IPointerEnterHandler IPointerExitHandler IPointerUpHandler oder es ist grundlegendsten Ebene Eventtriggers mit https://unity3d.com/ lernen/tutorials/topics/user-interface-ui/ui-events-and-event-trigger – Rob

+0

Arthur - was du machst ist ** völlig falsch **, heh :) es ist viel einfacher. Abgesehen von allem anderen, ** sicher sein, dies zu lesen **: http://Stackoverflow.com/a/38311402/294884 – Fattie

+0

in der Tat Rob hat es vollständig für Sie schön erklärt unter – Fattie

Antwort

2

Keine Notwendigkeit zu tun, was Sie tun. Die neuen Canvas-UI-Systeme verfügen über ein hochentwickeltes Event-System.

Wenn Sie sich Ihre "Image" -Komponente ansehen, wird mit einem "Raycast Target" die Event-System-Handler für diese Komponente grundsätzlich ein- oder ausgeschaltet.

Sie können mit dem Namespace UnityEngine.EventSystems auf Klicks/Ziehungen und andere Ereignisse auf Canvas-Elementen achten.

Hier ist ein Beispiel für Sie:

using UnityEngine; 
using UnityEngine.EventSystems; 
class BuildingUI : Monobehaviour, IPointerDownHandler, IPointerUpHandler { 

    void OnPointerDown(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Down " + eventData.selectedObject.name); 
    } 

    void OnPointerUp(PointerEventData eventData) 
    { 
     Debug.Log("Pointer Up " + eventData.selectedObject.name); 
    } 
} 

Es gibt viele Schnittstellen, die Sie implementieren können, empfehle ich Ihnen die manuelle Prüfung.

+1

Ganz richtig. (PS Rob haben Sie nur einen Tippfehler "eingebaut".) – Fattie

+2

OP, wenn Sie versuchen, ziehen und ablegen. Hier ist ein *** wahnsinnig nützliches *** Kopieren und Einfügen-Skript. http://StackOverflow.com/a/37473953/294884 Noch vor ein paar Jahren konnten Studios 20.000 Dollar für Drag & Drop berechnen. Jetzt fügen Sie einfach das Skript ein. Rob, wenn Sie das nicht gesehen haben, ist es sehr praktisch – Fattie

+0

Sieht aus wie eine anständige Ressource. Ich habe die Pointer & Drag-Interfaces jetzt ein paar Mal implementiert. Sehr ähnlich der PointerEvents API für das Web. – Rob

0

Ich bin mir ziemlich sicher, dass die Ursache des Problems ist, dass Ihre „Building“ Objekte UI-Objekte sind, unter einer Leinwand zu sein. Es gibt eine Reihe von Dingen, zu denen dies führen könnte, aber was ich glaube, verursacht Ihr Problem ist das Problem der Welt und Bildschirm Platz.

Sie konvertieren die Mausposition von einem Bildschirmpunkt in den Weltbereich, wenn sich Ihre "Gebäude" -Objekte unter einer Zeichenfläche befinden, die scheinbar keinen Weltbereich für ihre Position verwendet. Um dies zu bestätigen, schlage ich vor, dass Sie eine Debug.Log für die ursprüngliche Mausposition, die konvertierte Mausposition und die tatsächliche Position Ihrer "Gebäude" -Objekte machen. Wenn Sie feststellen, dass die nicht konvertierte Mausposition mit Ihren Objektpositionen realistischer ausgerichtet ist, empfehle ich, die Konvertierung zu entfernen.

Möglicherweise müssen Sie zusätzliche Arbeit verrichten (z. B. etwas Mathe an der Maus oder Objektpositionen und/oder die Anker der Objekte ändern), damit es perfekt funktioniert, aber dies sollte Ihre Mausposition und Objekte ermöglichen Arbeiten mit den gleichen Einheiten in Bezug auf die Position.

+0

Verwenden Sie es funktioniert gut, wenn ich 'Input. mouseposition' als Attribut von 'Physics2D.OverlapPoint'. Es ist in Ordnung, wenn ich die Position der Bildschirmmaus verwende? Oder ist es besser, wenn ich etwas auf der Welt mache? (und wie?) – Arthur

+1

Die Art, wie Sie es ändern würden, würde Ihren Canvas von Screen Space in World Space oder etwas ähnliches ändern. Ich würde das aber nicht empfehlen. Wenn Sie möchten, dass Ihre Schaltflächen im selben Bereich bleiben, unabhängig davon, wohin sich Ihre Kamera während des Spiels bewegt, müssen sich diese im Bildschirmbereich und nicht im Weltbereich befinden. Darüber hinaus basiert die Benutzeroberfläche im Allgemeinen auf dem Bildschirmbereich und ist unabhängig vom Welt- raum. Aus diesem Grund ist es im Hinblick auf das Design besser, Bildschirmkoordinaten für den Umgang mit der Benutzeroberfläche zu verwenden. – Brien