Bemeneti események – MRTK2
Az alábbi lista az egyéni MonoBehaviour-összetevő által implementálandó összes bemeneti eseményillesztőt ismerteti. Ezeket az interfészeket az MRTK bemeneti rendszere hívja meg a felhasználói beviteli interakciókon alapuló egyéni alkalmazáslogika kezeléséhez. A mutatóbemeneti események kezelése kissé eltér az alábbi szokásos bemeneti eseménytípusoktól.
Fontos
Alapértelmezés szerint a szkriptek csak akkor kapnak bemeneti eseményeket, ha a fókuszban lévő GameObject a fókuszban lévő GameObject mutatója vagy szülője.
Kezelő | esemény | Description |
---|---|---|
IMixedRealitySourceStateHandler |
Forrás észlelve/elveszett | A bemeneti forrás észlelésekor/elvesztésekor keletkezik, például amikor egy csuklós leosztást észlelnek vagy elvesznek a nyomuk. |
IMixedRealitySourcePoseHandler |
A forrás póz módosult | A forrásváltozások alapján emelt érték. A forrás póz a bemeneti forrás általános pózát jelöli. Az adott pózok, például a hat DOF-vezérlőben lévő markolat vagy mutató póz a használatával IMixedRealityInputHandler<MixedRealityPose> szerezhetők be. |
IMixedRealityInputHandler |
Bemenet lefelé/felfelé | A bináris bemenetek, például a gombok módosításaira emelve. |
IMixedRealityInputHandler<T> |
Bemenet módosítva | Az adott típusú bemenetek módosításaira emelve. A T a következő értékeket veheti fel: - float (pl. analóg triggert ad vissza) - Vector2 (pl. visszaadja a gamepad hüvelykujj irányát) - Vector3 (pl. a nyomon követett eszköz visszatérési pozíciója) - Quaternion (például a követett eszköz tájolását adja vissza) - MixedRealityPose (például teljes mértékben nyomon követett eszközt ad vissza) |
IMixedRealitySpeechHandler |
Beszéd kulcsszó felismerve | A Speech Commands-profilban konfigurált kulcsszavak egyikének felismerése alapján emelték ki. |
IMixedRealityDictationHandler |
Diktálás Hipotézis Eredmény Kész Hiba |
A diktálási rendszerek a diktálási munkamenet eredményeinek jelentésére emelik. |
IMixedRealityGestureHandler |
Kézmozdulatesemények a következőn: Első lépések Frissítve Befejeződött Megszakítva |
Kézmozdulat-észlelés esetén emelve. |
IMixedRealityGestureHandler<T> |
Kézmozdulat frissítve/befejezve | Az adott típusú további adatokat tartalmazó kézmozdulatok észlelésekor aktiválódott. A T lehetséges értékeivel kapcsolatos részletekért tekintse meg a kézmozdulateseményeket. |
IMixedRealityHandJointHandler |
Kéz ízületek frissítve | Csuklós kézi vezérlők emelik a kézkötések frissítésekor. |
IMixedRealityHandMeshHandler |
Hand Mesh frissítve | A kézi háló frissítésekor a csuklós kézi vezérlők emelik ki. |
IMixedRealityInputActionHandler |
Művelet elindítva/befejezve | A művelet kezdetét és végét jelző emelés a műveletekhez hozzárendelt bemenetek esetében. |
Bemeneti események működés közben
A szkript szintjén a bemeneti események a fenti táblázatban látható eseménykezelő felületek egyikének implementálásával használhatók. Ha egy bemeneti esemény felhasználói interakción keresztül aktiválódik, a következők történnek:
- Az MRTK bemeneti rendszer felismeri, hogy bemeneti esemény történt.
- Az MRTK bemeneti rendszer aktiválja a bemeneti esemény megfelelő interfészfüggvényét az összes regisztrált globális bemeneti kezelő számára
- A bemeneti rendszerben regisztrált összes aktív mutató esetében:
- A bemeneti rendszer határozza meg, hogy melyik GameObject van a fókuszban az aktuális mutatóhoz.
- A bemeneti rendszer a Unity eseményrendszerével aktiválja a megfelelő interfészfüggvényt a szűrt GameObject összes egyező összetevőjéhez.
- Ha egy bemeneti eseményt használtként jelölt meg, a folyamat véget ér, és további GameObjects-események nem kapnak visszahívásokat.
- Példa: A rendszer a beszédparancsok felismerésekor megkeresi a felületet
IMixedRealitySpeechHandler
megvalósító összetevőket. - Megjegyzés: A Unity eseményrendszer felborul a szülő GameObject kereséséhez, ha nem találhatók a kívánt felületnek megfelelő összetevők az aktuális GameObjecten.
- Példa: A rendszer a beszédparancsok felismerésekor megkeresi a felületet
- Ha nincs regisztrálva globális bemeneti kezelő, és nem található GameObject egyező összetevővel/felülettel, akkor a bemeneti rendszer meghívja az egyes tartalék regisztrált bemeneti kezelőket
Megjegyzés
A mutatóbemeneti események kezelése kissé eltér a fent felsorolt bemeneti eseményillesztőkétől. A mutatóbemeneti eseményeket különösen a fókuszban lévő GameObject kezeli a bemeneti eseményt aktiváló mutatóval , valamint a globális beviteli kezelőkkel. A rendszeres beviteli eseményeket a Fókuszban lévő GameObjects kezeli az összes aktív mutató esetében.
Példa bemeneti eseményillesztőre
Az alábbi kód bemutatja a IMixedRealitySpeechHandler
felület használatát. Amikor a felhasználó a "kisebb" vagy a "nagyobb" szavakat mondja, miközben a GameObjectre összpontosít ezzel az ShowHideSpeechHandler
osztálysal, a GameObject felére vagy kétszer annyira skálázza magát.
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;
}
}
}
Megjegyzés
IMixedRealitySpeechHandler
a bemeneti események megkövetelik, hogy a kívánt kulcsszavak előre regisztrálva legyenek az MRTK Speech Commands-profilban.
Regisztrálás globális bemeneti eseményekre
Ahhoz, hogy olyan összetevőt hozzon létre, amely figyeli a globális bemeneti eseményeket, figyelmen kívül hagyva a GameObject fókuszát, az összetevőnek regisztrálnia kell magát a beviteli rendszerben. A regisztrációt követően a MonoBehaviour bármely példánya bemeneti eseményeket fog kapni, valamint a jelenleg fókuszban lévő GameObject(ek)et és más globális regisztrált figyelőket.
Ha egy bemeneti eseményt használtként jelölt meg, a globális regisztrált kezelők továbbra is megkapják a visszahívásokat. Az eseményt azonban egyetlen célzott GameObjects sem kapja meg.
Példa globális beviteli regisztrációra
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);
}
}
}
Regisztráció tartalék bemeneti eseményekre
A tartalék bemeneti kezelők hasonlóak a regisztrált globális bemeneti kezelőkhöz, de a bemeneti események kezelésének végső módjaként kezelik őket. A tartalék bemeneti kezelők csak akkor lesznek kihasználva, ha nem találhatók globális bemeneti kezelők, és nincsenek gameObjects fókuszban.
Példa tartalék bemeneti kezelőre
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)
{
...
}
}
Bemeneti események leállítása
Minden bemeneti eseményillesztő egy adatobjektumot biztosít BaseInputEventData
paraméterként az interfész minden egyes függvényéhez. Ez az eseményadat-objektum a Unity saját AbstractEventData
objektumából terjed ki.
Annak érdekében, hogy egy bemeneti esemény ne propagálja a végrehajtást a tagolt módon, egy összetevő meghívhatja AbstractEventData.Use()
az eseményt a használtként való megjelöléshez. Ez megakadályozza, hogy minden más GameObjects megkapja az aktuális bemeneti eseményt, a globális bemeneti kezelők kivételével.
Megjegyzés
A metódust meghívó Use()
összetevő megakadályozza, hogy más GameObjects megkapja azt. Az aktuális GameObject egyéb összetevői azonban továbbra is megkapják a bemeneti eseményt, és aktiválják a kapcsolódó felületi függvényeket.