Mengembangkan permainan di Unity, saya memanfaatkan secara liberal [RequireComponent(typeof(%ComponentType%))]untuk memastikan semua komponen telah terpenuhi.
Saya sekarang menerapkan sistem tutorial yang menyoroti berbagai objek UI. Untuk melakukan penyorotan, saya mengambil referensi ke GameObjectdalam adegan, lalu saya mengkloningnya dengan Instantiate () dan kemudian menghapus semua komponen yang tidak diperlukan untuk ditampilkan secara rekursif. Masalahnya adalah bahwa dengan penggunaan liberal RequireComponentdalam komponen-komponen ini, banyak yang tidak dapat dihapus begitu saja dalam urutan apa pun, karena mereka bergantung pada komponen lain, yang belum dihapus.
Pertanyaan saya adalah: Apakah ada cara untuk menentukan apakah Componentdapat dihapus dari yang GameObjectsaat ini dilampirkan.
Kode yang saya posting secara teknis berfungsi, namun ia melempar kesalahan Unity (tidak tertangkap di blok try-catch, seperti yang terlihat pada gambar
Berikut kodenya:
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);
}
}
Jadi cara kode ini menghasilkan tiga baris terakhir dari log debug di atas adalah sebagai berikut: Dibutuhkan sebagai input GameObjectdengan dua komponen: Buttondan PopupOpener. PopupOpenermeminta agar suatu Buttonkomponen hadir dalam GameObject yang sama dengan:
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
Iterasi pertama dari loop sementara (dilambangkan oleh teks "ITERATION ON Button Invite (clone)") berusaha untuk menghapus yang Buttonpertama, tetapi tidak bisa karena tergantung pada PopupOpenerkomponen. ini menimbulkan kesalahan. Kemudian ia mencoba untuk menghapus PopupOpenerkomponen, yang ia lakukan, karena tidak bergantung pada hal lain. Dalam iterasi berikutnya (Ditandai oleh teks kedua "ITERATION ON Button Invite (clone)"), itu berusaha untuk menghapus Buttonkomponen yang tersisa , yang sekarang bisa dilakukan, karena PopupOpenertelah dihapus dalam iterasi pertama (setelah kesalahan).
Jadi pertanyaan saya adalah apakah mungkin untuk memeriksa sebelumnya apakah komponen tertentu dapat dihapus dari saat ini GameObject, tanpa meminta Destroy()atau DestroyImmediate(). Terima kasih.
Destroymenghapus komponen di akhir frame (sebagai lawan Immediately). DestroyImmediatedianggap gaya yang buruk, tapi saya pikir beralih ke Destroysebenarnya dapat menghilangkan kesalahan ini.
