İşaretçiler

Çağrısı

Bu makalede, Işaretçi mimarisine kıyasla uygulamada işaretçi girişi yapılandırma ve yanıt verme işlemleri açıklanmaktadır

Yeni bir denetleyici algılandığında işaretçiler çalışma zamanında otomatik olarak alınır. Bir denetleyiciye birden fazla işaretçi iliştirilebilir. örneğin, varsayılan işaretçi profiliyle, Windows Mixed Reality denetleyicileri sırasıyla normal seçim ve teleporsyon için bir çizgi ve parabolik işaretçisi alır.

İşaretçi yapılandırması

İşaretçiler, bir ile MRTK içinde giriş sisteminin bir parçası olarak yapılandırılır MixedRealityPointerProfile . Bu tür bir profil MixedRealityInputSystemProfile , MRTK yapılandırma denetçisinde bir öğesine atanır. Işaretçi profili imleci, çalışma zamanında kullanılabilen Işaretçiler türlerini ve bu işaretçilerin hangi bir etkin olduğuna karar vermek için birbirleriyle nasıl iletişim kuracağını belirler.

  • Işaret uzantısı -bir Işaretçinin gameobject ile etkileşime girebileceği maksimum mesafeyi tanımlar.

  • Işaret Raycast katman maskeleri -bu, belirli bir işaretçi ile etkileşime girebileceği ve etkileşim sırasını belirleyen bir layermaskelerin önceliklendirilmiş bir dizisidir. Bu, Işaretçilerin diğer sahne nesnelerinden önce Kullanıcı arabirimi öğeleriyle etkileşime geçmesini sağlamak için yararlı olabilir. İşaretçi profili örneği

İşaretçi seçenekleri yapılandırması

Varsayılan MRTK Işaretçi profili yapılandırması aşağıdaki işaretçi sınıflarını ve kullanıma hazır olan ön uç 'leri içerir. Çalışma zamanında sistem için kullanılabilen işaretçiler listesi, Işaretçi profilinde Işaretçi seçenekleri altında tanımlanmıştır. Geliştiriciler mevcut Işaretçileri yeniden yapılandırmak, yeni Işaretçiler eklemek veya birini silmek için bu listeyi kullanabilir.

İşaretçi seçenekleri profil örneği

Her Işaretçi girişi, aşağıdaki veri kümesi tarafından tanımlanır:

  • Denetleyici türü -bir işaretçinin geçerli olduğu denetleyiciler kümesi.

    • Örneğin, Pokepointer , parmak ve varsayılan olarak yalnızca ifade edilen el denetleyici türünü destekleyecek şekilde işaretlenmiş olan "nesnelerin" bir nesneden sorumludur. İşaretçiler yalnızca bir denetleyici kullanılabilir olduğunda ve belirli bir denetleyici türü , Bu işaretçinin hangi denetleyicilerle oluşturulabileceğini tanımlar.
  • Handedlik -yalnızca belirli bir el için örneklendirmesi için bir işaretçiye izin verir (sol/sağ)

Not

Bir Işaretçi girişinin Handedlik özelliğinin yok olarak ayarlanması, bu işaretçiyi listeden kaldırmak için alternatif olarak sistemden etkin bir şekilde devre dışı bırakır.

  • Işaretçi prefab -bu prefab varlığı, belirtilen denetleyici türü ve adım adım izlenen bir denetleyici izlenmeye başladığında örneklenecektir.

Bir denetleyiciyle ilişkilendirilmiş birden çok işaretçi olması mümkündür. Örneğin, DefaultHoloLens2InputSystemProfile (varlıklar/MRTK/SDK/profiller/HoloLens2/) ' de, ifade edilen el denetleyicisi DefaultHoloLens2InputSystemProfile, Grabpointerve defaultcontrollerpointer (yani ışınu) ile ilişkilendirilir.

Not

MRTK, varlıklarda/MRTK/SDK/Özellikler/UX/Prefabs/işaretçileriçindeki bir işaretçi kümesi sağlar. Yeni bir özel prefab, varlıklar/MRTK/SDK/Özellikler/UX/betikler/işaretçiler veya diğer betiklerin uyguladığı işaretçi betiklerinden birini içerdiği sürece oluşturulabilir .

Varsayılan işaretçi sınıfları

Aşağıdaki sınıflar, yukarıda belirtilen varsayılan mrtk Işaretçisi profilinde kullanılabilen ve tanımlanan hazır mrtk işaretçileridir. Varlıklar/MRTK/SDK/Özellikler/UX/Prefabs/işaretçiler altında sunulan her işaretçi prefab, eklenen işaretçi bileşenlerinden birini içerir.

MRTK varsayılan Işaretçiler

Uzak işaretçiler

LinePointer

Bir taban işaretçisi sınıfı olan Linepointer, işaretçi yönündeki girişin kaynağından (yani, denetleyici) bir çizgi çizer ve bu yönde tek bir Ray dönüştürmeyi destekler. Genellikle, ShellHandRayPointer ve teleport işaretçileri gibi alt sınıflar, temel olarak yaygın işlevselliği sağlayan bu sınıf yerine, örneklenir ve kullanılır (aynı zamanda teleporsyon 'nin nerede bittiğini belirtmek için satırlar çizer).

oculus, vive Windows Mixed Reality gibi hareket denetleyicileri için, döndürme denetleyicinin dönüşüyle eşleştirecektir. HoloLens 2 ifade eden diğer denetleyiciler için, döndürme, sistemin sunduğu işaret pozlanıyla eşleşir.

MRTK Işaretçi çizgisi
CurvePointer

Curvepointer , eğri boyunca çok adımlı ışın Izin vererek linepointer sınıfını genişletir. Bu temel işaretçi sınıfı, çizginin sürekli olarak bir Parabola içinde olduğu teleporsyon işaretçileri gibi eğimli örnekler için yararlıdır.

ShellHandRayPointer

' Dan genişleyen Shellhandraypointer, mrtk işaretçi profiliiçin varsayılan olarak kullanılır. Defaultcontrollerpointer prefab sınıfını uygular.

GGVPointer

gaze/hareket/ses (ggv) işaretçisi olarak da bilinen ggvpointer, 1 stil HoloLens, öncelikle gaze ve aır tap ya da gaze ve sesli seçim etkileşimi aracılığıyla etkileşimlere göz atın ve dokunun. GGV işaretçisinin konumu ve yönü, baş konumu ve dönüşü tarafından çalıştırılır.

TouchPointer

TouchPointer , Unity Touch girişi (ör. dokunmatik ekran) ile çalışmaktan sorumludur. Bu, ekrana dokunmanın bir ışını, kameradaki bir Ray 'un sahnedeki olası bir konuma dönüştürmesinden kaynaklanır.

MousePointer

MousePointer , en çok etkileşimler için bir ekran ve dokunma yerine fare için bir ekranı güçlendirir.

Fare işaretçisi

Not

fare desteği, mrtk içinde varsayılan olarak kullanılamaz, ancak mrtk giriş profiline tür Veri Sağlayıcısı yeni bir giriş ekleyerek ve MixedRealityMouseInputProfile veri sağlayıcısına atayarak etkinleştirilebilir.

Yakın işaretçiler

PokePointer

Pokepointer , "Near ıntergame touchable" öğesini destekleyen oyun nesneleriyle etkileşim kurmak için kullanılır. ekli bir betiğe sahip olan GameObjects NearInteractionTouchable . Unityuı söz konusu olduğunda, bu işaretçi NearInteractionTouchableUnityUIs için arama yapar. PokePointer, en yakın touchable öğesini belirleyebilmek için bir Spburcast kullanır ve, önlanabilir düğmeler gibi işlemleri desteklemek için kullanılır.

GameObject NearInteractionTouchable bileşenini bileşeniyle yapılandırırken, NearInteractionTouchable parametresini düğmenin önüne veya touchable olması gereken başka bir nesneye işaret etmek üzere yapılandırdığınızdan emin olun. Ayrıca, touchable 'in sınırlarının touchable nesnesinin sınırları ile eşleştiğinden emin olun.

Faydalı poke Işaretçisi özellikleri:

  • TouchableDistance: bir touchable yüzeyi ile birlikte kullanılabilecek maksimum uzaklık
  • Görseller: Finger ipucu görselinizi işlemek için kullanılan oyun nesnesi (varsayılan olarak Finger üzerinde halka).
  • Satır: parmak ipucundan etkin giriş yüzeyine çizilecek isteğe bağlı satır.
  • Poke katman maskeleri -işaretçinin hangi olası gameobjects ile etkileşime gireceğini ve deneme için etkileşim sırasını tespit etmek üzere layermaskelerinden oluşan önceliklendirilmiş bir dizi. Bir oyun nesnesi de bir NearInteractionTouchable poke işaretçisi ile etkileşime geçmek için bileşene sahip olması gerektiğini unutmayın.
Poke Işaretçisi
SpherePointer

Spburpointer , etkileşim için en yakın nesneyi tanımlamak üzere UnityEngine. fizik. overlapsphere kullanır . Bu, gibi "grabbable" girişi için kullanışlıdır . PokePointer/NearInteractionTouchable İşlevsel çiftiyle benzer şekilde, Sphere işaretçiyle ınteractable olması için oyun nesnesi, komut dosyası olan bir bileşen içermelidir NearInteractionGrabbable .

Işaretçiye dön

Faydalı Sphere Işaretçi özellikleri:

  • Sphere cast yarıçapı: grabbable nesnelerini sorgulamak için kullanılan Sphere için yarıçap.
  • Yakın nesne kenar boşluğu: bir nesnenin işaretçiye yaklaşmasının tespit olup olmadığını saptamak Için Sphere atama yarıçapının üzerine uzaklık. Neredeyse tüm nesne algılama yarıçapı, nesne kenar boşluğu yakınlarında Sphere cast yarıçapı +
  • Yakın nesne sektörü açısı: yakındaki nesneleri sorgulamak için işaretçinin ileri ekseni etrafında olan açı. IsNearObjectSorgu işlevini koni gibi yapar. Bu, Hololens 2 davranışına uyacak şekilde varsayılan olarak 66 derece ayarlanır.

Sphere işaretçisi yalnızca ileri yönde nesneler için sorguya değiştirildi

  • Yakın nesne yumuşatma faktörü: yakınında nesne algılama için yumuşatma faktörü. Yakın nesne yarıçapı içinde bir nesne algılanırsa, sorgulanan yarıçap, duyarlılığı azaltmak ve bir nesnenin algılama aralığından ayrılmasını zorlaştırmak için nesne yarıçapı * (1 + yakın nesne yumuşatma faktörü) yakınında olur.
  • Katman maskelerini alın-işaretçinin hangi olası gameobjects ile etkileşime gireceğini ve deneme için etkileşim sırasını belirleyen bir layermaskelerin dizi sıralaması. Bir GameObject 'in bir NearInteractionGrabbable Spburpointer ile etkileşimde bulunmak için de olması gerektiğini unutmayın.

    Not

    Uzamsal tanıma katmanı, MRTK tarafından sunulan varsayılan GrabPointer prefab 'de devre dışı bırakılmıştır. Bu, uzamsal kafesle bir Sphere örtüşme sorgusu yapmanın performans etkisini azaltmak için yapılır. Bunu, GrabPointer prefab 'yi değiştirerek etkinleştirebilirsiniz.

  • Gerçekten de görsel bir şekilde değil, işaretçinin yakınında olabilecek çakışlara göz ardı edilip edilmeyeceğini yok Sayın . Bu, yanlışlıkla grabs 'i engelleyebilir ve bir grabbable, ancak görmeyebilirsiniz. Görsel FOV , performans nedenleriyle tipik Frustum yerine bir koni aracılığıyla tanımlanır. Bu koni, kameranın Frustum ile yarı görüntü yüksekliğine (veya dikey FOV) eşit bir yarıçapı ile aynı şekilde ortalandı ve yönlendirilmelidir.
Sphere Işaretçisi

Teleport işaretçileri

  • TeleportPointer , Kullanıcı taşımak için Eylem tamamlandığında (Teleport düğmesine basıldığında) bir teleport isteği yükseltir.
  • ParabolicTeleportPointer , bir işlem yapıldığında (Teleport düğmesine basıldığında) bir parabolik çizgisi raycast ile kullanıcıyı taşıyabilmek için bir teleport isteği yükseltir.
İşaretçi parabolü

Karma Gerçeklik platformları için işaretçi desteği

Aşağıdaki tabloda, MRTK içindeki ortak platformlar için genellikle kullanılan işaretçi türlerinin ayrıntıları verilmiştir. NOTE: Bu platformlara farklı işaretçi türleri eklemek mümkündür. Örneğin, VR 'ye bir poke işaretçisi veya Sphere işaretçisi ekleyebilirsiniz. Ayrıca, bir oyun yüzeyi olan VR cihazları GGV işaretçisini kullanabilir.

İşaretçi OpenVR Windows Mixed Reality HoloLens 1 HoloLens 2
ShellHandRayPointer Geçerli Geçerli Geçerli
TeleportPointer Geçerli Geçerli
GGVPointer Geçerli
Spburpointer Geçerli
PokePointer Geçerli

Kod aracılığıyla işaretçi etkileşimleri

İşaretçi olayı arabirimleri

Aşağıdaki arayüzlerden bir veya daha fazlasını uygulayan ve ile bir GameObject 'e atanan MonoBehaviours, Collider ilişkili arabirim tarafından tanımlanan işaretçi etkileşimleri olaylarını alır.

Olay Description İşleyici
Odak değiştirilmeden veya odağa geçmeden önce Hem oyunun hem de bir işaretçinin her değişiklik yaptığı her sefer odağı kaybetmesi durumunda oluşur. IMixedRealityFocusChangedHandler
Odak giriş/çıkış Oyun nesnesinde, ilk işaretçi girdiğinde ve son işaretçi onu terk ettiğinde odağı kaybetmesi durumunda odak elde eden bir harekete geçirilir. IMixedRealityFocusHandler
İşaretçi aşağı/sürüklenen/yukarı/tıklandı Rapor işaretçisi basma, sürükleme ve serbest bırakma için oluşturulur. IMixedRealityPointerHandler
Dokunma başlatıldı/güncelleştirildi/tamamlandı Dokunma etkinliğini raporlamak için benzeyen dokunma duyarlı işaretçiler tarafından oluşturulur PokePointer . IMixedRealityTouchHandler

Not

IMixedRealityFocusChangedHandler ve IMixedRealityFocusHandler üzerinde oluşturuldukları nesnelerde işlenmelidir. Odak olaylarını küresel olarak, diğer giriş olaylarının aksine, genel olay işleyicisi odağa göre olayların alınmasını engellemez (olay, hem genel işleyici hem de odağa karşılık gelen bir nesne tarafından alınır).

Eylemde işaretçi girişi olayları

İşaretçi girişi olayları, MRTK giriş sistemi tarafından normal giriş olaylarıgibi benzer bir şekilde tanınır ve işlenir. İşaretçi giriş olaylarının farkı yalnızca, giriş olayını tetikleyen işaretçiye ve tüm genel giriş işleyicilerine göre odaklanmakta olan GameObject tarafından işlenmesidir. Normal giriş olayları, tüm etkin işaretçiler için odak içindeki GameObjects tarafından işlenir.

  1. MRTK giriş sistemi bir giriş olayını algılıyor
  2. MRTK giriş sistemi, giriş olayı için ilgili arabirim işlevini kayıtlı tüm genel giriş işleyicilerine tetikleyen
  3. Giriş sistemi, olayı tetikleyen işaretçi için hangi GameObject 'in odağa sahip olduğunu belirler
    1. Giriş sistemi, tüm eşleşen bileşenler için odaklanmış oyun nesnesi üzerinde ilgili arabirim işlevini harekete geçirme Unity 'Nin olay sistemini kullanır
    2. Herhangi bir noktada bir giriş olayı kullanılmış olarak işaretlenmişse, işlem sona acaktır ve daha fazla gameobjects geri çağırmaları almaz.
      • Örnek: arabirimi uygulayan bileşenler, IMixedRealityFocusHandler bir GameObject kazancı için aranır veya odağı kaybeder
      • Note: geçerli oyun nesnesinde istenen arabirimle eşleşen hiçbir bileşen bulunamazsa, Unity olay sistemi üst oyun nesnesini aramak üzere balon oluşturacak.
  4. Kayıtlı bir genel giriş işleyicisi yoksa ve eşleşen bileşen/arabirim ile hiçbir GameObject bulunmazsa, giriş sistemi her geri dönüş kayıtlı giriş işleyicilerini çağırır

Örnek

Aşağıda, bir işaretçi odağı alıp veya bir işaretçi nesneyi seçtiğinde eklenen oluşturucunun rengini değiştiren örnek bir komut dosyası verilmiştir.

public class ColorTap : MonoBehaviour, IMixedRealityFocusHandler, IMixedRealityPointerHandler
{
    private Color color_IdleState = Color.cyan;
    private Color color_OnHover = Color.white;
    private Color color_OnSelect = Color.blue;
    private Material material;

    private void Awake()
    {
        material = GetComponent<Renderer>().material;
    }

    void IMixedRealityFocusHandler.OnFocusEnter(FocusEventData eventData)
    {
        material.color = color_OnHover;
    }

    void IMixedRealityFocusHandler.OnFocusExit(FocusEventData eventData)
    {
        material.color = color_IdleState;
    }

    void IMixedRealityPointerHandler.OnPointerDown(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerDragged(
         MixedRealityPointerEventData eventData) { }

    void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
    {
        material.color = color_OnSelect;
    }
}

Sorgu işaretçileri

Hangi işaretçilerin bunlara iliştirilmekte olduğunu saptamak için kullanılabilir giriş kaynakları (yani, kullanılabilir) aracılığıyla döngüden etkin olan tüm işaretçileri toplamak mümkündür.

var pointers = new HashSet<IMixedRealityPointer>();

// Find all valid pointers
foreach (var inputSource in CoreServices.InputSystem.DetectedInputSources)
{
    foreach (var pointer in inputSource.Pointers)
    {
        if (pointer.IsInteractionEnabled && !pointers.Contains(pointer))
        {
            pointers.Add(pointer);
        }
    }
}

Birincil işaretçi

Geliştiriciler, odağın birincil işaretçisi değiştiğinde bildirim almak için FocusProviders PrimaryPointerChanged olayına abone olabilir. Bu, kullanıcının şu anda Gaze veya bir el Ray ya da başka bir giriş kaynağı aracılığıyla bir sahneye etkileşime girmekte olup olmadığını belirlemek için son derece yararlı olabilir.

private void OnEnable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.SubscribeToPrimaryPointerChanged(OnPrimaryPointerChanged, true);
}

private void OnPrimaryPointerChanged(IMixedRealityPointer oldPointer, IMixedRealityPointer newPointer)
{
    ...
}

private void OnDisable()
{
    var focusProvider = CoreServices.InputSystem?.FocusProvider;
    focusProvider?.UnsubscribeFromPrimaryPointerChanged(OnPrimaryPointerChanged);

    // This flushes out the current primary pointer
    OnPrimaryPointerChanged(null, null);
}

PrimaryPointerExample(Varlıklar/MRTK/örnekler/gösteriler/Input/sahneler/PrimaryPointer) sahnesi, PrimaryPointerChangedHandler Yeni bir birincil işaretçiye yanıt vermek için olaylarının nasıl kullanılacağını gösterir.

Birincil Işaretçi örneği

İşaretçi sonucu

İşaretçi Result özelliği, odağı olan nesneyi belirlemede kullanılan sahne sorgusunun geçerli sonucunu içerir. Bir raycast işaretçisi için, hareket denetleyicileri için varsayılan olarak oluşturulanlar, giriş ve yan ışınları gibi,

private void IMixedRealityPointerHandler.OnPointerClicked(MixedRealityPointerEventData eventData)
{
    var result = eventData.Pointer.Result;
    var spawnPosition = result.Details.Point;
    var spawnRotation = Quaternion.LookRotation(result.Details.Normal);
    Instantiate(MyPrefab, spawnPosition, spawnRotation);
}

PointerResultExampleSahne (varlıklar/MRTK/örnekler/gösteriler/Input/sahneler/pointerresult/Pointerresultexörnek. Unity), Result isabet konumunda bir nesne oluşturma için işaretçiyi nasıl kullanacağınızı gösterir.

İşaretçi sonucu

İşaretçileri devre dışı bırak

İşaretçileri etkinleştirmek ve devre dışı bırakmak için (örneğin, el ışını devre dışı bırakmak için), PointerBehavior ile belirli bir işaretçi türü için ayarlayın PointerUtils .

// Disable the hand rays
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff);

// Disable hand rays for the right hand only
PointerUtils.SetHandRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Right);

// Disable the gaze pointer
PointerUtils.SetGazePointerBehavior(PointerBehavior.AlwaysOff);

// Set the behavior to match HoloLens 1
// Note, if on HoloLens 2, you must configure your pointer profile to make the GGV pointer show up for articulated hands.
public void SetHoloLens1()
{
    PointerUtils.SetPokePointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGrabPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetRayPointerBehavior(PointerBehavior.AlwaysOff, Handedness.Any);
    PointerUtils.SetGGVBehavior(PointerBehavior.Default);
}

PointerUtilsTurnPointersOnOff Daha fazla örnek için bkz. ve.

Düzenleyici aracılığıyla işaretçi etkileşimleri

Tarafından işlenen işaretçi olayları için IMixedRealityPointerHandler , mrtk, PointerHandler işaretçi olaylarının doğrudan Unity olayları aracılığıyla işlenmesine izin veren bileşen biçiminde daha fazla kolaylık sağlar.

İşaretçi Işleyicisi

İşaretçi uzantısı

Uzak işaretçilerin, sahnedeki diğer nesnelerle ne kadar raya dönüştürme ve etkileşime gireceğini sınırlayan ayarları vardır. Varsayılan olarak, bu değer 10 ölçüm olarak ayarlanır. bu değer, HoloLens kabuğun davranışıyla tutarlı kalacak şekilde seçilmiştir.

Bu, DefaultControllerPointer prefab 'ın ShellHandRayPointer bileşen alanları güncelleştirilerek değiştirilebilir:

Işaretçi uzantısı -bu, işaretçilerin etkileşimde olacağı maksimum mesafeyi denetler.

Varsayılan Işaretçi uzantısı -bu, işaretçi hiçbir şeyle etkileşime geçmediğinden işlenecek işaretçi ışın/çizgisi uzunluğunu denetler.

Ayrıca bkz.