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
আসলে এই ত্রুটিগুলি দূর করতে পারে।