Neredeyse etkileşim ekleme

Yakın etkileşimler, dokuna ve grabs biçiminde gelir. Dokunma ve alma olayları, sırasıyla Pokepointer ve spburpointertarafından işaretçi olayları olarak oluşturulur.

Belirli bir oyun nesnesi üzerinde dokunarak ve/veya giriş olaylarını almak için üç temel adım gereklidir.

  1. İlgili işaretçinin ana mrtk yapılandırma profilindekayıtlı olduğundan emin olun.
  2. İstenen Oyunobject 'in uygun bir veya dokunmatik betik bileşenine sahip olduğundan emin olun .
  3. Giriş veya dokunma olaylarını dinlemek için, ekli bir betikte, Istenen oyunnesnesine bir giriş işleyicisi arabirimi uygulayın.

Etkileşim ekleme

  1. Bir Spburpointer 'ın mrtk işaretçi profilindekayıtlı olduğundan emin olun.

    varsayılan mrtk profili ve varsayılan HoloLens 2 profili zaten bir spburpointeriçeriyor. Bunlardan biri, mrtk yapılandırma profili seçilerek ve girişişaretçileriişaretçisi seçeneklerinegidilerek bir spburpointer 'ın oluşturulacağını belirtebilir. Varsayılan GrabPointer prefab (varlıklar/MRTK/SDK/Özellikler/UX/Prefabs/işaretçiler) bir GrabPointer listelenmiş olmalıdır. Özel bir prefab, sınıfı uyguladığı sürece kullanılabilir SpherePointer .

    Işaretçi profili örneğini alın

    Varsayılan değer işaretçisi, varsayılan HoloLens 2 arabirimiyle eşleşmesi için, gelen nokta etrafında bir koni içindeki yakındaki nesneler için sorgular.

    Elde eden Işaretçi

  2. Pabbable olması gereken GameObject üzerinde, bir Collider ve bir de ekleyin NearInteractionGrabbable .

    GameObject katmanının bir grabbable katmanında olduğundan emin olun. Varsayılan olarak, uzamsal tanıma ve Ignore raya 'leri hariç tüm katmanlar, grabbable ' tur. Grabpointer prefab Içindeki katman maskelerini inceleyerek hangi katmanların ihlal olduğunu görün.

  3. Oyunıobject veya üst öğelerinden birinde, arabirimini uygulayan bir betik bileşeni ekleyin IMixedRealityPointerHandler . İle nesnenin herhangi bir üst öğesi NearInteractionGrabbable de işaretçi olaylarını alabilir.

Örnek kod örneği

Aşağıda, bir olay dokunma veya giriş olduğunda yazdırılacak bir komut dosyası verilmiştir. İlgili IMixedRealityPointerHandler arabirimi işlevinde, bir, bu olayı aracılığıyla tetikleyen işaretçinin türüne bakabilir . İşaretçi bir Spburpointerise, etkileşim bir.

public class PrintPointerEvents : MonoBehaviour, IMixedRealityPointerHandler
{
    public void OnPointerDown(MixedRealityPointerEventData eventData)
    {
        if (eventData.Pointer is SpherePointer)
        {
            Debug.Log($"Grab start from {eventData.Pointer.PointerName}");
        }
        if (eventData.Pointer is PokePointer)
        {
            Debug.Log($"Touch start from {eventData.Pointer.PointerName}");
        }
    }

    public void OnPointerClicked(MixedRealityPointerEventData eventData) {}
    public void OnPointerDragged(MixedRealityPointerEventData eventData) {}
    public void OnPointerUp(MixedRealityPointerEventData eventData) {}
}

Dokunma etkileşimleri ekleme

Unityuı öğelerine dokunma etkileşimleri ekleme işlemi Vanilla 3D GameObjects 'ten farklıdır. Unity Kullanıcı Arabirimi bileşenlerini etkinleştirmek için şu bölüm olan Unity Kullanıcı arabiriminiatlayabilirsiniz.

Her IKI UX öğesi türü Için, mrtk Işaretçi profilindebir pokepointer kayıtlı olduğundan emin olun.

varsayılan mrtk profili ve varsayılan HoloLens 2 profili zaten bir pokepointeriçeriyor. Bir pokepointer, mrtk yapılandırma profilini seçerek ve girişişaretçileriişaretçisi seçenekleri' ne giderek bu bir işaret olduğunu doğrulayabilirler. Varsayılan PokePointer (varlıklar/MRTK/SDK/Özellikler/UX/Prefabs/işaretçiler) prefab 'nin bir PokePointer listelenmesi gerekir. Özel bir prefab, sınıfı uyguladığı sürece kullanılabilir PokePointer .

Poke Işaretçisi profili örneği

3B oyun nesneleri

3D nesnelerinizin yalnızca tek bir touchable düzlemine sahip olması veya bir Collider temel alınarak touchable olması gerektiğine bağlı olarak 3B Oyunnesnelerine dokunma etkileşimleri eklemenin iki farklı yolu vardır. İlk yol, genellikle, dokunma olaylarına yanıt vermek için istenen tek bir yüzün olması için istendiği kutularımı içeren nesneler üzerinde olur. Diğeri, Collider 'e göre herhangi bir yönden touchable olması gereken nesneler içindir.

Tek yüz dokunma

Bu, yalnızca tek bir yüzün touchable olması gereken durumlara olanak tanımak için yararlıdır. Bu seçenek oyun nesnesinin bir BoxCollider olduğunu varsayar. Bunu BoxCollider olmayan nesnelerle kullanmak mümkündür; Bu durumda, touchable düzlemi 'ni yapılandırmak için ' sınır ' ve ' yerel Merkez ' özellikleri el ile ayarlanır (yani, sınırlar sıfır olmayan bir değer olarak ayarlanmalıdır).

  1. Touchable olması gereken GameObject üzerinde bir BoxCollider ve [ NearInteractionTouchable ] (XREF: Microsoft. MixedReality. Toolkit. Input. NearInteractionTouchable) bileşenini ekleyin.

    1. Aşağıdaki bileşen betiğinizdeki [] (XREF: Microsoft. Mixedreality. Toolkit. Input. IMixedRealityTouchHandler) arabirimini kullanıyorsanız, bu olayları dokunarak alacak şekilde ayarlayın.

    2. Sınırları düzelme ve merkezini çözme öğesine tıklayın

    NearInteractionTouchable kurulumu

  2. Bu nesne veya üst öğelerinden birinde, şunu uygulayan bir betik bileşeni ekleyinIMixedRealityTouchHandler arayüz. [ NearInteractionTouchable ] (XREF: Microsoft. MixedReality. Toolkit. Input. NearInteractionTouchable) ile nesnenin herhangi bir üst öğesi, işaretçi olaylarını alabilecektir.

Not

NearInteractionTouchable gameobject seçili olan düzenleyici sahne görünümünde, beyaz bir ana hat ve ok bildirimi görürsünüz. Ok, touchable 'ın "önünü" gösterir. Çarpışılmaz, yalnızca ilgili yönden touchable olacaktır. Tüm yönlerden bir Collider touchable yapmak için, isteğe bağlı Collider Touchbölümüne bakın. NearInteractionTouchable şeyler

Rastgele Collider Touch

Bu, oyun nesnesinin tüm Collider yüzü boyunca touchable olması gereken durumlara olanak tanımak için yararlıdır. Örneğin, bu bir nesne için dokunmatik etkileşimleri etkinleştirmek üzere kullanılabilir, burada Collider 'in tamamının touchable olması gerekir.

  1. Touchable olması gereken GameObject üzerinde bir Collider ve [ NearInteractionTouchableVolume ] (XREF: Microsoft. MixedReality. Toolkit. Input. NearInteractionTouchableVolume) bileşenini ekleyin.

    1. Aşağıdaki bileşen betiğinizdeki [] (XREF: Microsoft. Mixedreality. Toolkit. Input. IMixedRealityTouchHandler) arabirimini kullanıyorsanız, bu olayları dokunarak alacak şekilde ayarlayın.
  2. Bu nesne veya üst öğelerinden birinde, şunu uygulayan bir betik bileşeni ekleyinIMixedRealityTouchHandler arayüz. [ NearInteractionTouchable ] (XREF: Microsoft. MixedReality. Toolkit. Input. NearInteractionTouchable) ile nesnenin herhangi bir üst öğesi, işaretçi olaylarını alabilecektir.

Unity Kullanıcı arabirimi

  1. Sahnede Unityuı tuvali ekleyin/emin olun.

  2. Touchable olması gereken GameObject üzerinde bir NearInteractionTouchableUnityUI bileşen ekleyin.

    1. Aşağıdaki bileşen Betikinizdeki arayüz kullanılıyorsa dokunarak görüntülenecek olayları ayarlayın.
  3. Bu nesnede veya üst öğelerinden birinde, arabirimini uygulayan bir betik bileşeni ekleyin IMixedRealityTouchHandler . İle nesnenin herhangi bir üst öğesi NearInteractionTouchableUnityUI de işaretçi olayları alabilir.

Önemli

Nesneler çakışan tuval nesnelerinde bulunuyorsa beklendiği gibi davranmayabilir. Tutarlı davranış sağlamak için, sahinizdeki tuval nesnelerinin hiçbir şekilde çakışmadığından emin olun.

Önemli

NearInteractionTouchableKomut dosyası bileşeninde, NearInteractionTouchable için iki seçenek vardır: işaretçi ve dokunma. Arabirim kullanılıyorsa ve giriş olaylarını yanıtlayan/işleyen bileşen betiğinizdeki arabirim kullanılıyorsa, ' ın işaretçiye alacak olayları ayarlayın.

Touch Code örneği

Aşağıdaki kod, bir oyun nesnesine değişken bileşeni ile iliştirilebilecek NearInteractionTouchable ve Touch Input olaylarına yanıt veren bir Monodavranış gösterir.

public class TouchEventsExample : MonoBehaviour, IMixedRealityTouchHandler
{
    public void OnTouchStarted(HandTrackingInputEventData eventData)
    {
        string ptrName = eventData.Pointer.PointerName;
        Debug.Log($"Touch started from {ptrName}");
    }
    public void OnTouchCompleted(HandTrackingInputEventData eventData) {}
    public void OnTouchUpdated(HandTrackingInputEventData eventData) { }
}

Yakın etkileşim betiği örnekleri

Dokunma olayları

Bu örnek, bir küp oluşturur, touchable yapar ve rengi dokunarak değiştirir.

public static void MakeChangeColorOnTouch(GameObject target)
{
    // Add and configure the touchable
    var touchable = target.AddComponent<NearInteractionTouchableVolume>();
    touchable.EventsToReceive = TouchableEventType.Pointer;

    var material = target.GetComponent<Renderer>().material;
    // Change color on pointer down and up
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) => material.color = Color.green);
    pointerHandler.OnPointerUp.AddListener((e) => material.color = Color.magenta);
}

Olayları alın

Aşağıdaki örnekte, bir GameObject sürüklenebilir nasıl yapılacağı gösterilmektedir. Oyun nesnesinin üzerinde bir Collider olduğunu varsayar.

public static void MakeNearDraggable(GameObject target)
{
    // Instantiate and add grabbable
    target.AddComponent<NearInteractionGrabbable>();

    // Add ability to drag by re-parenting to pointer object on pointer down
    var pointerHandler = target.AddComponent<PointerHandler>();
    pointerHandler.OnPointerDown.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = ((SpherePointer)(e.Pointer)).transform;
        }
    });
    pointerHandler.OnPointerUp.AddListener((e) =>
    {
        if (e.Pointer is SpherePointer)
        {
            target.transform.parent = null;
        }
    });
}

Yararlı API 'Ler

Ayrıca bkz.