مكوّنات مجرّدة
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 3 من 50.
تصف بعض الفئات الأساسية نوعًا من الأشياء لا يوجد أبدًا بمفرده. كل سلاح يطلق النار، لكن السلاح الذي ليس مسدسًا ولا بندقية خرطوش لا يملك طريقة لإطلاق النار. اجعل هذه الفئة abstract، وعرّف كل خطوة يجب أن تكتبها الفئات الفرعية على أنها طريقة مجردة، من دون جسم:
public abstract class Weapon : MonoBehaviour
{
public int shots;
public void Pull()
{
shots++;
Fire();
}
protected abstract void Fire();
}public class Shotgun : Weapon
{
public GameObject pelletPrefab;
protected override void Fire()
{
for (int i = -1; i <= 1; i++)
{
Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
}
}
}لن تُترجم فئة فرعية لا تعرّف Fire: CS0534، 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. كما ترفض Unity وضع سكربت مجرد على كائن. اسحب Weapon إلى أحد الكائنات، وستظهر الرسالة Can't add script behaviour 'Weapon'. The script class can't be abstract!، لأن Unity لا تستطيع إنشاء Weapon من دون Fire.
تظل السكربتات الأخرى تعمل مع النوع الأساسي. تُرجع GetComponent<Weapon>() أي فئة فرعية موجودة على الكائن، وتُشغّل Pull() طريقة Fire الخاصة بتلك الفئة الفرعية:
// Player.cs
private Weapon weapon;
void Start()
{
weapon = GetComponent<Weapon>();
}
void Update()
{
if (Mouse.current.leftButton.wasPressedThisFrame)
{
weapon.Pull();
}
}استبدل مكوّن Shotgun بمكوّن Pistol، وسيظل سكربت Player كما هو.
التحدي
سهليُطلق برج الساحر صواعق على الوحوش في الحقل. يحتوي Monster.cs على ما تشترك فيه جميع الوحوش: hp (3) وZap()، التي تُنقص نقاط الصحة بمقدار 1، وتدمّر الوحش عند وصولها إلى 0، وإلا تستدعي React(). يتفاعل Slime.cs بالتقلّص. ليس لدى Imp.cs أي رد فعل، ويمنحه Monster دالة React فارغة، لذلك لا شيء يخبرك بأن هذا الرد مفقود.
- اجعل Monster مجرّدًا وReact دالةً مجرّدة، حتى لا يُترجم أي وحش لا يحدّد طريقة تفاعله. سيشير المترجم عندها إلى Imp.
- اكتب React الخاص بـ Imp: يقفز وحدتين إلى الخلف، بعيدًا عن البرج (على امتداد +z).
- في Tower.cs، عند الضغط على Space، احصل على مكوّن Monster لكل كائن يحمل الوسم Monster، أيًّا كان نوعه، واستدعِ عليه
Zap().
اضغط على Play وأطلق الصواعق على الوحوش، ثم اضغط على Check.
جرّب بنفسك
using UnityEngine;
// ما تشترك فيه جميع الوحوش.
public class Monster : MonoBehaviour
{
public int hp = 3;
public void Zap()
{
hp--;
if (hp <= 0)
{
Destroy(gameObject);
}
else
{
React();
}
}
// كيف يتفاعل هذا النوع من الوحوش مع صعقة ينجو منها.
protected virtual void React()
{
}
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء