Menu
CoddyTech
flag Ar iconالعربيةdown icon

دوال مساعدة عامة

جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 35 من 50.

بعض الدوال المساعدة هي نفسها لكل نوع: الحصول على مكوّن أو إضافته، واختيار عنصر عشوائي من مصفوفة. تكتبها دالة عامة مرة واحدة، ويكون النوع معاملًا لها هو T الذي تحدده كل استدعاء:

public static class Helpers
{
    public static T GetOrAdd<T>(this GameObject go) where T : Component
    {
        if (!go.TryGetComponent(out T found)) found = go.AddComponent<T>();
        return found;
    }

    public static T RandomItem<T>(T[] items)
    {
        return items[Random.Range(0, items.Length)];
    }
}
Rigidbody body = crate.GetOrAdd<Rigidbody>();
Color paint = Helpers.RandomItem(colors);
GameObject enemy = Helpers.RandomItem(enemyPrefabs);

where T : Component هو ضمان بشأن T، وهو ما يحدد ما الذي يمكن للدالة فعله به. لا يقبل AddComponent إلا المكوّنات، لذا يرفض المترجم go.AddComponent<T>() من دون هذا القيد؛ أما بوجوده، فيمكن استخدام أي مكوّن، سواء كان Rigidbody من Unity أو أحد النصوص البرمجية التي كتبتها بنفسك. ويتيح لك القيد أيضًا الوصول إلى جميع أعضاء Component على T، مثل .transform و.gameObject. إذا كان لدى crate مكوّن Rigidbody بالفعل، فستحصل على ذلك المكوّن نفسه، ولن تتم إضافة أي شيء.

لا يحتوي RandomItem على قيد، لأنه لا يتعامل مع T مطلقًا: فهو يعمل مع الألوان والسلاسل النصية والنماذج الأولية على حد سواء. ونادرًا ما تكتب النوع عند الاستدعاء: فمن colors، وهي مصفوفة Color[]، يستنتج المترجم أن T هو Color. أما الدالة التي تأخذ IEnumerable<T> بدلًا من T[]، فتقبل المصفوفات والقوائم معًا، بما في ذلك المصفوفات التي تُرجعها FindObjectsByType<T>.

challenge icon

التحدي

متوسط

يقف برج صعق في الساحة. عند الضغط على مفتاح المسافة، يرسل نبضة: تُقذف الصناديق التي تقع على بُعد 4 منه إلى الأعلى، وتضيء المصابيح التي تقع على بُعد 4 منه. الملف Lamp.cs جاهز، ويحتوي على TurnOn(). اكتب دالة مساعدة واحدة تعثر على كليهما:

  • في Helpers.cs، اكتب صنفًا ثابتًا باسم Helpers مع دالة عامة عامة InRange<T>(IEnumerable<T> items, Vector3 center, float range) لأي نوع من المكوّنات. تُعيد قائمة List<T> بالعناصر التي لا يتجاوز بُعد موضعها عن center قيمة range.
  • في Pulse.cs، عند الضغط على مفتاح المسافة: تحصل كل كائنات Rigidbody في المشهد الواقعة ضمن range من البرج على دفعة نحو الأعلى مقدارها lift، وتُضاء كل كائنات Lamp الواقعة ضمن range. استخدم InRange لكليهما، على المصفوفتين اللتين تمنحك إياهما FindObjectsByType.

اضغط تشغيل، ثم اضغط مفتاح المسافة، وبعدها تحقّق.

جرّب بنفسك

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: العناصر الواقعة ضمن نطاق نقطة
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس هندسة الألعاب في Unity