Ityক্যে একটি গেম বিকাশ করে, [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উপাদান একই গেমবজেক্টের সাথে উপস্থিত রয়েছে:
[RequireComponent(typeof(Button))]
public class PopupOpener : MonoBehaviour
{
...
}
ওয়েল লুপের প্রথম পুনরাবৃত্তি ("ITERATION ON Button Invite (ক্লোন)" টেক্সট দ্বারা চিহ্নিত) Buttonপ্রথমটি মুছে ফেলার চেষ্টা করেছিল , তবে PopupOpenerউপাদানটির উপর নির্ভরশীল হিসাবে এটি পারেনি । এটি একটি ত্রুটি ছুড়েছে। তারপরে এটি সেই PopupOpenerউপাদানটি মোছার চেষ্টা করেছিল যা এটি করেছিল, কারণ এটি অন্য কোনও কিছুর উপর নির্ভর করে না। পরবর্তী পুনরাবৃত্তিতে (দ্বিতীয় পাঠ্য "আইটিআরইশন অন বাটন আমন্ত্রণ (ক্লোন)" দ্বারা চিহ্নিত), এটি অবশিষ্ট Buttonউপাদানটি মুছে ফেলার চেষ্টা করেছিল , যা এটি এখন করতে পারে, যেহেতু PopupOpenerপ্রথম পুনরাবৃত্তিতে (ত্রুটির পরে) মুছে ফেলা হয়েছিল।
সুতরাং আমার প্রশ্নটি হল যে কোনও নির্দিষ্ট উপাদানকে তার বর্তমান থেকে সরিয়ে নেওয়া GameObject, বিনা অনুরোধে Destroy()বা না করে যদি সময়ের আগে পরীক্ষা করা সম্ভব হয় কিনা DestroyImmediate()। ধন্যবাদ.
Destroyফ্রেমের শেষে উপাদানটি সরিয়েছি ( Immediateলির বিপরীতে )। DestroyImmediateযাইহোক, খারাপ শৈলী হিসাবে বিবেচনা করা হয়, তবে আমি ভাবছি এতে স্যুইচ করা Destroyআসলে এই ত্রুটিগুলি দূর করতে পারে।
