Etkileşimli — MRTK2
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:
- Genel giriş yapılandırması
- Birden çok GameObject'e yönelik Görsel Temalar
- Olay işleyicileri
Genel giriş 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.
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.InputAction
kodda ç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.IsGlobal
kodda ç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.VoiceCommand
kodda ç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.VoiceRequiresFocus
kodda ç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.DimensionIndex
izlenir.
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.ButtonMode
sorgulanabilir. Ç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.CurrentDimension
eriş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.
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.
)
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.
InteractableAudioReceiver
InteractableOnClickReceiver
InteractableOnFocusReceiver
InteractableOnGrabReceiver
InteractableOnHoldReceiver
InteractableOnPressReceiver
InteractableOnToggleReceiver
InteractableOnTouchReceiver
genişleten ReceiverBase
yeni bir sınıf oluşturularak özel bir alıcı oluşturulabilir.
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.
Ö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:
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.Sınıfını
ReceiverBaseMonoBehavior
genişleterek Interactable veya başka bir nesnede bulunabilen tamamen özel bir olay bileşeni oluşturun. durumReceiverBaseMonoBehavior
değişikliklerini algılamak için Interactable öğesine başvurur.
Genişletme örneği ReceiverBase
sınıfı, CustomInteractablesReceiver
Bir 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.
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:
- Birden çok Etkileşime Dönüştürülebilir GameObjects/düğme oluşturma
- SelectionMode= Toggle, CanSelect = true ve CanDeselect = false değerlerini ayarlayın
- Tüm Interactables üzerinde boş bir üst GameObject oluşturun ve InteractableToggleCollection bileşenini ekleyin
- InteractableToggleCollection üzerindeki ToggleList'e tüm Interactable'ları ekleme
- Başlangıçta varsayılan olarak hangi düğmenin seçildiğini belirlemek için InteractableToggleCollection.CurrentIndex özelliğini ayarlayın
Ç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.
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"));
}