2016-12-11 1 views
1

Die neuen DayDream-Beispiele von Google verwenden das Ereignissystem, um festzustellen, ob sich der Mauszeiger auf einem Objekt befindet. Früher war es durchaus nicht so arbeitet, war es ein Absehen, und Sie würden dann eine Raycast zwischen der Kamera und dem Absehen, wie erstellen:DayDream, Erkennungszeiger ohne Verwendung des Ereignissystems

Vector3 rayDirection = GvrController.Orientation * Vector3.forward; 
if (Physics.Raycast(origin, rayDirection, out hitInfo, Mathf.Infinity)) { 

Und dann, wenn Sie erkennen, ein bestimmtes Objekt ist zwischen dem Absehen und der Kamera.

Dieser Weg funktioniert nicht mehr genau. Google verwendet nun das Ereignissystem und prüft dann, ob das Fadenkreuz auf einem Objekt positioniert ist. Gibt es eine Möglichkeit für mich, das für jedes Objekt zu überprüfen, ohne das Event System zu benutzen. Das Ereignissystem ist eine gute Methode, ich habe nur ungefähr 40 verschiedene Objekte, die alle auf die gleiche Weise arbeiten, und die Implementierung eines Ereignispunktes/Klick für diese 40 verschiedenen Objekte scheint wie ein Overkill zu sein, wenn ich vorher einfach einen prüfen konnte Objekt für Tag.

Jeder konnte durch Zufall feststellen, ob der Zeiger auf einem Objekt positioniert ist, ohne das Event-System zu verwenden. Raycasts scheinen nicht mehr richtig zu funktionieren, da der Mauszeiger mehr wie ein 2D-Objekt aussieht, genau wie eine Maus.

Dies funktioniert etwa, aber nicht sehr gut:

Vector3 origin = Head.transform.position + GvrController.ArmModel.wristPosition; 
Vector3 rayDirection = GvrController.ArmModel.pointerRotation * Vector3.forward; 

Jede Hilfe würde geschätzt :)

+0

Bisher habe ich versucht, aufgegeben, und ein Ereignis ausgelöst wird, um meine 46 Objekte :(hinzufügen. – xtrimsky

Antwort

2

Wenn Sie Eventtrigger-Komponente nicht verwenden möchten, können Sie einfach Ihre alte Skript verwenden können, und implementieren Sie IPointerEnterHandler, IPointerExitHandler, OnPointerClickHandler usw. und verwenden Sie für alle Objekte die gleiche Vergleichsmethode.

Ich denke, es ist viel einfacher zu verwenden als benutzerdefinierte Raycast. Da es immer einen Graphics Raycaster (oder Physik-Raycaster für 3D-Objekte) gibt, warum sollte man nicht das verwenden, was er zu bieten hat?

public class MyOldScriptWhichUsedRaycasting: MonoBehaviour, IPointerEnterHandler, IPointerExitHandler, IPointerClickHandler 
{ 
    public void OnPointerEnter (PointerEventData eventData) 
    { 
     if(gameObject.CompareTag("Grabable")) 
     { 
      //do stuff here. 
     } 
    } 
    public void OnPointerExit (PointerEventData eventData) 
    { 
     if(gameObject.CompareTag("Grabable")) 
     { 
      //do stuff here. 
     } 
    } 
    public void OnPointerClick (PointerEventData eventData) 
    { 
     if(gameObject.CompareTag("Grabable")) 
     { 
      //do stuff here. 
     } 
    } 
} 

hoffe, das hilft

+0

Thank you! Als ich das Spiel bereits mit der Verwendung der Eventsystem implementiert, gewann ich Versuche deine Lösung nicht, aber ich werde es als die richtige Antwort markieren und hoffentlich anderen helfen! – xtrimsky

Verwandte Themen