Invoer gebeurtenissen — MRTK2
De onderstaande lijst bevat een overzicht van alle beschikbare invoer gebeurtenisinterfaces die moeten worden geïmplementeerd door een aangepast MonoBehaviour-onderdeel. Deze interfaces worden aangeroepen door het MRTK-invoersysteem om aangepaste app-logica te verwerken op basis van gebruikersinvoerinteracties. Aanwijzerinvoergebeurtenissen worden iets anders verwerkt dan de standaardinvoergebeurtenistypen hieronder.
Belangrijk
Standaard ontvangt een script alleen invoerevenementen als dit het GameObject is waarin de focus ligt door een aanwijzer of bovenliggend element van een GameObject in focus.
Handler | gebeurtenis | Beschrijving |
---|---|---|
IMixedRealitySourceStateHandler |
Bron gedetecteerd/verloren | Opgeheven wanneer een invoerbron wordt gedetecteerd/verloren, bijvoorbeeld wanneer een gelede hand wordt gedetecteerd of het spoor kwijtraakt. |
IMixedRealitySourcePoseHandler |
Bronhouding gewijzigd | Verhoogd bij wijzigingen in de bronhouding. De bronhouding vertegenwoordigt de algemene houding van de invoerbron. Specifieke poses, zoals de grip of pointer pose in een zes DOF controller, kunnen worden verkregen via IMixedRealityInputHandler<MixedRealityPose> . |
IMixedRealityInputHandler |
Invoer omlaag/omhoog | Gegenereerd bij wijzigingen in binaire invoer, zoals knoppen. |
IMixedRealityInputHandler<T> |
Invoer gewijzigd | Gegenereerd over wijzigingen in invoer van het opgegeven type. T kan de volgende waarden aannemen: - float (retourneert bijvoorbeeld analoge trigger) - Vector2 (retourneert bijvoorbeeld de richting van de duimstick van de gamepad) - Vector3 (bijv. retourpositie van bijgehouden apparaat) - Quaternion (retourneert bijvoorbeeld de richting van het getraceerde apparaat) - MixedRealityPose (retourneert bijvoorbeeld een volledig bijgehouden apparaat) |
IMixedRealitySpeechHandler |
Spraakwoord herkend | Gegenereerd bij de herkenning van een van de trefwoorden die zijn geconfigureerd in het profiel Spraakopdrachten. |
IMixedRealityDictationHandler |
Dicteren Hypothese Resultaat Voltooid Fout |
Gegenereerd door dicteersystemen om de resultaten van een dicteersessie te rapporteren. |
IMixedRealityGestureHandler |
Gebaargebeurtenissen op: Gestart Bijgewerkt Voltooid Geannuleerd |
Verhoogd bij detectie van bewegingen. |
IMixedRealityGestureHandler<T> |
Beweging bijgewerkt/voltooid | Gegenereerd bij detectie van bewegingen die aanvullende gegevens van het opgegeven type bevatten. Zie gebarengebeurtenissen voor meer informatie over mogelijke waarden voor T. |
IMixedRealityHandJointHandler |
Handgewrichten bijgewerkt | Opgeheven door gelede handregelaars wanneer handgewrichten worden bijgewerkt. |
IMixedRealityHandMeshHandler |
Hand mesh bijgewerkt | Opgeheven door gelede handregelaars wanneer een handgaas wordt bijgewerkt. |
IMixedRealityInputActionHandler |
Actie gestart/beëindigd | Verhogen om het begin en einde van de actie aan te geven voor invoer die is toegewezen aan acties. |
Invoer van gebeurtenissen in actie
Op scriptniveau kunnen invoer gebeurtenissen worden gebruikt door een van de gebeurtenis-handler-interfaces te implementeren die in de bovenstaande tabel worden weergegeven. Wanneer een invoer gebeurtenis wordt geactiveerd via een gebruikersinteractie, vindt het volgende plaats:
- Het MRTK-invoersysteem herkent dat er een invoergebeurtenis heeft plaatsgevonden.
- Het MRTK-invoersysteem schakelt de relevante interfacefunctie van de invoer-gebeurtenis door naar alle geregistreerde globale invoerhandlers
- Voor elke actieve aanwijzer die is geregistreerd bij het invoersysteem:
- Het invoersysteem bepaalt welk GameObject de focus heeft voor de huidige aanwijzer.
- Het invoersysteem maakt gebruik van het gebeurtenissysteem van Unity om de relevante interfacefunctie voor alle overeenkomende onderdelen op het gameobject te activeren.
- Als op enig moment een invoergebeurtenis is gemarkeerd als gebruikt, wordt het proces beëindigd en ontvangen geen verdere GameObjects callbacks.
- Voorbeeld: onderdelen die de interface
IMixedRealitySpeechHandler
implementeren, worden gezocht wanneer een spraakopdracht wordt herkend. - Opmerking: het Unity-gebeurtenissysteem zal opbellen om het bovenliggende GameObject te doorzoeken als er geen onderdelen zijn gevonden die overeenkomen met de gewenste interface op het huidige GameObject.
- Voorbeeld: onderdelen die de interface
- Als er geen globale invoerhandlers zijn geregistreerd en er geen GameObject wordt gevonden met een overeenkomend onderdeel/interface, roept het invoersysteem elke geregistreerde invoerhandler voor terugval aan
Notitie
Aanwijzerinvoergebeurtenissen worden op een iets andere manier verwerkt dan de invoergebeurtenisinterfaces die hierboven worden vermeld. Met name worden aanwijzerinvoergebeurtenissen alleen verwerkt door het GameObject waarop de focus is gericht door de aanwijzer die de invoergebeurtenis heeft geactiveerd, evenals eventuele globale invoerhandlers. Normale invoergebeurtenissen worden verwerkt door GameObjects met de focus voor alle actieve aanwijzers.
Voorbeeld van invoer gebeurtenisinterface
De onderstaande code laat het gebruik van de IMixedRealitySpeechHandler
interface zien. Wanneer de gebruiker de woorden 'kleiner' of 'groter' zegt terwijl hij zich richt op een GameObject met deze ShowHideSpeechHandler
klasse, wordt het GameObject zelf met de helft of twee keer zoveel geschaald.
public class ShowHideSpeechHandler : MonoBehaviour, IMixedRealitySpeechHandler
{
...
void IMixedRealitySpeechHandler.OnSpeechKeywordRecognized(SpeechEventData eventData)
{
if (eventData.Command.Keyword == "smaller")
{
transform.localScale *= 0.5f;
}
else if (eventData.Command.Keyword == "bigger")
{
transform.localScale *= 2.0f;
}
}
}
Notitie
IMixedRealitySpeechHandler
invoergebeurtenissen vereisen dat de gewenste trefwoorden vooraf zijn geregistreerd in het mrtk-profiel voor spraakopdrachten.
Registreren voor algemene invoerevenementen
Als u een onderdeel wilt maken dat luistert naar algemene invoerevenementen, zonder rekening te houden met welke GameObject mogelijk de focus heeft, moet een onderdeel zich registreren bij het invoersysteem. Na registratie ontvangen alle exemplaren van deze MonoBehaviour invoerevenementen, samen met alle GameObject(s) die momenteel de focus hebben en andere wereldwijd geregistreerde listeners.
Als een invoergebeurtenis is gemarkeerd als gebruikt, ontvangen globale geregistreerde handlers nog steeds callbacks. GameObjects met focus ontvangen de gebeurtenis echter niet.
Voorbeeld van registratie van globale invoer
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler, // Handle source detected and lost
IMixedRealityHandJointHandler // handle joint position updates for hands
{
private void OnEnable()
{
// Instruct Input System that we would like to receive all input events of type
// IMixedRealitySourceStateHandler and IMixedRealityHandJointHandler
CoreServices.InputSystem?.RegisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.RegisterHandler<IMixedRealityHandJointHandler>(this);
}
private void OnDisable()
{
// This component is being destroyed
// Instruct the Input System to disregard us for input event handling
CoreServices.InputSystem?.UnregisterHandler<IMixedRealitySourceStateHandler>(this);
CoreServices.InputSystem?.UnregisterHandler<IMixedRealityHandJointHandler>(this);
}
// IMixedRealitySourceStateHandler interface
public void OnSourceDetected(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// Only react to articulated hand input sources
if (hand != null)
{
Debug.Log("Source detected: " + hand.ControllerHandedness);
}
}
public void OnSourceLost(SourceStateEventData eventData)
{
var hand = eventData.Controller as IMixedRealityHand;
// Only react to articulated hand input sources
if (hand != null)
{
Debug.Log("Source lost: " + hand.ControllerHandedness);
}
}
public void OnHandJointsUpdated(
InputEventData<IDictionary<TrackedHandJoint, MixedRealityPose>> eventData)
{
MixedRealityPose palmPose;
if (eventData.InputData.TryGetValue(TrackedHandJoint.Palm, out palmPose))
{
Debug.Log("Hand Joint Palm Updated: " + palmPose.Position);
}
}
}
Registreren voor terugvalinvoer gebeurtenissen
Terugvalinvoerhandlers zijn vergelijkbaar met geregistreerde globale invoerhandlers, maar worden behandeld als een laatste redmiddel voor de verwerking van invoerevenementen. Alleen als er geen algemene invoerhandlers zijn gevonden en er geen GameObjects in focus zijn, worden terugvalinvoerhandlers gebruikt.
Voorbeeld van terugvalinvoerhandler
public class GlobalHandListenerExample : MonoBehaviour,
IMixedRealitySourceStateHandler // Handle source detected and lost
{
private void OnEnable()
{
CoreServices.InputSystem?.PushFallbackInputHandler(this);
}
private void OnDisable()
{
CoreServices.InputSystem?.PopFallbackInputHandler();
}
// IMixedRealitySourceStateHandler interface
public void OnSourceDetected(SourceStateEventData eventData)
{
...
}
public void OnSourceLost(SourceStateEventData eventData)
{
...
}
}
Invoerevenementen stoppen
Elke invoer-gebeurtenisinterface biedt een BaseInputEventData
gegevensobject als parameter voor elke functie op de interface. Dit gebeurtenisgegevensobject is een uitbreiding van het eigen AbstractEventData
object van Unity.
Als u wilt voorkomen dat een invoer-gebeurtenis wordt doorgegeven via de uitvoering zoals beschreven, kan een onderdeel aanroepen AbstractEventData.Use()
om de gebeurtenis als gebruikt te markeren. Hiermee voorkomt u dat andere GameObjects de huidige invoer-gebeurtenis ontvangen, met uitzondering van globale invoerhandlers.
Notitie
Een onderdeel dat de Use()
methode aanroept, voorkomt dat andere GameObjects deze ontvangen. Andere onderdelen in het huidige GameObject ontvangen echter nog steeds de invoer-gebeurtenis en activeren eventuele gerelateerde interfacefuncties.