Peristiwa input — MRTK2

Daftar di bawah ini menguraikan semua antarmuka peristiwa input yang tersedia untuk diimplementasikan oleh komponen MonoBehaviour kustom. Antarmuka ini akan dipanggil oleh sistem input MRTK untuk menangani logika aplikasi kustom berdasarkan interaksi input pengguna. Peristiwa input pointer ditangani sedikit berbeda dari jenis peristiwa input standar di bawah ini.

Penting

Secara default, skrip akan menerima peristiwa input hanya jika itu adalah GameObject yang difokuskan oleh pointer atau induk GameObject dalam fokus.

Penghandel Acara Deskripsi
IMixedRealitySourceStateHandler Sumber Terdeteksi / Hilang Dimunculkan ketika sumber input terdeteksi/hilang, seperti ketika tangan yang diartikulasikan terdeteksi atau kehilangan jejak.
IMixedRealitySourcePoseHandler Pose Sumber Diubah Dimunculkan pada perubahan pose sumber. Pose sumber mewakili pose umum sumber input. Pose tertentu, seperti pose grip atau pointer dalam enam pengontrol DOF, dapat diperoleh melalui IMixedRealityInputHandler<MixedRealityPose>.
IMixedRealityInputHandler Input Turun / Naik Dimunculkan pada perubahan pada input biner seperti tombol.
IMixedRealityInputHandler<T> Input Diubah Dimunculkan pada perubahan pada input dari jenis yang diberikan. T dapat mengambil nilai berikut:
- float (misalnya mengembalikan pemicu analog)
- Vector2 (misalnya mengembalikan arah thumbstick gamepad)
- Vektor3 (misalnya posisi pengembalian perangkat terlacak)
- Quaternion (misalnya mengembalikan orientasi perangkat terlacak)
- MixedRealityPose (misalnya mengembalikan perangkat yang sepenuhnya dilacak)
IMixedRealitySpeechHandler Kata Kunci Ucapan Dikenali Dimunculkan atas pengenalan salah satu kata kunci yang dikonfigurasi di Profil Perintah Ucapan.
IMixedRealityDictationHandler Dikte
Hipotesis
Hasil
Selesai
Kesalahan
Dimunculkan oleh sistem dikte untuk melaporkan hasil sesi dikte.
IMixedRealityGestureHandler Peristiwa gerakan pada:
Dimulai
Diperbarui
Selesai
Batal
Dinaikkan pada deteksi gerakan.
IMixedRealityGestureHandler<T> Gerakan Diperbarui / Selesai Dimunculkan pada deteksi gerakan yang berisi data tambahan dari jenis yang diberikan. Lihat peristiwa gerakan untuk detail tentang nilai yang mungkin untuk T.
IMixedRealityHandJointHandler Sendi Tangan Diperbarui Dibesarkan oleh pengontrol tangan artikulasi ketika sendi tangan diperbarui.
IMixedRealityHandMeshHandler Mesh Tangan Diperbarui Dibesarkan oleh pengontrol tangan artikulasi ketika jala tangan diperbarui.
IMixedRealityInputActionHandler Tindakan Dimulai / Berakhir Naikkan untuk menunjukkan tindakan mulai dan berakhir untuk input yang dipetakan ke tindakan.

Peristiwa input sedang beraksi

Pada tingkat skrip, peristiwa input dapat dikonsumsi dengan mengimplementasikan salah satu antarmuka penanganan aktivitas yang ditunjukkan pada tabel di atas. Saat peristiwa input diaktifkan melalui interaksi pengguna, hal berikut ini terjadi:

  1. Sistem input MRTK mengenali bahwa peristiwa input telah terjadi.
  2. Sistem input MRTK mengaktifkan fungsi antarmuka yang relevan dari peristiwa input ke semua penangan input global yang terdaftar
  3. Untuk setiap pointer aktif yang terdaftar dengan sistem input:
    1. Sistem input menentukan GameObject mana yang menjadi fokus untuk penunjuk saat ini.
    2. Sistem input menggunakan sistem peristiwa Unity untuk mengaktifkan fungsi antarmuka yang relevan untuk semua komponen yang cocok pada GameObject yang berfokus.
    3. Jika pada titik mana pun peristiwa input telah ditandai sebagai digunakan, proses akan berakhir dan tidak ada GameObjects lebih lanjut yang akan menerima panggilan balik.
      • Contoh: Komponen yang mengimplementasikan antarmuka IMixedRealitySpeechHandler akan dicari ketika perintah ucapan dikenali.
      • Catatan: Sistem peristiwa Unity akan bergelembung untuk mencari Induk GameObject jika tidak ada komponen yang cocok dengan antarmuka yang diinginkan yang ditemukan pada GameObject saat ini.
  4. Jika tidak ada penangan input global yang terdaftar dan tidak ada GameObject yang ditemukan dengan komponen/antarmuka yang cocok, maka sistem input akan memanggil setiap penangan input terdaftar fallback

Catatan

Peristiwa input pointer ditangani dengan cara yang sedikit berbeda dari antarmuka peristiwa input yang tercantum di atas. Secara khusus, peristiwa input pointer hanya ditangani oleh GameObject dalam fokus oleh penunjuk yang menembakkan peristiwa input - serta penangan input global apa pun. Peristiwa input reguler ditangani oleh GameObjects sebagai fokus untuk semua pointer aktif.

Contoh antarmuka peristiwa input

Kode di bawah ini menunjukkan penggunaan IMixedRealitySpeechHandler antarmuka. Ketika pengguna mengatakan kata-kata "lebih kecil" atau "lebih besar" saat berfokus pada GameObject dengan kelas ini ShowHideSpeechHandler , GameObject akan menskalakan dirinya setengah atau dua kali lebih banyak.

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;
        }
    }
}

Catatan

IMixedRealitySpeechHandler peristiwa input mengharuskan kata kunci yang diinginkan didaftarkan sebelumnya di Profil Perintah Ucapan MRTK.

Mendaftar untuk peristiwa input global

Untuk membuat komponen yang mendengarkan peristiwa input global, mengabaikan apa yang mungkin menjadi fokus GameObject, komponen harus mendaftarkan dirinya dengan Sistem Input. Setelah terdaftar, setiap instans MonoBehaviour ini akan menerima peristiwa input bersama dengan GameObject apa pun yang saat ini fokus dan pendengar terdaftar global lainnya.

Jika peristiwa input telah ditandai sebagai digunakan, penangan terdaftar global masih akan menerima panggilan balik. Namun, tidak ada GameObjects yang berfokus yang akan menerima acara tersebut.

Contoh pendaftaran input global

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);
        }
    }
}

Mendaftar untuk peristiwa input fallback

Penangan input fallback mirip dengan penangan input global terdaftar tetapi diperlakukan sebagai upaya terakhir untuk penanganan peristiwa input. Hanya jika tidak ada penangan input global yang ditemukan dan tidak ada GameObjects yang fokus akan fallback penangan input akan dimanfaatkan.

Contoh handler input fallback

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)
    {
        ...
    }
}

Cara menghentikan peristiwa input

Setiap antarmuka peristiwa input menyediakan BaseInputEventData objek data sebagai parameter untuk setiap fungsi pada antarmuka. Objek data peristiwa ini meluas dari Unity sendiri AbstractEventData.

Untuk menghentikan peristiwa input agar tidak menyebar melalui eksekusinya seperti yang diuraikan, komponen dapat memanggil AbstractEventData.Use() untuk menandai peristiwa seperti yang digunakan. Ini akan menghentikan GameObjects lain menerima peristiwa input saat ini, dengan pengecualian handler input global.

Catatan

Komponen yang memanggil Use() metode akan menghentikan GameObjects lain menerimanya. Namun, komponen lain pada GameObject saat ini masih akan menerima peristiwa input dan mengaktifkan fungsi antarmuka terkait.

Lihat juga