Unity'de bir oyun geliştirirken, [RequireComponent(typeof(%ComponentType%))]bileşenlerin tüm bağımlılıkların karşılanmasını sağlamak için liberal bir şekilde kullanıyorum .
Şimdi çeşitli kullanıcı arayüzü nesnelerini vurgulayan bir eğitim sistemi uyguluyorum. Vurgulamayı yapmak için GameObject, sahnede bir referans alıyorum , daha sonra Instantiate () ile klonladım ve sonra görüntüleme için gerekli olmayan tüm bileşenleri özyinelemeli olarak ayırıyorum. Sorun şu ki RequireComponent, bu bileşenlerin liberal kullanımı ile , çoğu henüz silinmemiş olan diğer bileşenler tarafından bağımlı oldukları için herhangi bir sırayla kolayca kaldırılamaz.
Sorum şu: a'nın şu anda bağlı Componentolduğundan kaldırılıp kaldırılamayacağını belirlemenin bir yolu var mı GameObject?
Teknik olarak gönderdiğim kod çalışıyor, ancak Unity hataları atıyor (resimde görüldüğü gibi try-catch bloğuna yakalanmadı)
İşte kod:
public void StripFunctionality(RectTransform rt)
{
if (rt == null)
{
return;
}
int componentCount = rt.gameObject.GetComponents<Component>().Length;
int safety = 10;
int allowedComponents = 0;
while (componentCount > allowedComponents && safety > 0)
{
Debug.Log("ITERATION ON "+rt.gameObject.name);
safety--;
allowedComponents = 0;
foreach (Component c in rt.gameObject.GetComponents<Component>())
{
//Disable clicking on graphics
if (c is Graphic)
{
((Graphic)c).raycastTarget = false;
}
//Remove components we don't want
if (
!(c is Image) &&
!(c is TextMeshProUGUI) &&
!(c is RectTransform) &&
!(c is CanvasRenderer)
)
{
try
{
DestroyImmediate(c);
}
catch
{
//NoOp
}
}
else
{
allowedComponents++;
}
}
componentCount = rt.gameObject.GetComponents<Component>().Length;
}
//Recursive call to children
foreach (RectTransform childRT in rt)
{
StripFunctionality(childRT);
}
}
Dolayısıyla, bu kodun yukarıdaki hata ayıklama günlüğünün son üç satırını oluşturma şekli şöyledir: GameObjectİki bileşenli girdi a olarak alındı : Buttonve PopupOpener. PopupOpenerbir Buttonbileşenin aşağıdakilerle aynı GameObject'te bulunmasını gerektirir:
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
While döngüsünün ilk yinelemesi ("ITERATION ON Button Invite (clone)" metniyle belirtilir) Buttonilkini silmeye çalıştı , ancak PopupOpenerbileşen tarafından bağımlı olduğu için yapılamadı . bu bir hata attı. Daha sonra PopupOpener, başka bir şeye bağlı olmadığından, yaptığı bileşeni silmeye çalıştı . Bir sonraki yinelemede ("ITERATION ON Button Invite (clone)" adlı ikinci metinle belirtilir), ilk yinelemede (hatadan sonra) silindiği Buttoniçin şimdi yapabileceği kalan bileşeni silmeye çalıştı PopupOpener.
Benim sorum belirtilen bir bileşen kendi akımından çıkarılabilir eğer vaktinden kontrol etmek mümkün olup olmadığıdır Yani GameObjectsöz etmeksizin Destroy()veya DestroyImmediate(). Teşekkür ederim.
Destroyçerçevenin sonunda bileşeni kaldırır (aksine Immediate). DestroyImmediateyine de kötü stil olarak kabul edilir, ancak geçiş yapmak Destroyaslında bu hataları ortadan kaldırabilir düşünüyorum .
