Pengontrol gerakan di Unity

Ada dua cara utama untuk mengambil tindakan pada tatapan Anda di Unity, gerakan tangan dan pengontrol gerakan di HoloLens dan Immersive HMD. Anda mengakses data untuk kedua sumber input spasial melalui API yang sama di Unity.

Unity menyediakan dua cara utama untuk mengakses data input spasial untuk Windows Mixed Reality. API Input.GetButton/Input.GetAxis umum berfungsi di beberapa Unity XR SDK, sementara InteractionManager/GestureRecognizer API khusus untuk Windows Mixed Reality mengekspos kumpulan lengkap data input spasial.

API input Unity XR

Untuk proyek baru, sebaiknya gunakan API input XR baru dari awal.

Anda dapat menemukan informasi selengkapnya tentang API XR di sini.

Tabel pemetaan tombol/sumbu unity

Manajer Input Unity untuk pengontrol gerakan Windows Mixed Reality mendukung ID tombol dan sumbu yang tercantum di bawah ini melalui API Input.GetButton/GetAxis. Kolom "Khusus MR Windows" mengacu pada properti yang tersedia dari jenis InteractionSourceState . Masing-masing API ini dijelaskan secara rinci di bagian di bawah ini.

Pemetaan ID tombol/sumbu untuk Windows Mixed Reality umumnya cocok dengan ID tombol/sumbu Oculus.

Pemetaan ID tombol/sumbu untuk Windows Mixed Reality berbeda dari pemetaan OpenVR dengan dua cara:

  1. Pemetaan menggunakan ID touchpad yang berbeda dari thumbstick, untuk mendukung pengontrol dengan thumbstick dan touchpad.
  2. Pemetaan menghindari kelebihan beban ID tombol A dan X untuk tombol Menu agar tersedia untuk tombol ABXY fisik.
InputAPI Unity Umum
(Input.GetButton/GetAxis)
API Input khusus MR Windows
(XR. WSA. Input)
Tangan kiri Tangan kanan
Pilih pemicu yang ditekan Sumbu 9 = 1,0 Sumbu 10 = 1,0 pilih Ditekan
Pilih nilai analog pemicu Sumbu 9 Sumbu 10 pilihPressedAmount
Pilih pemicu yang ditekan sebagian Tombol 14 (kompat gamepad) Tombol 15 (kompat gamepad) pilihPressedAmount > 0.0
Tombol menu ditekan Tombol 6* Tombol 7* menu Tertekan
Tombol genggaman ditekan Sumbu 11 = 1,0 (tanpa nilai analog)
Tombol 4 (kompat gamepad)
Sumbu 12 = 1,0 (tanpa nilai analog)
Tombol 5 (kompat gamepad)
Memahami
Thumbstick X (kiri: -1.0, kanan: 1.0) Sumbu 1 Sumbu 4 thumbstickPosition.x
Thumbstick Y (atas: -1.0, bawah: 1.0) Sumbu 2 Sumbu 5 thumbstickPosition.y
Thumbstick ditekan Tombol 8 Tombol 9 thumbstickPressed
Touchpad X (kiri: -1.0, kanan: 1.0) Sumbu 17* Sumbu 19* touchpadPosition.x
Touchpad Y (atas: -1.0, bawah: 1.0) Sumbu 18* Sumbu 20* touchpadPosition.y
Touchpad disentuh Tombol 18* Tombol 19* touchpadTouched
Touchpad ditekan Tombol 16* Tombol 17* touchpadPressed
Pose grip 6DoF atau pose penunjuk Pose genggaman saja: XR. InputTracking.GetLocalPosition
XR. InputTracking.GetLocalRotation
Pass Grip atau Pointer sebagai argumen: sourceState.sourcePose.TryGetPosition
sourceState.sourcePose.TryGetRotation
Status pelacakan Akurasi posisi dan risiko kehilangan sumber hanya tersedia melalui API khusus MR sourceState.sourcePose.positionAccuracy
sourceState.properties.sourceLossRisk

Catatan

ID tombol/sumbu ini berbeda dari ID yang digunakan Unity untuk OpenVR karena tabrakan dalam pemetaan yang digunakan oleh gamepad, Oculus Touch, dan OpenVR.

OpenXR

Untuk mempelajari dasar-dasar tentang interaksi realitas campuran di Unity, kunjungi Unity Manual untuk Input Unity XR. Dokumentasi Unity ini mencakup pemetaan dari input khusus pengontrol ke InputFeatureUsageyang lebih umum, bagaimana input XR yang tersedia dapat diidentifikasi dan dikategorikan, cara membaca data dari input ini, dan banyak lagi.

Plugin OpenXR Mixed Reality menyediakan profil interaksi input tambahan, dipetakan ke InputFeatureUsagestandar seperti yang dijelaskan di bawah ini:

InputFeatureUsage Pengontrol HP Reverb G2 (OpenXR) Tangan HoloLens (OpenXR)
primary2DAxis Joystick
primary2DAxisClick Joystick - Klik
pemicu Pemicu
Pegangan Pegangan Ketuk udara atau peras
primaryButton [X/A] - Tekan Ketuk udara
sekunderButton [Y/B] - Tekan
gripButton Genggaman - Tekan
triggerButton Pemicu - Tekan
menuButton Menu

Pose genggaman vs. pose menunjuk

Windows Mixed Reality mendukung pengontrol gerakan dalam berbagai faktor bentuk. Setiap desain pengontrol berbeda dalam hubungannya antara posisi tangan pengguna dan arah "maju" alami yang harus digunakan aplikasi untuk menunjuk saat merender pengontrol.

Untuk lebih mewakili pengontrol ini, ada dua jenis pose yang dapat Anda selidiki untuk setiap sumber interaksi, pose genggaman , dan pose pointer. Baik pose genggaman maupun koordinat pose pointer dinyatakan oleh semua API Unity dalam koordinat dunia Unity global.

Pose genggaman

Pose genggaman mewakili lokasi telapak tangan pengguna, baik yang terdeteksi oleh HoloLens atau memegang pengontrol gerakan.

Pada headset imersif, pose genggaman paling baik digunakan untuk merender tangan pengguna atau objek yang dipegang di tangan pengguna. Pose genggaman juga digunakan saat memvisualisasikan pengontrol gerakan. Model yang dapat dirender yang disediakan oleh Windows untuk pengontrol gerakan menggunakan pose genggaman sebagai asal dan pusat rotasinya.

Pose pegangan didefinisikan secara khusus sebagai berikut:

  • Posisi pegangan: Sentroid telapak tangan saat memegang pengontrol secara alami, disesuaikan ke kiri atau kanan untuk memusatkan posisi di dalam pegangan. Pada pengontrol gerakan Windows Mixed Reality, posisi ini umumnya selaras dengan tombol Grasp.
  • Sumbu kanan orientasi genggaman: Ketika Anda benar-benar membuka tangan Anda untuk membentuk pose 5 jari datar, sinar yang normal ke telapak tangan Anda (maju dari telapak tangan kiri, mundur dari telapak kanan)
  • Sumbu Teruskan orientasi genggaman: Saat Anda menutup sebagian tangan Anda (seolah-olah memegang pengontrol), sinar yang menunjuk "maju" melalui tabung yang dibentuk oleh jari-jari bukan ibu jari Anda.
  • Orientasi genggaman sumbu Atas: Sumbu Atas tersirat oleh definisi Kanan dan Teruskan.

Anda dapat mengakses pose grip melalui API input lintas vendor (XR) Unity. InputTracking. GetLocalPosition/Rotation) atau melalui API khusus MR Windows (sourceState.sourcePose.TryGetPosition/Rotation, meminta pose data untuk simpul Grip ).

Pose penunjuk

Pose penunjuk mewakili ujung pengontrol yang menunjuk ke depan.

Pose pointer yang disediakan sistem paling baik digunakan untuk raycast saat Anda merender model pengontrol itu sendiri. Jika Anda merender beberapa objek virtual lain sebagai pengganti pengontrol, seperti pistol virtual, Anda harus menunjuk dengan sinar yang paling alami untuk objek virtual tersebut, seperti sinar yang berjalan di sepanjang laras model senjata yang ditentukan aplikasi. Karena pengguna dapat melihat objek virtual dan bukan pengontrol fisik, menunjuk dengan objek virtual kemungkinan akan lebih alami bagi mereka yang menggunakan aplikasi Anda.

Saat ini, pose pointer hanya tersedia di Unity melalui API khusus MR Windows, sourceState.sourcePose.TryGetPosition/Rotation, meneruskan InteractionSourceNode.Pointer sebagai argumen.

OpenXR

Anda memiliki akses ke dua set pose melalui interaksi input OpenXR:

  • Genggaman berpose untuk merender objek di tangan
  • Tujuannya adalah untuk menunjuk ke dunia.

Informasi lebih lanjut tentang desain ini dan perbedaan antara kedua pose dapat ditemukan dalam Spesifikasi OpenXR - Subpath Input.

Pose yang disediakan oleh DevicePosition InputFeatureUsages, DeviceRotation, DeviceVelocity, dan DeviceAngularVelocity semuanya mewakili pose grip OpenXR. InputFeatureUsages yang terkait dengan pose grip didefinisikan dalam CommonUsages Unity.

Pose yang disediakan oleh InputFeatureUsages PointerPosition, PointerRotation, PointerVelocity, dan PointerAngularVelocity semuanya mewakili pose tujuan OpenXR. InputFeatureUsages ini tidak ditentukan dalam file C# apa pun yang disertakan, jadi Anda harus menentukan InputFeatureUsages Anda sendiri sebagai berikut:

public static readonly InputFeatureUsage<Vector3> PointerPosition = new InputFeatureUsage<Vector3>("PointerPosition");

Haptics

Untuk informasi tentang penggunaan haptik dalam sistem Input XR Unity, dokumentasi dapat ditemukan di Unity Manual untuk Unity XR Input - Haptics.

Status pelacakan pengontrol

Seperti headset, pengontrol gerakan Windows Mixed Reality tidak memerlukan pengaturan sensor pelacakan eksternal. Sebaliknya, pengontrol dilacak oleh sensor di headset itu sendiri.

Jika pengguna memindahkan pengontrol dari bidang tampilan headset, Windows terus menyimpulkan posisi pengontrol dalam banyak kasus. Ketika pengontrol telah kehilangan pelacakan visual cukup lama, posisi pengontrol akan turun ke posisi perkiraan akurasi.

Pada titik ini, sistem akan mengunci pengontrol ke pengguna, melacak posisi pengguna saat mereka bergerak, sambil tetap mengekspos orientasi sejati pengontrol menggunakan sensor orientasi internalnya. Banyak aplikasi yang menggunakan pengontrol untuk mengarahkan dan mengaktifkan elemen UI dapat beroperasi secara normal saat dalam perkiraan akurasi tanpa pengguna memperhatikan.

Penalaran tentang melacak status secara eksplisit

Aplikasi yang ingin memperlakukan posisi secara berbeda berdasarkan status pelacakan dapat melaju lebih jauh dan memeriksa properti pada status pengontrol, seperti SourceLossRisk dan PositionAccuracy:

Status pelacakan SourceLossRisk PositionAccuracy TryGetPosition
Akurasi tinggi < 1.0 Tinggi TRUE
Akurasi tinggi (berisiko kehilangan) == 1.0 Tinggi TRUE
Perkiraan akurasi == 1.0 Perkiraan TRUE
Tidak ada posisi == 1.0 Perkiraan salah

Status pelacakan pengontrol gerakan ini didefinisikan sebagai berikut:

  • Akurasi tinggi: Meskipun pengontrol gerakan berada dalam bidang pandang headset, umumnya akan memberikan posisi akurasi tinggi, berdasarkan pelacakan visual. Pengontrol bergerak yang sesaat meninggalkan bidang pandang atau sesaat dikaburkan dari sensor headset (misalnya oleh tangan lain pengguna) akan terus mengembalikan pose akurasi tinggi untuk waktu yang singkat, berdasarkan pelacakan inertial pengontrol itu sendiri.
  • Akurasi tinggi (berisiko kehilangan): Ketika pengguna memindahkan pengontrol gerakan melewati tepi bidang pandang headset, headset akan segera tidak dapat melacak posisi pengontrol secara visual. Aplikasi ini tahu kapan pengontrol telah mencapai batas FOV ini dengan melihat SourceLossRisk mencapai 1.0. Pada saat itu, aplikasi dapat memilih untuk menjeda gerakan pengontrol yang memerlukan aliran pose berkualitas tinggi yang stabil.
  • Perkiraan akurasi: Ketika pengontrol telah kehilangan pelacakan visual cukup lama, posisi pengontrol akan turun ke posisi perkiraan akurasi. Pada titik ini, sistem akan mengunci pengontrol ke pengguna, melacak posisi pengguna saat mereka bergerak, sambil tetap mengekspos orientasi sejati pengontrol menggunakan sensor orientasi internalnya. Banyak aplikasi yang menggunakan pengontrol untuk mengarahkan dan mengaktifkan elemen UI dapat beroperasi seperti biasa saat dalam perkiraan akurasi tanpa pengguna memperhatikan. Aplikasi dengan persyaratan input yang lebih berat dapat memilih untuk merasakan penurunan ini dari Akurasi tinggi ke Perkiraan akurasi dengan memeriksa properti PositionAccuracy , misalnya untuk memberi pengguna hitbox yang lebih murah pada target di luar layar selama waktu ini.
  • Tidak ada posisi: Meskipun pengontrol dapat beroperasi pada perkiraan akurasi untuk waktu yang lama, kadang-kadang sistem tahu bahwa bahkan posisi terkunci tubuh tidak berarti saat ini. Misalnya, pengontrol yang diaktifkan mungkin belum pernah diamati secara visual, atau pengguna dapat meletakkan pengontrol yang kemudian diambil oleh orang lain. Pada saat itu, sistem tidak akan memberikan posisi apa pun ke aplikasi, dan TryGetPosition akan mengembalikan false.

API Unity Umum (Input.GetButton/GetAxis)

Namespace:UnityEngine, UnityEngine.XR
Jenis: Input, XR. InputTracking

Unity saat ini menggunakan API Input.GetButton/Input.GetAxis umumnya untuk mengekspos input untuk Oculus SDK, OpenVR SDK, dan Windows Mixed Reality, termasuk pengontrol tangan dan gerakan. Jika aplikasi Anda menggunakan API ini untuk input, aplikasi dapat dengan mudah mendukung pengontrol gerakan di beberapa SDK XR, termasuk Windows Mixed Reality.

Mendapatkan status ditekan tombol logis

Untuk menggunakan API input Unity umum, Anda biasanya akan memulai dengan mengaitkan tombol dan sumbu ke nama logis di Unity Input Manager, mengikat tombol atau ID sumbu ke setiap nama. Anda kemudian dapat menulis kode yang mengacu pada nama tombol/sumbu logis tersebut.

Misalnya, untuk memetakan tombol pemicu pengontrol gerakan kiri ke tindakan Kirim, buka Edit > Input Pengaturan > Proyek dalam Unity, dan perluas properti bagian Kirim di bawah Sumbu. Ubah properti Tombol Positif atau Tombol Positif Alt untuk membaca tombol joystick 14, seperti ini:

InputManager Unity
Unity InputManager

Skrip Anda kemudian dapat memeriksa tindakan Kirim menggunakan Input.GetButton:

if (Input.GetButton("Submit"))
{
  // ...
}

Anda dapat menambahkan lebih banyak tombol logis dengan mengubah properti Ukuran di bawah Sumbu.

Mendapatkan status tombol fisik yang ditekan secara langsung

Anda juga dapat mengakses tombol secara manual dengan nama mereka yang sepenuhnya memenuhi syarat, menggunakan Input.GetKey:

if (Input.GetKey("joystick button 8"))
{
  // ...
}

Mendapatkan pose pengontrol tangan atau gerakan

Anda dapat mengakses posisi dan rotasi pengontrol, menggunakan XR. InputTracking:

Vector3 leftPosition = InputTracking.GetLocalPosition(XRNode.LeftHand);
Quaternion leftRotation = InputTracking.GetLocalRotation(XRNode.LeftHand);

Catatan

Kode di atas mewakili pose cengkeraman pengontrol (di mana pengguna memegang pengontrol), yang berguna untuk merender pedang atau pistol di tangan pengguna, atau model pengontrol itu sendiri.

Hubungan antara pose genggaman ini dan pose penunjuk (di mana ujung pengontrol menunjuk) mungkin berbeda di seluruh pengontrol. Saat ini, mengakses pose pointer pengontrol hanya dimungkinkan melalui API input khusus MR, yang dijelaskan di bagian di bawah ini.

API khusus Windows (XR). WSA. Input)

Perhatian

Jika proyek Anda menggunakan salah satu XR. API WSA, ini sedang ditahapkan demi XR SDK dalam rilis Unity di masa mendatang. Untuk proyek baru, sebaiknya gunakan XR SDK dari awal. Anda dapat menemukan informasi selengkapnya tentang sistem Input XR dan API di sini.

Namespace:UnityEngine.XR.WSA.Input
Jenis: InteractionManager, InteractionSourceState, InteractionSource, InteractionSourceProperties, InteractionSourceKind, InteractionSourceLocation

Untuk mendapatkan informasi lebih rinci tentang input tangan Windows Mixed Reality (untuk HoloLens) dan pengontrol gerakan, Anda dapat memilih untuk menggunakan API input spasial khusus Windows di bawah namespace UnityEngine.XR.WSA.Input. Ini memungkinkan Anda mengakses informasi tambahan, seperti akurasi posisi atau jenis sumber, memungkinkan Anda membedakan tangan dan pengontrol.

Polling untuk keadaan pengontrol tangan dan gerakan

Anda dapat melakukan polling untuk status bingkai ini untuk setiap sumber interaksi (pengontrol tangan atau gerakan) menggunakan metode GetCurrentReading .

var interactionSourceStates = InteractionManager.GetCurrentReading();
foreach (var interactionSourceState in interactionSourceStates) {
    // ...
}

Setiap InteractionSourceState yang Anda dapatkan kembali mewakili sumber interaksi pada saat ini. InteractionSourceState mengekspos info seperti:

  • Jenis tekan mana yang terjadi (Pilih/Menu/Grasp/Touchpad/Thumbstick)

    if (interactionSourceState.selectPressed) {
         // ...
    }
    
  • Data lain khusus untuk pengontrol gerakan, seperti touchpad dan/atau koordinat XY thumbstick dan status tersentuh

    if (interactionSourceState.touchpadTouched && interactionSourceState.touchpadPosition.x > 0.5) {
         // ...
    }
    
  • InteractionSourceKind untuk mengetahui apakah sumbernya adalah tangan atau pengontrol gerakan

    if (interactionSourceState.source.kind == InteractionSourceKind.Hand) {
         // ...
    }
    

Polling untuk pose penyajian yang diprediksi maju

  • Saat polling untuk data sumber interaksi dari tangan dan pengontrol, pose yang Anda dapatkan adalah pose yang diprediksi maju untuk saat-saat ketika foton bingkai ini akan mencapai mata pengguna. Pose yang diprediksi maju paling baik digunakan untuk merender pengontrol atau objek yang ditahan setiap bingkai. Jika Anda menargetkan pers atau rilis tertentu dengan pengontrol, itu akan paling akurat jika Anda menggunakan API peristiwa historis yang dijelaskan di bawah ini.

    var sourcePose = interactionSourceState.sourcePose;
    Vector3 sourceGripPosition;
    Quaternion sourceGripRotation;
    if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Grip)) &&
         (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Grip))) {
         // ...
    }
    
  • Anda juga bisa mendapatkan pose kepala yang diprediksi maju untuk bingkai saat ini. Seperti halnya pose sumber, ini berguna untuk merender kursor, meskipun menargetkan pers atau rilis tertentu akan paling akurat jika Anda menggunakan API peristiwa historis yang dijelaskan di bawah ini.

    var headPose = interactionSourceState.headPose;
    var headRay = new Ray(headPose.position, headPose.forward);
    RaycastHit raycastHit;
    if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
         var cursorPos = raycastHit.point;
         // ...
    }
    

Menangani peristiwa sumber interaksi

Untuk menangani peristiwa input saat terjadi dengan data pose historis yang akurat, Anda dapat menangani peristiwa sumber interaksi alih-alih polling.

Untuk menangani peristiwa sumber interaksi:

  • Daftar untuk peristiwa input InteractionManager . Untuk setiap jenis peristiwa interaksi yang Anda minati, Anda perlu berlangganannya.

    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    
  • Tangani peristiwa. Setelah berlangganan peristiwa interaksi, Anda akan mendapatkan panggilan balik jika sesuai. Dalam contoh SourcePressed , ini akan terjadi setelah sumber terdeteksi dan sebelum dirilis atau hilang.

    void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
         var interactionSourceState = args.state;
    
         // args.state has information about:
            // targeting head ray at the time when the event was triggered
            // whether the source is pressed or not
            // properties like position, velocity, source loss risk
            // source id (which hand id for example) and source kind like hand, voice, controller or other
    }
    

Cara berhenti menangani peristiwa

Anda perlu berhenti menangani peristiwa ketika Anda tidak lagi tertarik pada peristiwa atau Anda menghancurkan objek yang telah berlangganan acara. Untuk berhenti menangani peristiwa, Anda berhenti berlangganan dari acara.

InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;

Daftar peristiwa sumber interaksi

Peristiwa sumber interaksi yang tersedia adalah:

  • InteractionSourceDetected (sumber menjadi aktif)
  • InteractionSourceLost (menjadi tidak aktif)
  • InteractionSourcePressed (ketuk, tekan tombol, atau "Pilih" yang diucapkan)
  • InteractionSourceReleased (akhir ketukan, tombol dirilis, atau akhir "Pilih" diucapkan)
  • InteractionSourceUpdated (memindahkan atau mengubah beberapa status)

Peristiwa untuk pose penargetan historis yang paling akurat cocok dengan pers atau rilis

API polling yang dijelaskan sebelumnya memberikan pose yang diprediksi teruskan pada aplikasi Anda. Meskipun pose yang diprediksi tersebut paling baik untuk merender pengontrol atau objek genggam virtual, pose di masa depan tidak optimal untuk penargetan, karena dua alasan utama:

  • Ketika pengguna menekan tombol pada pengontrol, mungkin ada sekitar 20 md latensi nirkabel melalui Bluetooth sebelum sistem menerima pers.
  • Kemudian, jika Anda menggunakan pose yang diprediksi maju, akan ada prediksi maju 10-20 ms lain yang diterapkan untuk menargetkan waktu ketika foton bingkai saat ini akan mencapai mata pengguna.

Ini berarti bahwa polling memberi Anda pose sumber atau pose kepala yang 30-40 md ke depan dari mana kepala dan tangan pengguna benar-benar kembali ketika pers atau rilis terjadi. Untuk input tangan HoloLens, meskipun tidak ada penundaan transmisi nirkabel, ada penundaan pemrosesan serupa untuk mendeteksi pers.

Untuk menargetkan secara akurat berdasarkan niat asli pengguna untuk menekan tangan atau pengontrol, Anda harus menggunakan pose sumber historis atau pose kepala dari peristiwa input InteractionSourcePressed atau InteractionSourceReleased tersebut.

Anda dapat menargetkan pers atau rilis dengan data pose historis dari kepala pengguna atau pengontrol mereka:

  • Pose kepala pada saat ketika gerakan atau tekan pengontrol terjadi, yang dapat digunakan untuk penargetan untuk menentukan apa yang dilihat pengguna :

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args) {
         var interactionSourceState = args.state;
         var headPose = interactionSourceState.headPose;
         RaycastHit raycastHit;
         if (Physics.Raycast(headPose.position, headPose.forward, out raycastHit, 10)) {
             var targetObject = raycastHit.collider.gameObject;
             // ...
         }
    }
    
  • Sumber berpose pada saat ketika terjadi tekan pengontrol gerakan, yang dapat digunakan untuk penargetan untuk menentukan apa yang pengguna arahkan pengontrol. Ini akan menjadi status pengontrol yang mengalami pers. Jika Anda merender pengontrol itu sendiri, Anda dapat meminta pose pointer daripada pose genggaman, untuk membidik sinar penargetan dari apa yang akan dipertimbangkan pengguna untuk mempertimbangkan ujung alami pengontrol yang dirender:

    void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs args)
    {
         var interactionSourceState = args.state;
         var sourcePose = interactionSourceState.sourcePose;
         Vector3 sourceGripPosition;
         Quaternion sourceGripRotation;
         if ((sourcePose.TryGetPosition(out sourceGripPosition, InteractionSourceNode.Pointer)) &&
             (sourcePose.TryGetRotation(out sourceGripRotation, InteractionSourceNode.Pointer))) {
             RaycastHit raycastHit;
             if (Physics.Raycast(sourceGripPosition, sourceGripRotation * Vector3.forward, out raycastHit, 10)) {
                 var targetObject = raycastHit.collider.gameObject;
                 // ...
             }
         }
    }
    

Contoh penanganan aktivitas

using UnityEngine.XR.WSA.Input;

void Start()
{
    InteractionManager.InteractionSourceDetected += InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost += InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed += InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased += InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated += InteractionManager_InteractionSourceUpdated;
}

void OnDestroy()
{
    InteractionManager.InteractionSourceDetected -= InteractionManager_InteractionSourceDetected;
    InteractionManager.InteractionSourceLost -= InteractionManager_InteractionSourceLost;
    InteractionManager.InteractionSourcePressed -= InteractionManager_InteractionSourcePressed;
    InteractionManager.InteractionSourceReleased -= InteractionManager_InteractionSourceReleased;
    InteractionManager.InteractionSourceUpdated -= InteractionManager_InteractionSourceUpdated;
}

void InteractionManager_InteractionSourceDetected(InteractionSourceDetectedEventArgs args)
{
    // Source was detected
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceLost(InteractionSourceLostEventArgs state)
{
    // Source was lost. This will be after a SourceDetected event and no other events for this
    // source id will occur until it is Detected again
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourcePressed(InteractionSourcePressedEventArgs state)
{
    // Source was pressed. This will be after the source was detected and before it is
    // released or lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceReleased(InteractionSourceReleasedEventArgs state)
{
    // Source was released. The source would have been detected and pressed before this point.
    // This event will not fire if the source is lost
    // args.state has the current state of the source including id, position, kind, etc.
}

void InteractionManager_InteractionSourceUpdated(InteractionSourceUpdatedEventArgs state)
{
    // Source was updated. The source would have been detected before this point
    // args.state has the current state of the source including id, position, kind, etc.
}

Pengontrol Gerakan di MRTK

Anda dapat mengakses gerakan dan pengontrol gerakan dari Manajer input.

Ikuti tutorial

Tutorial langkah demi langkah, dengan contoh penyesuaian yang lebih rinci, tersedia di Mixed Reality Academy:

MR Input 213 - Pengontrol gerakan
MR Input 213 - Pengontrol gerakan

Titik Pemeriksaan Pengembangan Berikutnya

Jika Anda mengikuti perjalanan pengembangan Unity yang telah kami susun, Anda berada di tengah-tengah menjelajahi blok penyusun inti MRTK. Dari sini, Anda dapat melanjutkan ke blok penyusun berikutnya:

Atau lompat ke kemampuan platform dan API Mixed Reality:

Anda selalu dapat kembali ke titik pemeriksaan pengembangan Unity kapan saja.

Lihat juga