Aracılığıyla paylaş


Unity'de Hareketler

Unity'de bakışlarınız üzerinde harekete geçmenin iki önemli yolu vardır: HoloLens ve Tam Ekran HMD'de el hareketleri ve hareket denetleyicileri. Unity'de aynı API'ler aracılığıyla her iki uzamsal giriş kaynağının verilerine erişebilirsiniz.

Unity, Windows Karma Gerçeklik için uzamsal giriş verilerine erişmek için iki birincil yol sağlar. Ortak Input.GetButton/Input.GetAxis API'leri birden çok Unity XR SDK'sı üzerinde çalışırken, Windows Karma Gerçeklik'a özgü InteractionManager/GestureRecognizer API'si tüm uzamsal giriş verilerini kullanıma sunar.

Üst düzey bileşik hareket API'leri (GestureRecognizer)

Ad Alanı: UnityEngine.XR.WSA.Input
Türler: GestureRecognizer, GestureSettings, InteractionSourceKind

Uygulamanız uzamsal giriş kaynakları, Dokunma, Tutma, Düzenleme ve Gezinti hareketleri için daha üst düzey bileşik hareketleri de tanıyabilir. GestureRecognizer kullanarak bu bileşik hareketleri hem ellerde hem de hareket denetleyicilerinde tanıyabilirsiniz.

GestureRecognizer üzerindeki her Gesture olayı, giriş için SourceKind ve olay sırasında hedeflenen baş ışınını sağlar. Bazı olaylar bağlama özgü ek bilgiler sağlar.

Hareket Tanıma kullanarak hareketleri yakalamak için yalnızca birkaç adım gerekir:

  1. Yeni bir Hareket Tanıyıcısı oluşturma
  2. Hangi hareketlerin izleneceğini belirtin
  3. Bu hareketler için olaylara abone olma
  4. Hareketleri yakalamaya başlama

Yeni bir Hareket Tanıyıcısı oluşturma

GestureRecognizer'ı kullanmak için bir GestureRecognizer oluşturmuş olmanız gerekir:

GestureRecognizer recognizer = new GestureRecognizer();

Hangi hareketlerin izleneceğini belirtin

SetRecognizableGestures() aracılığıyla hangi hareketlerle ilgilendiğinizi belirtin:

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

Bu hareketler için olaylara abone olma

İlgilendiğiniz hareketler için olaylara abone olun.

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

Not

Gezinti ve Düzenleme hareketleri, GestureRecognizer örneğinde birbirini dışlar.

Hareketleri yakalamaya başlama

Varsayılan olarak, Bir GestureRecognizer StartCapturingGestures() çağrılana kadar girişi izlemez. StopCapturingGestures() işleminin işlendiği çerçeveden önce giriş gerçekleştirildiyse StopCapturingGestures() çağrıldıktan sonra bir hareket olayı oluşturulabilir. GestureRecognizer, hareketin gerçekten gerçekleştiği önceki karede açık mı yoksa kapalı mı olduğunu anımsar ve bu nedenle bu çerçevenin bakış hedeflemesine göre hareket izlemeyi başlatmak ve durdurmak güvenilirdir.

recognizer.StartCapturingGestures();

Hareketleri yakalamayı durdurma

Hareket tanımayı durdurmak için:

recognizer.StopCapturingGestures();

Hareket tanıyıcısını kaldırma

GestureRecognizer nesnesini yok etmeden önce abone olunan olayların aboneliğini kaldırmayı unutmayın.

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

Unity'de hareket denetleyicisi modelini işleme

Hareket Denetleyicisi modeli ve ışınlanma
Hareket denetleyicisi modeli ve ışınlanma

Uygulamanızda, kullanıcılarınızın tuttuğu fiziksel denetleyicilerle eşleşen hareket denetleyicilerini işlemek ve çeşitli düğmelere basıldığında ifade etmek için, Karma Gerçeklik Araç Seti'nde MotionController prefabını kullanabilirsiniz. Bu prefabrik, sistemin yüklü hareket denetleyicisi sürücüsünden çalışma zamanında doğru glTF modelini dinamik olarak yükler. Uygulamanızın kullanıcılarınızın sahip olabileceği mevcut ve gelecekteki denetleyiciler için fiziksel olarak doğru 3B modeller göstermesi için bu modelleri düzenleyicide el ile içeri aktarmak yerine dinamik olarak yüklemek önemlidir.

  1. Karma Gerçeklik Araç Seti'ni indirmek ve Unity projenize eklemek için Başlarken yönergelerini izleyin.
  2. Başlarken adımlarının bir parçası olarak kameranızı MixedRealityCameraParent prefab ile değiştirdiyseniz, başlamaya hazırsınız! Bu prefabrik, hareket denetleyicisi işlemeyi içerir. Aksi takdirde, Proje bölmesinden sahnenize Assets/HoloToolkit/Input/Prefabs/MotionControllers.prefab ekleyin. Kullanıcı sahnenizin içinde ışınlandığında kamerayı hareket ettirmek için kullandığınız üst nesnenin alt öğesi olarak eklemek istersiniz; böylece denetleyiciler kullanıcıyla birlikte gelir. Uygulamanız ışınlanma içermiyorsa, sahnenizin köküne prefabrik eklemeniz yeter.

Nesne oluşturma

Nesneleri sanal gerçeklikte atmak, ilk bakışta göründüğünden daha zor bir sorundur. Çoğu fiziksel tabanlı etkileşimde olduğu gibi, oyunu atarken beklenmedik bir şekilde hareket eder, hemen açıktır ve daldırıcıyı kırar. Fiziksel olarak doğru fırlatma davranışını nasıl temsil edeceğini derinlemesine düşünerek biraz zaman harcadık ve platformumuzdaki güncelleştirmeler aracılığıyla etkinleştirilen ve sizinle paylaşmak istediğimiz birkaç yönerge bulduk.

Oluşturma işlemini nasıl gerçekleştirmenizi önerdiğimizi gösteren bir örneği burada bulabilirsiniz. Bu örnek şu dört yönergeyi izler:

  • Konum yerine denetleyicinin hızını kullanın. Windows'un Kasım güncelleştirmesi ile ''Yaklaşık'' konumsal izleme durumundayken davranışta bir değişiklik yaptık. Bu durumdayken, kontrolör hakkındaki hız bilgileri, yüksek doğruluğuna inandığımız sürece bildirilmeye devam eder ve bu genellikle konumdan daha uzundur ve yüksek doğrulukta kalır.

  • Denetleyicinin açısal hızını dahil edin. Bu mantığın tümü statik yöntemdeki dosyada throwing.cs GetThrownObjectVelAngVel , yukarıda bağlantılı paketin içinde bulunur:

    1. Açısal hız korundukçe, oluşturulan nesnenin atma anındaki açısal hızın aynısını koruması gerekir: objectAngularVelocity = throwingControllerAngularVelocity;

    2. Oluşan nesnenin kütle merkezi büyük olasılıkla kavrama pozunun kaynağında olmadığından, muhtemelen kullanıcının referans çerçevesindeki denetleyiciden farklı bir hıza sahiptir. Nesnenin hızının bu şekilde katkıda bulunduğu kısım, kontrolör kaynağı çevresinde oluşan nesnenin kütle merkezinin anlık tanjantel hızıdır. Bu tanjantel hız, denetleyicinin açısal hızının çarpım ürünüdür ve vektör, denetleyicinin çıkış noktası ile atılan nesnenin kütle merkezi arasındaki mesafeyi temsil eder.

      Vector3 radialVec = thrownObjectCenterOfMass - throwingControllerPos;
      Vector3 tangentialVelocity = Vector3.Cross(throwingControllerAngularVelocity, radialVec);
      
    3. Oluşturulan nesnenin toplam hızı, denetleyicinin hızının toplamı ve bu tanjantel hızdır: objectVelocity = throwingControllerVelocity + tangentialVelocity;

  • Hızı uyguladığımız zamana çok dikkat edin. Bir düğmeye basıldığında, bu olayın Bluetooth üzerinden işletim sistemine kadar kabarcık oluşturması 20 ms'ye kadar sürebilir. Başka bir deyişle, bir denetleyici durumunun basılmayan veya basılmayan durum değişikliğini yoklarsanız, denetleyiciyle birlikte elde ettiğiniz bilgileri ortaya çıkarması durumundaki bu değişikliğin önünde olacaktır. Ayrıca, yoklama API'miz tarafından sunulan denetleyici pozunun, çerçevenin görüntüleneceği zamandaki olası bir pozu yansıtacağı tahmin edilir ve bu da gelecekte 20 ms'den fazla olabilir. Bu, tutulan nesneleri işlemek için iyidir, ancak kullanıcının atma işlemini serbest bıraktığı an için yörüngeyi hesapladığımız için nesneyi hedeflemek için zaman sorunumuzu bir hale dönüştürür. Neyse ki Kasım güncelleştirmesi ile InteractionSourcePressed veya InteractionSourceReleased gibi bir Unity olayı gönderildiğinde, durum düğmeye basıldığında veya yayınlandığında geçmişe dönük poz verilerini içerir. Atmalar sırasında en doğru denetleyici işleme ve denetleyici hedeflemesini almak için, yoklama ve olay oluşturmayı uygun şekilde kullanmanız gerekir:

    • Her çerçeveyi işlemek için uygulamanız geçerli çerçevenin foton süresi için oyun kumandasının GameObject'ini ileriye dönük tahmin edilen denetleyici pozu konumuna yerleştirmelidir. Bu verileri XR gibi Unity yoklama API'lerinden alırsınız. InputTracking.GetLocalPosition veya XR. WSA. Input.InteractionManager.GetCurrentReading.
    • Bir basın veya yayın üzerine kontrolör hedeflemesi için, uygulamanız bu basın veya yayın olayı için geçmiş denetleyici duruşunu temel alarak yörüngeleri raycast yapmalı ve hesaplamalıdır. Bu verileri InteractionManager.InteractionSourcePressed gibi Unity olay api'lerinden alırsınız.
  • Kavrama pozunu kullanın. Angular hız ve hız, işaretçi pozuna göre değil kavrama pozuna göre bildirilir.

Oluşturma işlemi, gelecekteki Windows güncelleştirmeleriyle birlikte gelişmeye devam edecektir ve burada bu konuda daha fazla bilgi bulabilirsiniz.

MRTK'da Hareket ve Hareket Denetleyicileri

Giriş Yöneticisi'nden hareket ve hareket denetleyicisine erişebilirsiniz.

Öğreticilerle birlikte izleyin

Daha ayrıntılı özelleştirme örnekleri içeren adım adım öğreticiler Karma Gerçeklik Academy'de mevcuttur:

MR Input 213 - Hareket denetleyicisi
MR Input 213 - Hareket denetleyicisi

Sonraki Geliştirme Denetim Noktası

Sunduğumuz Unity geliştirme yolculuğunu takip ediyorsanız MRTK temel yapı taşları keşfetmenin tam ortasındasınız demektir. Buradan sonraki yapı taşına devam edebilirsiniz:

İsterseniz Karma Gerçeklik platform özelliklerine ve API'lerine atlayabiliriz:

İstediğiniz zaman Unity geliştirme denetim noktalarına geri dönebilirsiniz.

Ayrıca bkz.