एकता में एक खेल का विकास करना, मैं [RequireComponent(typeof(%ComponentType%))]
यह सुनिश्चित करने के लिए उदार उपयोग कर रहा हूं कि घटकों को सभी निर्भरताएं मिलें।
अब मैं एक ट्यूटोरियल प्रणाली लागू कर रहा हूं जो विभिन्न UI ऑब्जेक्ट्स को हाइलाइट करता है। हाइलाइटिंग करने के लिए, मैं GameObject
दृश्य में एक संदर्भ ले रहा हूं , फिर मैं इसे तत्काल () के साथ क्लोन करता हूं और फिर उन सभी घटकों को पुन: हटा देता हूं, जिन्हें प्रदर्शन की आवश्यकता नहीं है। समस्या यह है कि RequireComponent
इन घटकों के उदार उपयोग के साथ , कई को केवल किसी भी क्रम में हटाया नहीं जा सकता है, क्योंकि वे अन्य घटकों द्वारा निर्भर हैं, जिन्हें अभी तक हटाया नहीं गया है।
मेरा प्रश्न है: क्या यह निर्धारित करने का कोई तरीका है कि वर्तमान में इससे जुड़ा Component
जा सकता है या नहीं GameObject
।
कोड मैं तकनीकी रूप से काम कर रहा हूं, हालांकि यह यूनिटी त्रुटियों को फेंकता है (जैसा कि छवि में देखा गया है, ट्राइ-कैच ब्लॉक में नहीं पकड़ा गया है
यहाँ कोड है:
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
और PopupOpener
। PopupOpener
आवश्यकता है कि एक Button
घटक एक ही GameObject में मौजूद है:
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
लूप के पहले पुनरावृत्ति (पाठ "आईएआरटीएएन ऑन बटन इनवाइट (क्लोन)" द्वारा चिह्नित) को Button
पहले हटाने का प्रयास किया गया था , लेकिन यह PopupOpener
घटक द्वारा निर्भर नहीं किया गया था । इसने एक त्रुटि फेंक दी। फिर इसने PopupOpener
घटक को हटाने का प्रयास किया , जो उसने किया, क्योंकि यह किसी और चीज पर निर्भर नहीं है। अगले पुनरावृत्ति में (दूसरे पाठ "ITERATION ON Button Invite (क्लोन)") से निरूपित, उसने शेष Button
घटक को हटाने का प्रयास किया , जो अब वह कर सकता PopupOpener
था , क्योंकि पहले पुनरावृत्ति (त्रुटि के बाद) में हटा दिया गया था।
तो मेरा प्रश्न यह है कि क्या समय से पहले जांच करना संभव है कि क्या एक निर्दिष्ट घटक को अपने वर्तमान से हटाया जा सकता है GameObject
, बिना आह्वान के Destroy()
या DestroyImmediate()
। धन्यवाद।
Destroy
फ्रेम के अंत में घटक को हटा देता है (जैसा कि Immediate
गीत के विपरीत )। DestroyImmediate
वैसे भी खराब शैली को माना जाता है, लेकिन मैं सोच रहा हूं कि Destroy
वास्तव में इन त्रुटियों को समाप्त कर सकता हूं ।