एकता में एक खेल का विकास करना, मैं [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वास्तव में इन त्रुटियों को समाप्त कर सकता हूं ।
