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ı Component
olduğ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ı : Button
ve PopupOpener
. PopupOpener
bir Button
bileş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) Button
ilkini silmeye çalıştı , ancak PopupOpener
bileş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 Button
iç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 GameObject
söz etmeksizin Destroy()
veya DestroyImmediate()
. Teşekkür ederim.
Destroy
çerçevenin sonunda bileşeni kaldırır (aksine Immediate
). DestroyImmediate
yine de kötü stil olarak kabul edilir, ancak geçiş yapmak Destroy
aslında bu hataları ortadan kaldırabilir düşünüyorum .