Menu
CoddyTech

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

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

بعض الدوال المساعدة واحدة لكل الأنواع: الحصول على مكوّن أو إضافته، واختيار عنصر عشوائي من مصفوفة. تكتبها دالة عامة مرة واحدة، مع النوع كمعامل 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. إذا كان لدى الصندوق Rigidbody بالفعل، فستحصل على ذلك المكوّن نفسه، ولن تتم إضافة أي شيء.

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

challenge icon

التحدي

متوسط

اكتب دالة مساعدة عامة واحدة لصناديق برج الصدمات ومصابيحه.

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

اضغط «العب» ثم اضغط Space: سيقفز الصندوق القريب. ثم اضغط «تحقق».

جرّب بنفسك

using System.Collections.Generic;
using UnityEngine;

// Helpers.InRange<T>: العناصر الواقعة ضمن نطاق نقطة

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

تدرّب بنفسك: Playground لـ Unity