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

طرق التوسعة

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

ينتمي Vector3 وTransform إلى Unity، لذا لا يمكنك إضافة دالة إليهما. دالة الامتداد هي دالة static تتيح لك C# استدعاءها كما لو كانت تابعة لهما. هاتان الدالتان توفران أسطرًا تظهر في كل مشروع:

public static class UnityExtensions
{
    public static Vector3 WithY(this Vector3 v, float y)
    {
        return new Vector3(v.x, y, v.z);
    }

    public static void DestroyChildren(this Transform parent)
    {
        foreach (Transform child in parent)
        {
            Object.Destroy(child.gameObject);
        }
    }
}
// في أي سكربت
transform.position = transform.position.WithY(0.5f);
inventoryPanel.DestroyChildren();

ثمة ثلاثة أمور تجعل الدالة دالة امتداد: صنف static غير متداخل وغير عام، ودالة static، ووجود this قبل المعامل الأول. هذا المعامل هو القيمة الواقعة على يسار النقطة، لذا يُترجم transform.position.WithY(0.5f) إلى UnityExtensions.WithY(transform.position, 0.5f). إن Vector3 بنية، لذا فإن v نسخة: لا تستطيع WithY تغيير متجه المستدعي، بل تُعيد متجهًا جديدًا بدلًا من ذلك. وهذه أيضًا طريقة للتغلب على transform.position.y = 0.5f;، التي لا تُترجم بنجاح.

الصنف static ليس MonoBehaviour. يوجد في ملف .cs مستقل، ويمكن أن يكون اسمه أي شيء، ولا يُضاف أبدًا إلى كائن. تحتاج الدوال التي يرثها MonoBehaviour، مثل Destroy، إلى تحديد صنفها هنا: Object.Destroy. من الآمن تدمير العناصر الفرعية داخل foreach، لأن Unity لا يزيلها إلا في نهاية الإطار.

challenge icon

التحدي

متوسط

تراقب بومةٌ الساحة من فوق عمودٍ مرتفع. حرّك الأسهم اللاعب (جاهز). أضف إلى المشروع طريقتَي امتداد واستخدمهما في البومة:

  • في FlatExtensions.cs، اكتب فئة ثابتة اسمها FlatExtensions.
  • توسّع FlatDistance النوع Vector3: تُرجع a.FlatDistance(b) المسافة من a إلى b عبر الأرض، مع استبعاد فرق الارتفاع. من (0, 5, 0) إلى (3, 0, 4)، تكون المسافة 5.
  • توسّع FaceFlat النوع Transform: تدوّر t.FaceFlat(target) العنصر t ليواجه الهدف حول المحور y فقط، ليبقى منتصبًا مهما كان ارتفاع الهدف.
  • في Owl.cs، في كل إطار، تواجه البومة اللاعب باستخدام FaceFlat، وتكون eyes مفعّلة عندما يكون اللاعب أقرب من sight (3) عبر الأرض، وغير مفعّلة في غير ذلك. تجلس البومة عاليًا على عمودها، لذا لا تستخدم Vector3.Distance.

اضغط Play، وامشِ حول العمود وتحته، ثم اضغط Check.

جرّب بنفسك

using UnityEngine;

// FlatExtensions: FlatDistance وFaceFlat
quiz iconاختبر نفسك

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

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