Etkileşimli — MRTK2

Etkileşim kurulabilir

Bileşen Interactable , herhangi bir nesneyi kolayca etkileşime geçirilebilir ve girişe duyarlı hale getirmek için hepsi bir arada bir kapsayıcıdır. Etkileşime geçilebilir, dokunma, el ışınları, konuşma vb. dahil olmak üzere tüm giriş türleri için tümünü yakala işlevi görür ve bu etkileşimleri olaylara ve görsel tema yanıtlarına dönüştürebilir. Bu bileşen, düğmeler yapmak, odakla nesnelerin rengini değiştirmek ve daha fazlasını yapmak için kolay bir yol sağlar.

Etkileşim Kurulabilir'i yapılandırma

Bileşen, yapılandırmanın üç birincil bölümüne izin verir:

  1. Genel giriş yapılandırması
  2. Birden çok GameObject'e yönelik Görsel Temalar
  3. Olay işleyicileri

Genel giriş ayarları

Genel Etkileşim Kurulabilen Ayarlar

Durumlar

States, Etkileşime Dönüştürülebilir Profiller ve Görsel Temalar için basılan veya gözlemlenen gibi etkileşim aşamalarını tanımlayan bir ScriptableObject parametresidir.

DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset), MRTK ile birlikte kullanıma hazır olarak gelir ve Etkileşimli bileşenler için varsayılan parametredir.

Denetçide States ScriptableObject örneği

DefaultInteractableStates varlığı dört durum içerir ve durum modeli uygulamasını kullanırInteractableStates.

  • Varsayılan: Hiçbir şey olmuyor, bu en yalıtılmış temel durumdur.

  • Odak: Nesne işaret ediliyor. Bu tek bir durumdur, şu anda başka hiçbir durum ayarlanmadı, ancak Varsayılan olarak sıralanır.

  • Basın: Nesne üzerine geliniyor ve bir düğme veya el basılıyor. Basın durumu dışarı ayarı Varsayılan ve Odak olarak sıralar. Bu durum fiziksel basıma geri dönüş olarak da ayarlanır.

  • Devre dışı: Düğme etkileşimli olmamalıdır ve görsel geri bildirim, herhangi bir nedenle bu düğmenin şu anda kullanılamadığını kullanıcıya bildirir. Teoride, devre dışı bırakılan durum diğer tüm durumları içerebilir, ancak Etkin kapatıldığında, Devre dışı durumu diğer tüm eyaletlerden daha iyi olur.

Listedeki sıraya bağlı olarak duruma bir bit değeri (#) atanır.

Not

Etkileşimli bileşenler oluştururken DefaultInteractableStates (Assets/MRTK/SDK/Features/UX/Interactable/States/DefaultInteractableStates.asset) kullanılması genellikle önerilir.

Ancak, temaları yönlendirmek için kullanılabilecek 17 Etkileşim kurulabilir durum vardır, ancak bazıları diğer bileşenler tarafından yönlendirilmeye yöneliktir. Yerleşik işlevlere sahip olanların listesi aşağıdadır.

  • Ziyaret edildi: Etkileşimli seçeneğine tıklandı.
  • Geçişli: Düğme iki durumlu durumda veya Boyut dizini tek sayıdır.
  • Hareket: El veya kumandaya basılmış ve orijinal konumdan hareket ettirilmiştir.
  • VoiceCommand: Etkileşimli'yi tetikleme amacıyla bir konuşma komutu kullanıldı.
  • PhysicalTouch: Şu anda bir dokunmatik giriş algılandı, etkinleştirmek için kullanın NearInteractionTouchable .
  • Yakala: Bir el şu anda nesnenin sınırları içinde kapıyor, etkinleştirmek için kullanın NearInteractionGrabbable

Etkin

Etkileşim Kurulabilir'in etkin olarak başlatılıp başlatılmayacağını değiştirir. Bu, koddaki öğesine Interactable.IsEnabled karşılık gelir.

Interactable'ın etkin özelliği, GameObject/Component (SetActive vb.) aracılığıyla yapılandırılan etkin özellikten farklıdır. GameObject veya Interactable MonoBehaviour'u devre dışı bırakmak giriş, görsel temalar, olaylar vb. dahil olmak üzere sınıftaki her şeyin çalışmasını devre dışı bırakır. aracılığıyla Interactable.IsEnabled devre dışı bırakılması, giriş işlemenin çoğunu devre dışı bırakır ve ilgili giriş durumlarını sıfırlar. Ancak sınıfı yine de her kareyi çalıştırır ve yoksayılacak giriş olaylarını alır. Bu, Etkileşim Kurulabilir'i Görsel Temalar aracılığıyla yapılabilen devre dışı durumda görüntülemek için kullanışlıdır. Bunun tipik bir örneği, tüm gerekli giriş alanlarının tamamlandığını bekleyen bir gönder düğmesi olabilir.

Giriş Eylemleri

Giriş yapılandırmasından veya Etkileştirilebilir bileşenin tepki vermesi gereken denetleyici eşleme profilinden giriş eylemini seçin.

Bu özellik, aracılığıyla Interactable.InputActionkodda çalışma zamanında yapılandırılabilir.

IsGlobal

True ise, bu işlem seçilen giriş eylemi için bileşeni genel giriş dinleyicisi olarak işaretler. Varsayılan davranış false'tur ve girişi yalnızca bu Interactable harmanlayıcı/GameObject ile kısıtlar.

Bu özellik, aracılığıyla Interactable.IsGlobalkodda çalışma zamanında yapılandırılabilir.

Konuşma Komutu

Ses etkileşimi için bir OnClick olayını tetikleme amacıyla MRTK Konuşma Komutları Profili'nden Konuşma komutu.

Bu özellik, aracılığıyla Interactable.VoiceCommandkodda çalışma zamanında yapılandırılabilir.

Odak Gerektirir

True ise, sesli komut yalnızca bir işaretçiden odaklanmışsa ve varsa Etkileşimli'yi etkinleştirir. False ise Interactable , seçili sesli komut için genel dinleyici görevi görür. Bir sahnede birden çok genel konuşma dinleyicisinin düzenlenmesi zor olabileceğinden, varsayılan davranış doğrudur.

Bu özellik, aracılığıyla Interactable.VoiceRequiresFocuskodda çalışma zamanında yapılandırılabilir.

Seçim Modu

Bu özellik seçim mantığını tanımlar. Bir Etkileşime Girilebilir öğesine tıklandığında, bir sonraki Boyut düzeyine yinelenir. Boyutlar sıralamaya benzer ve girişlerin dışındaki bir durumu tanımlar (odak, bas vb.). Geçiş durumlarını veya bir düğmeyle ilişkili diğer çok dereceli durumları tanımlamak için kullanışlıdırlar. Geçerli Boyut düzeyi tarafından Interactable.DimensionIndexizlenir.

Kullanılabilir seçim modları şunlardır:

  • Düğme - Boyutlar = 1, basit tıklanabilir Etkileşimli
  • Geçiş - Boyutlar = 2, Kapalı durumda arasında/etkileşim kurulabilir alternatifler
  • Çok boyutlu - Boyutlar>= 3, her tıklama geçerli boyut düzeyi + 1'i artırır. Bir listeye düğme durumu tanımlamak vb. için kullanışlıdır.

Etkileşim kurulabilir , Boyut başına birden çok Temanın tanımlanmasına da olanak tanır. Örneğin SelectionMode=Toggle olduğunda, Etkileşimli seçimi kaldırıldığında bir tema, bileşen seçildiğinde başka bir tema uygulanabilir.

Geçerli Seçim Modu çalışma zamanında aracılığıyla Interactable.ButtonModesorgulanabilir. Çalışma zamanında modun güncelleştirilmesi, özelliği istenen işlevsellikle eşleşecek şekilde ayarlanarak Interactable.Dimensions elde edilebilir. Ayrıca, Geçiş ve Çoklu Boyut modları için kullanışlı olan geçerli boyuta aracılığıyla Interactable.CurrentDimensionerişilebilir.

Etkileşim kurulabilen profiller

Profiller , GameObject ile Görsel Tema arasında ilişki oluşturan öğelerdir. Profil, durum değişikliği gerçekleştiğinde tema tarafından hangi içeriğin işlendiğini tanımlar.

Temalar malzemelere çok benzer. Bunlar, geçerli duruma göre bir nesneye atanacak özelliklerin listesini içeren betiklenebilir nesnelerdir. Temalar da yeniden kullanılabilir ve birden çok Etkileşimli UX nesnesine atanabilir.

Yok EtmeDe sıfırla

Görsel temalar, seçilen tema altyapısının sınıfına ve türüne bağlı olarak hedeflenen bir GameObject'te çeşitli özellikleri değiştirir. Etkileşime Girilebilir bileşen yok edildiğinde Yok Etme Sırasında Sıfırla doğruysa, bileşen etkin temalardan değiştirilen tüm özellikleri özgün değerlerine sıfırlar. Aksi takdirde, etkileşim kurulabilir bileşen yok edildiğinde değiştirilmiş özellikleri olduğu gibi bırakır. Bu ikinci durumda, başka bir dış bileşen tarafından değiştirilmediği sürece değerlerin son durumu kalıcı olur. Varsayılan değer false.

Theams profili oluşturma

Ekinlikler

Her Etkileşimli bileşen, bileşen yalnızca seçildiğinde tetiklenebilen bir OnClick olayına sahiptir. Ancak, Yalnızca OnClick dışında giriş olaylarını algılamak için Interactable kullanılabilir.

Yeni bir Tür Olay Alıcısı tanımı eklemek için Olay Ekle düğmesine tıklayın. Eklendikten sonra istenen Olay türünü seçin.

Olaylar örneği)

Farklı giriş türlerine yanıt vermek için farklı türlerde olay alıcıları vardır. MRTK, aşağıdaki alıcıları kullanıma hazır olarak teslim eder.

genişleten ReceiverBaseyeni bir sınıf oluşturularak özel bir alıcı oluşturulabilir.

Olay İki Durumlu Alıcı Örneği

Geçiş Olayı Alıcısı Örneği

Etkileşim kurulabilen alıcılar

Bileşen, InteractableReceiver olayların kaynak Etkileşime Dönüştürülebilir bileşenin dışında tanımlanmasını sağlar. InteractableReceiver, başka bir Interactable tarafından tetiklenen filtrelenmiş olay türünü dinler. Interactable özelliği doğrudan atanmamışsa, Arama Kapsamı özelliği InteractableReceiver'ın kendisinde, üst öğesinde veya alt GameObject'te bulunan olayları dinlediği yönü tanımlar.

InteractableReceiverList benzer bir şekilde davranır, ancak eşleşen olayların listesi için.

Etkileşime dönüştürülebilir alıcı verici

Özel olaylar oluşturma

Görsel Temalar gibi olaylar da herhangi bir durum deseni algılanacak veya işlevselliği kullanıma sunulacak şekilde genişletilebilir.

Özel olaylar iki ana yolla oluşturulabilir:

  1. Sınıfını ReceiverBase genişleterek olay türlerinin açılan listesinde gösterilecek özel bir olay oluşturun. Unity olayı varsayılan olarak sağlanır, ancak ek Unity olayları eklenebilir veya olay Unity olaylarını gizleyecek şekilde ayarlanabilir. Bu işlevsellik, tasarımcının düzenleyicide ayarlayabileceğiniz özel bir olay oluşturmak için bir projedeki mühendisle çalışmasını sağlar.

  2. Sınıfını ReceiverBaseMonoBehavior genişleterek Interactable veya başka bir nesnede bulunabilen tamamen özel bir olay bileşeni oluşturun. durum ReceiverBaseMonoBehavior değişikliklerini algılamak için Interactable öğesine başvurur.

Genişletme örneği ReceiverBase

sınıfı, CustomInteractablesReceiverBir Interactable ile ilgili durum bilgilerini görüntüler ve özel olay alıcısının nasıl oluşturulacağını gösteren bir örnektir.

public CustomInteractablesReceiver(UnityEvent ev) : base(ev, "CustomEvent")
{
    HideUnityEvents = true; // hides Unity events in the receiver - meant to be code only
}

Aşağıdaki yöntemler, özel bir Olay Alıcısı oluştururken geçersiz kılmak/uygulamak için yararlıdır. ReceiverBase.OnUpdate() , durum desenlerini/geçişlerini algılamak için kullanılabilecek soyut bir yöntemdir. Ayrıca ve ReceiverBase.OnClick() yöntemleri, ReceiverBase.OnVoiceCommand()Etkileşim Kurulabilir seçildiğinde özel olay mantığı oluşturmak için kullanışlıdır.

public override void OnUpdate(InteractableStates state, Interactable source)
{
    if (state.CurrentState() != lastState)
    {
        // the state has changed, do something new
        lastState = state.CurrentState();
        ...
    }
}

public virtual void OnVoiceCommand(InteractableStates state, Interactable source,
                                    string command, int index = 0, int length = 1)
{
    base.OnVoiceCommand(state, source, command, index, length);
    // voice command called, perform some action
}  

public virtual void OnClick(InteractableStates state,
                            Interactable source,
                            IMixedRealityPointer pointer = null)
{
    base.OnClick(state, source);
    // click called, perform some action
}
Denetçide özel olay alıcısı alanlarını görüntüleme

ReceiverBase betikleri, denetçide özel özellikleri kullanıma açmak için öznitelikleri kullanır InspectorField . Burada araç ipucu ve etiket bilgilerini içeren özel bir özellik olan Vector3 örneği verilmiştir. Bu özellik , Interactable GameObject seçildiğinde ve ilişkili Olay Alıcısı türü eklendiğinde denetçide yapılandırılabilir olarak gösterilir.

[InspectorField(Label = "<Property label>",Tooltip = "<Insert tooltip info>",Type = InspectorField.FieldTypes.Vector3)]
public Vector3 EffectOffset = Vector3.zero;

Interactable'ı kullanma

Basit bir düğme oluşturma

Giriş olaylarını alacak şekilde yapılandırılmış bir GameObject'e Interactable bileşenini ekleyerek basit bir düğme oluşturabilirsiniz. Giriş almak için üzerinde veya bir çocukta bir harmanlayıcı olabilir. Unity UI tabanlı GameObjects ile Interactable kullanılıyorsa, Canvas GameObject altında olmalıdır.

Yeni bir profil oluşturarak, GameObject'i atayarak ve yeni bir tema oluşturarak düğmeyi bir adım ileri götürün. Ayrıca, bir şey yapmak için OnClick olayını kullanın.

Not

Düğmeye basılabilir hale getirmek için bileşen gerekirPressableButton. Ayrıca, PhysicalPressEventRouter basım olaylarını Etkileşime Dönüştürülebilir bileşene getirmek için bileşen gereklidir.

İki durumlu ve çok boyutlu düğmeler oluşturma

İki durumlu düğme

Düğmeyi iki durumlu düğme yapmak için alanını yazacak Toggleşekilde değiştirinSelection Mode. Profiller bölümünde, Etkileşim kurulabilir seçeneği açıkken kullanılan her profil için yeni bir iki durumlu tema eklenir.

SelectionMode Geçiş olarak ayarlanırken, çalışma zamanı başlatılırken denetimin varsayılan değerini ayarlamak için IsToggled onay kutusu kullanılabilir.

CanSelect, Etkileşim Kurulabilir'inkapalıdan açık duruma geçebileceği, CanDeselect ise tersi anlamına gelir.

Profil Görsel Temaları Arasında Geçiş Örneği

Geliştiriciler ve IsToggled arabirimlerini kullanarak SetToggled kod aracılığıyla Etkileşime Geçilebilir'in geçiş durumunu alabilir/ayarlayabilir.

// If using SelectionMode = Toggle (i.e Dimensions == 2)

// Make the Interactable selected and toggled on
myInteractable.IsToggled = true;

// Get whether the Interactable is selected or not
bool isSelected = myInteractable.IsToggled;
Düğme koleksiyonunu aç/kapat

Radyal set veya radyo düğmeleri olarak da bilinen, herhangi bir anda yalnızca birinin etkin olabileceği iki durumlu düğmelerin bir listesine sahip olmak yaygın bir durumdur.

InteractableToggleCollection Bu işlevi etkinleştirmek için bileşenini kullanın. Bu denetim, herhangi bir anda yalnızca bir Etkileşim kurulabilir seçeneğinin açık olmasını sağlar. RadialSet (Assets/MRTK/SDK/Features/UX/Interactable/Prefabs/RadialSet.prefab) da kullanıma hazır harika bir başlangıç noktasıdır.

Özel radyal düğme grubu oluşturmak için:

  1. Birden çok Etkileşime Dönüştürülebilir GameObjects/düğme oluşturma
  2. SelectionMode= Toggle, CanSelect = true ve CanDeselect = false değerlerini ayarlayın
  3. Tüm Interactables üzerinde boş bir üst GameObject oluşturun ve InteractableToggleCollection bileşenini ekleyin
  4. InteractableToggleCollection üzerindeki ToggleList'e tüm Interactable'ları ekleme
  5. Başlangıçta varsayılan olarak hangi düğmenin seçildiğini belirlemek için InteractableToggleCollection.CurrentIndex özelliğini ayarlayın
Koleksiyonu açma/kapatma

Çok boyutlu düğme

Çoklu Boyut seçim modu sıralı düğmeler veya hızı üç değerle kontrol etme gibi ikiden fazla adımı olan bir düğme oluşturmak için kullanılır: Hızlı (1x), Daha Hızlı (2x) veya En Hızlı (3x).

Boyutlar sayısal bir değerken, her bir hız ayarı için düğmenin metin etiketini veya dokusunu denetlemek için her adım için farklı bir tema kullanarak en fazla 9 tema eklenebilir.

Her tıklama olayı, değere DimensionIndex ulaşılana kadar çalışma zamanında değerini 1 ile ilerletir Dimensions . Ardından döngü 0'a sıfırlanır.

Çok Boyutlu profil örneği

Geliştiriciler, şu anda etkin olan boyutu belirlemek için öğesini değerlendirebilir DimensionIndex .

// If using SelectionMode = Multi-dimension (i.e Dimensions >= 3)

//Access the current DimensionIndex
int currentDimension = myInteractable.CurrentDimension;

//Set the current DimensionIndex to 2
myInteractable.CurrentDimension = 2;

// Promote Dimension to next level
myInteractable.IncreaseDimension();

Çalışma zamanında Etkileşimli Oluşturma

Etkileşimli çalışma zamanında herhangi bir GameObject'e kolayca eklenebilir. Aşağıdaki örnekte görsel temayla profil atama adımları gösterilmektedir.

var interactableObject = GameObject.CreatePrimitive(PrimitiveType.Cylinder);
var interactable = interactableObject.AddComponent<Interactable>();

// Get the default configuration for the Theme engine InteractableColorTheme
var newThemeType = ThemeDefinition.GetDefaultThemeDefinition<InteractableColorTheme>().Value;

// Define a color for every state in our Default Interactable States
newThemeType.StateProperties[0].Values = new List<ThemePropertyValue>()
{
    new ThemePropertyValue() { Color = Color.black},  // Default
    new ThemePropertyValue() { Color = Color.black}, // Focus
    new ThemePropertyValue() { Color = Random.ColorHSV()},   // Pressed
    new ThemePropertyValue() { Color = Color.black},   // Disabled
};

interactable.Profiles = new List<InteractableProfileItem>()
{
    new InteractableProfileItem()
    {
        Themes = new List<Theme>()
        {
            Interactable.GetDefaultThemeAsset(new List<ThemeDefinition>() { newThemeType })
        },
        Target = interactableObject,
    },
};

// Force the Interactable to be clicked
interactable.TriggerOnClick()

Kod aracılığıyla etkileşime dönüştürülebilir olaylar

Aşağıdaki örnekle kod aracılığıyla temel Interactable.OnClick olaya bir eylem ekleyebilirsiniz.

public static void AddOnClick(Interactable interactable)
{
    interactable.OnClick.AddListener(() => Debug.Log("Interactable clicked"));
}

Interactable.AddReceiver<T>() Çalışma zamanında dinamik olarak olay alıcıları eklemek için işlevini kullanın.

Aşağıdaki örnek kodda, odak giriş/çıkışını dinleyen ve olay örnekleri tetiklendiğinde gerçekleştirilecek eylem kodunu tanımlayan InteractableOnFocusReceiver'ın nasıl ekleneceği gösterilmektedir.

public static void AddFocusEvents(Interactable interactable)
{
    var onFocusReceiver = interactable.AddReceiver<InteractableOnFocusReceiver>();

    onFocusReceiver.OnFocusOn.AddListener(() => Debug.Log("Focus on"));
    onFocusReceiver.OnFocusOff.AddListener(() => Debug.Log("Focus off"));
}

Aşağıdaki örnek kod, iki durumlu Etkileşimler'de seçili/seçimi kaldırılan durum geçişlerini dinleyen bir InteractableOnToggleReceiver'ın nasıl ekleneceğini gösterir ve ayrıca olay örnekleri tetiklendiğinde gerçekleştirilecek eylem kodunu tanımlar.

public static void AddToggleEvents(Interactable interactable)
{
    var toggleReceiver = interactable.AddReceiver<InteractableOnToggleReceiver>();

    // Make the interactable have toggle capability, from code.
    // In the gui editor it's much easier
    interactable.Dimensions = 2;
    interactable.CanSelect = true;
    interactable.CanDeselect  = true;

    toggleReceiver.OnSelect.AddListener(() => Debug.Log("Toggle selected"));
    toggleReceiver.OnDeselect.AddListener(() => Debug.Log("Toggle un-selected"));
}

Ayrıca bkz.