2016-08-18 24 views
0

Ich arbeite an einer YuGiOh HoloLens App mit einigen anderen auf Github, und wir sind auf airtaps stecken. Ich habe alle Funktionen ausgeführt und mit der OnMouseDown() - Funktion von Unity getestet. Diese Funktion wird einmal aufgerufen, wenn auf ein Objekt geklickt wird. Der Code dazwischen ist nicht wirklich wichtig, aber ich wollte zeigen, dass da nichts Unkonventionelles vor sich gehen sollte.So führen Sie die airtap OnSelect-Methode genau einmal aus?

void OnMouseDown() 
{ 
    Debug.Log(myGameManager); 
    Debug.Log(myZone); 
    myGameManager.setSelectedCard(this, myZone); 
} 

Jetzt möchte ich statt Klick auf airtap und so haben wir die OnSelectMethod mit diesem Code:

void OnSelect() 
{ 
    Debug.Log(myGameManager); 
    Debug.Log(myZone); 
    myGameManager.setSelectedCard(this, myZone); 
} 

und es gibt eine GazeGestureManager, die an dem Objekt angebracht ist, die das Ereignis registriert. Wir haben diesen Code von der Hololens Academy genommen.

using UnityEngine; 
using UnityEngine.VR.WSA.Input; 

public class GazeGestureManager : MonoBehaviour 
{ 
public static GazeGestureManager Instance { get; private set; } 

private Vector3 moveDirection = Vector3.zero; 

// Represents the hologram that is currently being gazed at. 
public GameObject FocusedObject { get; private set; } 

GestureRecognizer recognizer; 

// Use this for initialization 
void Start() 
{ 
    Instance = this; 

    // Set up a GestureRecognizer to detect Select gestures. 
    recognizer = new GestureRecognizer(); 
    recognizer.TappedEvent += (source, tapCount, ray) => 
    { 
     // Send an OnSelect message to the focused object and its ancestors. 
     if (FocusedObject != null) 
     { 
      FocusedObject.SendMessageUpwards("OnSelect"); 
     } 
    }; 
    recognizer.StartCapturingGestures(); 
} 

// Update is called once per frame 
void Update() 
{ 
    // Figure out which hologram is focused this frame. 
    GameObject oldFocusObject = FocusedObject; 

    // Do a raycast into the world based on the user's 
    // head position and orientation. 
    var headPosition = Camera.main.transform.position; 
    var gazeDirection = Camera.main.transform.forward; 

    RaycastHit hitInfo; 
    if (Physics.Raycast(headPosition, gazeDirection, out hitInfo)) 
    { 
     // If the raycast hit a hologram, use that as the focused object. 
     FocusedObject = hitInfo.collider.gameObject; 
    } 
    else 
    { 
     // If the raycast did not hit a hologram, clear the focused object. 
     FocusedObject = null; 
    } 

    // If the focused object changed this frame, 
    // start detecting fresh gestures again. 
    if (FocusedObject != oldFocusObject) 
    { 
     recognizer.CancelGestures(); 
     recognizer.StartCapturingGestures(); 
    } 
} 
} 

Jetzt haben wir diesen Code mehrfach verwendet und jede, die Art, wie wir sie setzen die OnSelect() -Methode up wird überall 4-36 mal aufgerufen. Warum wird es nicht nur einmal aufgerufen?

Könnte es sein, dass Airtab ein kontinuierliches Ereignis ist?

Wer wird während des Wasserhahns ständig abgefragt? und wenn ja, gibt es ein besser geeignetes Ereignis zu verwenden? (OnAirTapEnd?) Oder etwas in dieser Richtung?

Antwort

1

Sie sollten vermeiden, den Code aus den Hololens Academy Lektionen zu verwenden, wenn es sich um Kleinteile aus der HoloLens Toolkit for Unity handelt. Es gibt noch einen nützlichen Code, den man von der Hololens Academy ausleihen kann, aber die Sachen aus dem Toolkit sind schrecklich veraltet und der aktuellen Version des Toolkits unterlegen.

Mein Rat wäre, das Holo-Toolkit nach dem Getting Started Handbuch zu installieren. Nachdem du das getan hast, sortiere alle Teile aus deinem Projekt aus (wie GazeGestureManager oben) und ersetze sie durch die Holotoolkit-Versionen (in diesem Fall den GestureManager).

Ich würde wetten, dass Ihr Problem weggeht, nachdem Sie zum Holotoolkit gewechselt haben. Wenn nicht, wird es viel einfacher zu beheben ...

0

Ich würde sagen, dass Sie den TappedEvent-Handler mehrmals für das gleiche gameObject abonniert haben. Wenn Sie also das Ereignis auslösen, wird es mehrmals zu onSelect aufgelöst. Das ist nur von der Spitze meines Kopfes.

Verwandte Themen