การพัฒนาเกมใน 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 เดียวกันด้วย:PopupOpenerPopupOpenerButton
[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ลบส่วนประกอบที่ส่วนท้ายของเฟรม (ตรงข้ามกับImmediately) DestroyImmediateถือว่าเป็นรูปแบบที่ไม่ดี แต่ฉันคิดว่าการเปลี่ยนไปใช้Destroyอาจกำจัดข้อผิดพลาดเหล่านี้ได้จริง
