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 gerakan komposit tingkat tinggi (GestureRecognizer)

Namespace:UnityEngine.XR.WSA.Input
Jenis: GestureRecognizer, GestureSettings, InteractionSourceKind

Aplikasi Anda juga dapat mengenali gerakan komposit tingkat lebih tinggi untuk sumber input spasial, Ketuk, Tahan, Manipulasi, dan Gerakan navigasi. Anda dapat mengenali gerakan komposit ini di seluruh pengontroltangan dan gerakan menggunakan GestureRecognizer.

Setiap peristiwa Gerakan pada GestureRecognizer menyediakan SourceKind untuk input serta sinar kepala penargetan pada saat peristiwa. Beberapa peristiwa memberikan informasi khusus konteks tambahan.

Hanya ada beberapa langkah yang diperlukan untuk menangkap gerakan menggunakan Gesture Recognizer:

  1. Membuat Gesture Recognizer baru
  2. Tentukan gerakan mana yang akan watch
  3. Berlangganan peristiwa untuk gerakan tersebut
  4. Mulai menangkap gerakan

Membuat Gesture Recognizer baru

Untuk menggunakan GestureRecognizer, Anda harus membuat GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Tentukan gerakan mana yang akan watch

Tentukan gerakan mana yang Anda minati melalui SetRecognizableGestures():

recognizer.SetRecognizableGestures(GestureSettings.Tap | GestureSettings.Hold);

Berlangganan peristiwa untuk gerakan tersebut

Berlangganan peristiwa untuk gerakan yang Anda minati.

void Start()
{
    recognizer.Tapped += GestureRecognizer_Tapped;
    recognizer.HoldStarted += GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted += GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled += GestureRecognizer_HoldCanceled;
}

Catatan

Gerakan Navigasi dan Manipulasi saling eksklusif pada instans GestureRecognizer.

Mulai menangkap gerakan

Secara default, GestureRecognizer tidak memantau input hingga StartCapturingGestures() dipanggil. Ada kemungkinan bahwa peristiwa gerakan dapat dihasilkan setelah StopCapturingGestures() dipanggil jika input dilakukan sebelum bingkai tempat StopCapturingGestures() diproses . GestureRecognizer akan mengingat apakah itu aktif atau mati selama bingkai sebelumnya di mana gerakan benar-benar terjadi, sehingga dapat diandalkan untuk memulai dan menghentikan pemantauan gerakan berdasarkan penargetan tatapan bingkai ini.

recognizer.StartCapturingGestures();

Berhenti menangkap gerakan

Untuk menghentikan pengenalan gerakan:

recognizer.StopCapturingGestures();

Menghapus pengenal isyarat

Ingatlah untuk berhenti berlangganan dari peristiwa berlangganan sebelum menghancurkan objek GestureRecognizer .

void OnDestroy()
{
    recognizer.Tapped -= GestureRecognizer_Tapped;
    recognizer.HoldStarted -= GestureRecognizer_HoldStarted;
    recognizer.HoldCompleted -= GestureRecognizer_HoldCompleted;
    recognizer.HoldCanceled -= GestureRecognizer_HoldCanceled;
}

Merender model pengontrol gerakan di Unity

Model dan teleportasi Pengontrol Gerakan
Model dan teleportasi pengontrol gerakan

Untuk merender pengontrol gerakan di aplikasi yang cocok dengan pengontrol fisik yang dipegang dan diartikulasikan pengguna saat berbagai tombol ditekan, Anda dapat menggunakan prefab MotionController di Mixed Reality Toolkit. Prefab ini secara dinamis memuat model glTF yang benar saat runtime dari driver pengontrol gerakan yang diinstal sistem. Penting untuk memuat model ini secara dinamis daripada mengimpornya secara manual di editor, sehingga aplikasi Anda akan menampilkan model 3D yang akurat secara fisik untuk pengontrol saat ini dan di masa mendatang yang mungkin dimiliki pengguna Anda.

  1. Ikuti instruksi Memulai untuk mengunduh Mixed Reality Toolkit dan menambahkannya ke proyek Unity Anda.
  2. Jika Anda mengganti kamera dengan prefab MixedRealityCameraParent sebagai bagian dari langkah Memulai, Anda sudah siap! Prefab itu mencakup penyajian pengontrol gerakan. Jika tidak, tambahkan Aset/HoloToolkit/Input/Prefabs/MotionControllers.prefab ke adegan Anda dari panel Proyek. Anda mungkin ingin menambahkan prefab tersebut sebagai anak dari objek induk apa pun yang Anda gunakan untuk memindahkan kamera saat pengguna melakukan teleportasi dalam adegan Anda, sehingga pengontrol datang bersama dengan pengguna. Jika aplikasi Anda tidak melibatkan teleportasi, cukup tambahkan prefab di akar adegan Anda.

Melempar objek

Melemparkan objek dalam realitas virtual adalah masalah yang lebih sulit daripada yang terlihat pada awalnya. Seperti kebanyakan interaksi berbasis fisik, ketika melemparkan dalam permainan bertindak dengan cara yang tidak terduga, itu segera jelas dan mematahkan perendaman. Kami telah menghabiskan beberapa waktu untuk memikirkan secara mendalam tentang cara mewakili perilaku melempar yang benar secara fisik, dan telah membuat beberapa panduan, diaktifkan melalui pembaruan pada platform kami, yang ingin kami bagikan dengan Anda.

Anda dapat menemukan contoh bagaimana kami merekomendasikan untuk menerapkan pelemparan di sini. Sampel ini mengikuti empat panduan berikut:

  • Gunakan kecepatan pengontrol alih-alih posisi. Pada pembaruan November untuk Windows, kami memperkenalkan perubahan perilaku ketika dalam status pelacakan posisi ''Perkiraan''. Ketika dalam keadaan ini, informasi kecepatan tentang pengontrol akan terus dilaporkan selama kami percaya akurasinya yang tinggi, yang seringkali lebih panjang dari posisi tetap akurasi tinggi.

  • Menggabungkan kecepatan sudut pengontrol. Logika ini semuanya terkandung dalam throwing.cs file dalam GetThrownObjectVelAngVel metode statis, dalam paket yang ditautkan di atas:

    1. Karena kecepatan sudut dilestarikan, objek yang dilemparkan harus mempertahankan kecepatan sudut yang sama seperti pada saat pelemparan: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Karena pusat massa objek yang dilemparkan kemungkinan tidak berasal dari pose genggaman, kemungkinan memiliki kecepatan yang berbeda dari pengontrol dalam bingkai referensi pengguna. Bagian kecepatan objek yang dikontribusikan dengan cara ini adalah kecepatan tangenial seketika dari pusat massa objek yang dilemparkan di sekitar asal pengontrol. Kecepatan tangenial ini adalah produk silang dari kecepatan sudut pengontrol dengan vektor yang mewakili jarak antara asal pengontrol dan pusat massa objek yang dilemparkan.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. Kecepatan total objek yang dilemparkan adalah jumlah kecepatan pengontrol dan kecepatan tangenial ini: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Perhatikan waktu saat kami menerapkan kecepatan. Ketika tombol ditekan, dibutuhkan waktu hingga 20 md agar peristiwa itu menggelegak melalui Bluetooth ke sistem operasi. Ini berarti bahwa jika Anda melakukan polling untuk perubahan status pengontrol dari ditekan menjadi tidak ditekan atau sebaliknya, informasi pose pengontrol yang Anda dapatkan dengannya benar-benar akan lebih maju dari perubahan status ini. Selanjutnya, pose pengontrol yang disajikan oleh API polling kami diprediksi akan mencerminkan kemungkinan pose pada saat bingkai akan ditampilkan yang bisa lebih dari 20 md di masa mendatang. Ini bagus untuk merender objek yang dipegang, tetapi senyawa masalah waktu kita untuk menargetkan objek saat kami menghitung lintasan untuk saat pengguna melepaskan lemparan. Untungnya, dengan pembaruan November, ketika peristiwa Unity seperti InteractionSourcePressed atau InteractionSourceReleased dikirim, status menyertakan data pose historis dari belakang ketika tombol ditekan atau dirilis. Untuk mendapatkan penyajian pengontrol dan penargetan pengontrol yang paling akurat selama pelemparan, Anda harus menggunakan polling dan peristiwa dengan benar, sebagaimana mestinya:

  • Gunakan pose genggaman. Angular kecepatan dan kecepatan dilaporkan relatif terhadap pose cengkeraman, bukan pose pointer.

Pelemparan akan terus meningkat dengan pembaruan Windows di masa mendatang, dan Anda dapat mengharapkan untuk menemukan informasi lebih lanjut tentang hal itu di sini.

Gerakan dan 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