دوال مساعدة عامة
جزء من قسم هندسة الألعاب في 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>.
التحدي
متوسطيقف برج صعق في الساحة. عند الضغط على مفتاح المسافة، يرسل نبضة: تُقذف الصناديق التي تقع على بُعد 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>: العناصر الواقعة ضمن نطاق نقطة
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء