Olağanüstü koşulları işleme
WLT çoğunlukla uygulamanın katılımı olmadan izleme hatalarını sessizce algılayabilir ve düzeltebilir.
Ancak bazı istisnai koşullar, uygulamanın ayarlamak isteyebileceği hatalara yol açar.
İzleme kaybı, böyle bir koşula örnektir.
İzleme, çeşitli nedenlerden dolayı herhangi bir zamanda kaybolabilir. Algılayıcılar kaplanmış olabilir, ışık yetersiz olabilir veya kameranın etrafında izlemesi için görünür bir özellik olmayabilir.
WLT'nin bunları azaltmayı hedefleyen özellikleri de dahil olmak üzere kavramsal düzeyde bu olağanüstü koşulların daha kapsamlı tartışmaları bu belgenin başka bir yerinde yer alır.
Burada uygulama geliştiricisinin (isteğe bağlı olarak) bu olağanüstü koşullar sırasında uygulamanın davranışını özelleştirmek için bu özelliklerden nasıl yararlanabileceğini inceleyeceğiz.
Ek Noktaları
Burada daha ayrıntılı olarak açıklandığı gibi ek noktası, olağanüstü koşulların oluştuğuna ilişkin bildirim için WLT ile uygulama arasındaki sözleşme ve uygulamanın yanıt vermek için kullanabileceği uygun verilerdir.
Ayarlayıcı bileşenleri
Bu tür uygulama yanıtlarının bir uygulaması "ayarlayıcı" bileşenleri biçiminde kullanılabilir. Bunların birincil bileşeni AdjusterFixed bileşenidir.
AdjusterFixed olduğu gibi kullanılabilir, ancak özellikle davranışı daha fazla özelleştirmek isteyen bir geliştirici için ne yaptığını anlamak öğretici olabilir.
Ayarlayıcı bileşenlerinin iki role hizmet ettiğini bilmek önemlidir:
- Temel alınan AttachmentPoint'i yönetir.
- Uygulamanın olağanüstü koşullara verdiği yanıtların uygulamalarını sağlar.
AttachmentPoint yönetimi
ve OnDestroy()
üyelerini Start()
incelemek, gereken AttachmentPoint yönetiminin çoğunu yakalar.
üzerinde Start()
, temel alınan AttachmentPoint oluşturulur ve AdjusterFixed'in üye işlevleri geri çağırma olarak sağlanır (aşağıya bakın).
içinde OnDestroy()
, bu geri çağırma bağlantıları kesilir ve AttachmentPoint serbest bırakılır.
Koşul işleme geri çağırmaları
İki geri çağırma, bu olağanüstü koşullar sırasında uygulamanın istenen davranışını uygular.
İzleme durumunu işleme
içinde HandleStateAdjust()
AdjusterFixed bileşeni, şu anda izlenmekte olan bir parçada bulunan nesneleri devre dışı bırakır.
protected virtual void HandleAdjustState(AttachmentPointStateType state)
{
bool visible = state == AttachmentPointStateType.Normal;
if (visible != gameObject.activeSelf)
{
gameObject.SetActive(visible);
}
}
Bu basit davranış birçok uygulama için mükemmel olsa da, yeterli olmadığı durumları hayal etmek kolaydır.
- Nesne gizli olmalı, ancak devre dışı bırakılmamalıdır (güncelleştirmeye devam etmelidir).
- Nesneyi gizlemenin alternatif bir yöntemi tercih edilir (örneğin, uzak kırpma düzleminin ötesine taşımak).
- Nesneyi gizlemek yerine farklı bir malzemeyle (ör. X-ray malzeme) işlenmelidir.
- Nesneyi gizlemek yerine alternatif bir nesne işlenmelidir.
- Etc.
Neyse ki, uygulama geliştiricisi bu davranışlardan herhangi birini veya yalnızca hayal gücüyle sınırlı olan diğer davranışları uygulamakta özgürdür.
Özel davranış belirtmenin en basit aracı AdjusterFixed'den türetilen özel bir bileşen uygulamaktır. Daha sonra AttachmentPoint yönetimi devralınabilir ve işleyiciler özel davranışı oluşturmak için geçersiz kılınabilir.
Yeniden konumlandırmayı işleme
Kavramsal belgelerde açıklandığı gibi WLT sistemi, bir nesnenin donmuş alanda yeniden konumlandırılarak fiziksel dünyadaki konumunda en iyi şekilde tutulabileceğine karar verebilir. Bu durum, AttachmentPoint mekanizması aracılığıyla uygulamayı bilgilendirecektir.
Uygulama elbette bu tür ayarlamaları göz ardı etmek için ücretsizdir. Ancak AdjusterFixed (ve AdjusterMoving) bileşeni tarafından sağlanan davranış, bu yeniden konumlandırma dönüşümünü hemen uygulamaktır.
protected virtual void HandleAdjustLocation(Pose adjustment)
{
Pose pose = gameObject.transform.GetGlobalPose();
pose = adjustment.Multiply(pose);
gameObject.transform.SetGlobalPose(pose);
}
Uygulamanın neredeyse her zaman istediği budur. Daha sonra, herhangi birinin AdjusterFixed HandlePositionAdjust()
işlevini neden geçersiz kılmak isteyeceğiyle ilgili bir soru sorulabilir.
Tabii ki yanıt, uygulamanın konumu düzeltmeye ek olarak başka eylemler gerçekleştirmek isteyebileceğidir. Geçici bir malzeme etkisi, kullanıcıya bir değişiklik yapıldığını bildirmeye yardımcı olabilir. Yeniden konumlandırma birkaç saniyeye yayılmış olabilir. Veya yeniden konumlandırma çok sertse, uygulama nesneyi taşımak yerine atmayı tercih edebilir.
AdjusterFixed vs AdjusterMoving
AdjusterMoving bileşenine daha yakından bakmak, bunun türetilen AdjusterFixed bileşeniyle neredeyse aynı olduğunu gösterir.
İkisi arasındaki fark, AdjusterMoving'in hedefinin sürekli ortamda taşındığını varsaymasıdır. Bu nedenle, her güncelleştirme WLT sistemine yeni Pozunu bildirir.
AdjusterMoving'in maliyeti çoğunlukla işlev içinde yapılan iş yerine bir Update() işlevinin eklenmesinden kaynaklanır. Ancak, "çoğunlukla" sabit olan ve yalnızca betikten seyrek taşınan bir nesne için, AdjusterFixed bileşenini kullanmak ve nesne her taşındığında AdjusterFixed.UpdatePosition() çağrısı yapmak avantajlı olabilir.
Davranışı özelleştirin, ancak yalnızca istediğiniz zaman
Yine buradaki desenin Dünya Kilitleme Araçları genelinde tutarlı olduğunu umuyoruz. WLT basit ama genel olarak yararlı temel davranışlar sağlar. Bu uygulamanın aşağıdakilerden birini gerçekleştirmesi umulur:
- Uygulamanızın gereksinimlerini karşılar.
- Geliştirmeniz için bir temel uygulama sağlayın.
- Içinden çılgına dönebileceğiniz örnek bir uygulama verin.