การพัฒนาเกมใน Unity ฉันใช้ประโยชน์อย่างมากมาย[RequireComponent(typeof(%ComponentType%))]
เพื่อให้แน่ใจว่าส่วนประกอบต่างๆมีการพึ่งพาทั้งหมด
ตอนนี้ฉันกำลังใช้ระบบการสอนที่เน้นวัตถุ UI ต่างๆ เพื่อทำการไฮไลต์ฉันกำลังอ้างอิงถึงGameObject
ในฉากจากนั้นฉันโคลนด้วย Instantiate () จากนั้นปลดส่วนประกอบทั้งหมดที่ไม่จำเป็นสำหรับการแสดงซ้ำ ปัญหาคือว่าด้วยการใช้งานอย่างเสรีRequireComponent
ในองค์ประกอบเหล่านี้หลายคนไม่สามารถลบออกได้ในลำดับใด ๆ เนื่องจากมันขึ้นอยู่กับส่วนประกอบอื่น ๆ ซึ่งยังไม่ถูกลบ
คำถามของฉันคือ: มีวิธีการตรวจสอบว่าComponent
สามารถลบออกจากที่GameObject
แนบมากับปัจจุบันได้หรือไม่
รหัสที่ฉันโพสต์ใช้งานได้ทางเทคนิค แต่มันมีข้อผิดพลาด Unity (ไม่ติดในบล็อค try-catch ดังที่เห็นในภาพ
นี่คือรหัส:
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);
}
}
ดังนั้นวิธีการสร้างรหัสนี้สามบรรทัดสุดท้ายของบันทึกการแก้ปัญหาดังกล่าวข้างต้นคือต่อไปนี้: มันต้องใช้เวลาเป็นใส่GameObject
กับสององค์ประกอบและButton
ร้องขอให้มีส่วนประกอบอยู่ใน GameObject เดียวกันด้วย:PopupOpener
PopupOpener
Button
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
การวนซ้ำครั้งแรกของ while loop (แสดงโดยข้อความ "ITERATION ON Button Invite (clone)") พยายามที่จะลบอันButton
แรก แต่ไม่สามารถทำได้เนื่องจากPopupOpener
ส่วนประกอบนั้นขึ้นอยู่กับ นี่ทำให้เกิดข้อผิดพลาด จากนั้นจึงพยายามลบPopupOpener
องค์ประกอบที่ทำเนื่องจากไม่ได้ขึ้นอยู่กับสิ่งใด ในการทำซ้ำครั้งถัดไป (แสดงเป็นข้อความที่สอง "ITERATION ON Button Invite (clone)") มันพยายามที่จะลบButton
องค์ประกอบที่เหลือซึ่งตอนนี้สามารถทำได้เนื่องจากPopupOpener
ถูกลบในการทำซ้ำครั้งแรก (หลังจากข้อผิดพลาด)
ดังนั้นคำถามของฉันไม่ว่าจะเป็นไปได้ที่จะตรวจสอบก่อนเวลาถ้าเป็นส่วนประกอบที่ระบุสามารถลบออกจากปัจจุบันGameObject
โดยไม่ต้องกล่าวอ้างหรือDestroy()
DestroyImmediate()
ขอขอบคุณ.
Destroy
ลบส่วนประกอบที่ส่วนท้ายของเฟรม (ตรงข้ามกับImmediate
ly) DestroyImmediate
ถือว่าเป็นรูปแบบที่ไม่ดี แต่ฉันคิดว่าการเปลี่ยนไปใช้Destroy
อาจกำจัดข้อผิดพลาดเหล่านี้ได้จริง