El menüsü — MRTK2

El Menüsü UX Örneği

El menüleri, kullanıcıların sık kullanılan işlevler için el ile eklenen kullanıcı arabirimini hızla getirmesine olanak sağlar. Diğer nesnelerle etkileşim kurarken yanlış etkinleştirmeyi önlemek için, el menüsünde 'Düz El İste' ve 'Bakış Etkinleştirmeyi Kullan' gibi seçenekler sağlanır. İstenmeyen etkinleştirmeyi önlemek için bu seçenekleri kullanmanız önerilir.

El menüsü örnekleri

HandMenuExamples.unity sahnesi klasör altındadır MRTK/Examples/Demos/HandTracking/Scenes . Sahne çalışırken yalnızca seçili durumdaki menü türünü etkinleştirir.
HandMenu_ExampleScene

Bu el menüsü prefablerini klasör altında MRTK/Examples/Common/Prefabs bulabilirsiniz.

HandMenu_Small_HideOnHandDrop ve HandMenu_Medium_HideOnHandDrop

Bu iki örnek, OnFirstHandDetected() ve OnLastHandLost() olaylarında menüyü göstermek ve gizlemek için MenuContent nesnesini etkinleştirmeniz ve devre dışı bırakmanız yeterlidir.
HandMenu_ExampleScene 1
HandMenu_ExampleScene 2

HandMenu_Large_WorldLock_On_GrabAndPull

Daha uzun etkileşim süresi gerektiren daha karmaşık menüler için menüyü dünya kilitlemesi önerilir. Bu örnekte kullanıcı, OnFirstHandDetected() ve OnLastHandLost() olaylarında MenuContent'i etkinleştirmeye ve devre dışı bırakmaya ek olarak menüyü alıp dünya kilidine alabilir.
HandMenu_ExampleScene 3

Arka plakalar ManipulationHandler onu kavranabilir ve taşınabilir yapar. Düzenleme Başlatıldı olayında, SolverHandler.UpdateSolvers menüyü dünya kilitlemek için devre dışı bırakılır. Ayrıca, görev tamamlandığında kullanıcının menüyü kapatmasına izin vermek için Kapat düğmesini gösterir. İşleme Sona Erdi olayında, kullanıcının palmiyeyi yükselterek ve bakarak menüyü yeniden ele getirmesine izin vermek için HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine öğesini çağırır.
HandMenu_ExampleScene 4

Kapat düğmesi SolverHandler.UpdateSolvers'ı yeniden etkinleştirir ve MenuContent'i gizler.
HandMenu_ExampleScene 5

HandMenu_Large_AutoWorldLock_On_HandDrop

Bu örnek HandMenu_Large_WorldLock_On_GrabAndPull benzerdir. Tek fark, menünün el bırakmada otomatik olarak dünya kilitli olmasıdır. Bu davranış, OnLastHandLost() olayında MenuContent gizlenmeyerek işlenir. Alma & çekme davranışı HandMenu_Large_WorldLock_On_GrabAndPull örnekle aynıdır.

Betikler

Davranış, HandConstraint izlenen nesneyi el ile kısıtlanmış içerik (el kullanıcı arabirimi, menüler vb.) için güvenli bir bölgeyle kısıtlayan bir çözücü sağlar. Güvenli bölgeler el ile kesişmeyecek alanlar olarak kabul edilir. Avucu kullanıcıya dönük olduğunda çözücü izlenen nesnesini etkinleştirmenin yaygın bir davranışını göstermek için türetilmiş bir adlı HandConstraintPalmUp sınıf HandConstraint da eklenir.

Daha fazla belge için her HandConstraint özellik için kullanılabilen araç ipuçlarına bakın. Aşağıda birkaç özellik daha ayrıntılı olarak tanımlanmıştır.

HandMenu_ExampleScene Palmiye yukarı
  • Güvenli Bölge: Güvenli bölge, içeriğin kısıtlandığı yeri belirtir. El ile çakışmasını önlemek ve etkileşim kalitesini artırmak için içeriğin Ulnar Tarafına yerleştirilmesi önerilir. Güvenli bölgeler, bir düzleme ortogonal olarak yansıtılan el yönlendirmesi kameranın görünümüne alınarak ve ellerin etrafındaki sınırlayıcı bir kutuya karşı ışınla çizilerek hesaplanır. Güvenli bölgeler, birlikte IMixedRealityHand çalışacak şekilde tanımlanır ancak diğer denetleyici türleriyle de çalışır. Her bir güvenli bölgenin farklı denetleyici türlerinde neyi temsil ettiği araştırılır.

  • Kameraya Bakana Kadar Elinizi Takip Edin Bu ayar etkinken, menü bakışla yeterince hizalanana kadar çözücü el döndürmesini izler ve bu noktada kameraya bakar. Bu davranış, Çözücü ile GazeAlignment açısı farklılık gösterdiğinden, HandConstraintSolver'daki SolverRotationBehavior'ı LookAtTrackedObject'ten LookAtMainCamera'ya değiştirerek çalışır.

HandMenu Güvenli Bölgeleri
  • Etkinleştirme Olayları: Şu anda HandConstraint dört etkinleştirme olayını tetikler. Bu olaylar, benzersiz HandConstraint davranışlar oluşturmak için birçok farklı bileşimde kullanılabilir. Bu davranışların örnekleri için altındaki MRTK/Examples/Demos/HandTracking/Scenes/ HandBasedMenuExample görünümüne bakın.

    • OnHandActivate: Bir el IsHandActive yöntemini karşıladığında tetiklenir.
    • OnHandDeactivate: IsHandActive yöntemi artık karşılandığında tetiklenir.
    • OnFirstHand Algılandı: El izleme durumu, görünümdeki ilk elden görünümde el izleme durumu değiştiğinde gerçekleşir.
    • OnLastHandLost: El izleme durumu görünümde en az bir elden görünümde olmayan ellere değiştiğinde gerçekleşir.
  • Çözücü Etkinleştirme/Devre Dışı Bırakma Mantığı: Şu anda mantığı etkinleştirme ve devre dışı bırakma HandConstraintPalmUp önerisi, nesneyi devre dışı bırakmak/etkinleştirmek yerine Çözücü'nün UpdateSolver değerini kullanarak yapmaktır. Bu davranış, ekli menünün ManipulationHandler "OnManipulationStarted/Ended" olaylarından sonra tetiklenen düzenleyici tabanlı kancalar aracılığıyla örnek sahnede görülebilir.

    • El kısıtlama mantığını durdurma: El kısıtlanmış nesnesini etkinleştirme/devre dışı bırakma mantığını durduracak (veya çalıştırmayacak) şekilde ayarlamaya çalışırken, HandConstraintPalmUp'ı devre dışı bırakmak yerine UpdateSolver'ı False olarak ayarlayın.
      • Bakış tabanlı (hatta bakış tabanlı olmayan) Yeniden Ekleme mantığını etkinleştirmek istiyorsanız, HandConstraintPalmUp.StartWorldLockReattachCheckCoroutine() işlevini çağırarak izleyin. Bu çağrı bir eş yordam tetikler ve ardından "IsValidController" ölçütlerinin karşılanıp karşılanmadığını denetlemeye devam eder ve UpdateSolver'ı bir kez olduğunda (veya nesne devre dışı bırakıldıktan) True olarak ayarlar.
    • El kısıtlama mantığını başlatma: El kısıtlanmış nesneyi elinizi yeniden takip etmeye başlayacak şekilde ayarlamaya çalışırken (etkinleştirme ölçütlerini karşılayıp karşılamadığına bağlı olarak), ÇözücüHandler'ın UpdateSolver değerini true olarak ayarlayın.
  • Mantığı Yeniden Ekle: Çözücü'nün UpdateSolver değerinin Doğru olup olmamasına bakılmaksızın, şu anda HandConstraintPalmUp hedef nesneyi izlenen noktaya otomatik olarak yeniden takabiliyor. Bu davranış, handConstraintPalmUp'ın StartWorldLockReattachCheckCoroutine() işlevi, dünya tarafından kilitlendikten sonra çağrılarak gerçekleştirilir (bu durumda, Çözücü'nün UpdateSolver değerini False olarak etkin bir şekilde ayarlar).

Ayrıca bkz.