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?