Bagikan melalui


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 SDK Unity XR, 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 pengontrol tangan dan gerakan menggunakan GestureRecognizer.

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

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

  1. Membuat Gesture Recognizer baru
  2. Tentukan gerakan mana yang harus diwaspadai
  3. Berlangganan acara untuk gerakan tersebut
  4. Mulai mengambil gerakan

Membuat Gesture Recognizer baru

Untuk menggunakan GestureRecognizer, Anda harus membuat GestureRecognizer:

GestureRecognizer recognizer = new GestureRecognizer();

Tentukan gerakan mana yang harus diwaspadai

Tentukan gerakan mana yang Anda minati melalui SetRecognizableGestures():

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

Berlangganan acara 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 mengambil 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 menyala 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 mengambil gerakan

Untuk menghentikan pengenalan gerakan:

recognizer.StopCapturingGestures();

Menghapus pengenal gerakan

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 Anda 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 siap melakukannya! Prefab tersebut mencakup penyajian pengontrol gerakan. Jika tidak, tambahkan Aset/HoloToolkit/Input/Prefabs/MotionControllers.prefab ke adegan Anda dari panel Proyek. Anda akan ingin menambahkan prefab tersebut sebagai anak dari objek induk apa pun yang Anda gunakan untuk memindahkan kamera saat pengguna teleport dalam adegan Anda, sehingga pengontrol datang bersama dengan pengguna. Jika aplikasi Anda tidak melibatkan teleportasi, cukup tambahkan prefab di akar adegan Anda.

Melemparkan 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 dengan berpikir mendalam tentang cara mewakili perilaku melempar yang benar secara fisik, dan telah menghasilkan 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 ke 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.

  • Masukkan 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 dipertahankan, objek yang dilemparkan harus mempertahankan kecepatan sudut yang sama seperti yang ada pada saat lemparan: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Karena pusat massa objek yang dilemparkan kemungkinan tidak pada asal pose cengkeraman, kemungkinan memiliki kecepatan yang berbeda dari pengontrol dalam bingkai referensi pengguna. Bagian dari kecepatan objek yang berkontribusi 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 dengan cerah waktu di mana kita menerapkan kecepatan. Ketika tombol ditekan, dibutuhkan waktu hingga 20 ms agar peristiwa tersebut menggelegak melalui Bluetooth ke sistem operasi. Ini berarti bahwa jika Anda melakukan polling untuk perubahan status pengontrol dari ditekan menjadi tidak ditekan atau sebaliknya, pengontrol memposisikan informasi yang Anda dapatkan dengannya akan benar-benar lebih maju dari perubahan status ini. Selanjutnya, pose pengontrol yang disajikan oleh API polling kami diprediksi untuk mencerminkan kemungkinan pose pada saat bingkai akan ditampilkan yang bisa lebih dari 20 ms di masa depan. 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:

    • Untuk rendering pengontrol setiap bingkai, aplikasi Anda harus memposisikan GameObject pengontrol pada pose pengontrol yang diprediksi maju untuk waktu foton bingkai saat ini. Anda mendapatkan data ini dari API polling Unity seperti XR. InputTracking.GetLocalPosition atau XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Untuk penargetan pengontrol pada pers atau rilis, aplikasi Anda harus melakukan raycast dan menghitung lintasan berdasarkan pose pengontrol historis untuk peristiwa pers atau rilis tersebut. Anda mendapatkan data ini dari API peristiwa Unity, seperti InteractionManager.InteractionSourcePressed.
  • Gunakan pose cengkeraman. Kecepatan dan kecepatan sudut dilaporkan relatif terhadap pose cengkeraman, bukan pose pointer.

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

Pengontrol Gerakan dan Gerakan di MRTK

Anda dapat mengakses gerakan dan pengontrol gerakan dari Manajer input.

Ikuti bersama dengan tutorial

Tutorial langkah demi langkah, dengan contoh kustomisasi 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 bangunan inti MRTK. Dari sini, Anda dapat melanjutkan ke blok penyusun berikutnya:

Atau lompat ke kemampuan dan API platform Mixed Reality:

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

Lihat juga