نص برمجي أساسي للعدو
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 2 من 64.
في C#، يمكن لفئة أن ترث من فئة أخرى: تحصل class Ghost : Enemy على كل حقل ودالة في Enemy وتضيف ما يخصها. ويمكن استبدال دالة يعلّمها الصنف الأساسي بأنها virtual في الصنف الفرعي باستخدام override، كما ينفّذ base.Describe() نسخة الصنف الأساسي من داخل النسخة الجديدة. في C# العادي:
class Enemy
{
protected int hp = 3;
public virtual string Describe()
{
return "Enemy with " + hp + " hp";
}
}
class Ghost : Enemy
{
public override string Describe()
{
return base.Describe() + ", see-through";
}
}تعيد الدالة Describe() في Ghost القيمة Enemy with 3 hp, see-through. تعني protected أن Enemy وأصنافه الفرعية يمكنها استخدام hp، بينما لا تستطيع الأصناف الأخرى ذلك.
في Unity، تشترك الأعداء في معظم الشيفرة: نقاط الصحة والسرعة وطريقة الحركة. توجد هذه الشيفرة في صنف أساسي يرث من MonoBehaviour، ويرث منه كل نوع من الأعداء. يضبط هذا الصنف Enemy نقاط صحته في Start، ويتحرك في الاتجاه الذي يواجهه في Update، بينما يغيّر Ghost البداية ليتحرك بسرعة مضاعفة:
public class Enemy : MonoBehaviour
{
public int maxHp = 3;
public float speed = 2f;
protected int hp;
protected virtual void Start()
{
hp = maxHp;
}
protected virtual void Update()
{
transform.Translate(Vector3.forward * speed * Time.deltaTime);
}
}public class Ghost : Enemy
{
protected override void Start()
{
base.Start();
speed *= 2f;
}
}يرث Ghost الحقول، لذا يعرض Inspector القيمتين maxHp وspeed على Ghost، كما يرث Update، لذلك يتحرك من دون أن تكون له دالة Update خاصة به. إن hp هي protected: يمكن لـ Enemy وأصنافه الفرعية استخدامها، لكن لا تستطيع السكربتات الأخرى ذلك.
يعثر Unity على Start وUpdate بالاسم، مهما كان مستوى الوصول إليهما، ويستدعي الدالة الموجودة في الصنف الأكثر اشتقاقًا. لو كانت Start في Enemy دالة void Start() خاصة، وعرّف Ghost دالته الخاصة، لاستدعى Unity دالة Ghost وحدها: لن تُنفّذ دالة Enemy أبدًا، وستظل hp تساوي 0 من دون ظهور أي خطأ. إن تعريف رسائل الصنف الأساسي بصيغة protected virtual يجعل الأمر واضحًا في C#: يكتب الصنف الفرعي override، وينفّذ base.Start() جزء الصنف الأساسي عند النقطة التي تستدعيه فيها. إذا حذفت الاستدعاء، فسيُتخطى جزء الصنف الأساسي، وهذه هي طريقة استبدال خطوة بدلًا من الإضافة إليها.
التحدي
سهلاجعل Golem وWasp ينفّذان جزء Enemy قبل الجزء الخاص بهما.
- في
Enemy، اكتبprotected virtualقبلvoid Start()وvoid Update(). - في
Golem، اجعلهprotected override void Start()، واجعلbase.Start();أول سطر فيه. - في
Wasp، اجعلهprotected override void Update()، واجعلbase.Update();أول سطر فيه.
اضغط «العب»: يتحرك الغول ويمتلك نقاط صحته كاملة، ويتحرك الزنبور متعرجًا. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
// ما تشترك فيه جميع الوحوش.
public class Enemy : MonoBehaviour
{
public int maxHp = 4;
public float speed = 1.5f;
protected int hp;
protected Vector3 spawnPoint;
void Start()
{
hp = maxHp;
spawnPoint = transform.position;
}
void Update()
{
// تقدّم نحو القلعة على طول المحور z في الاتجاه السالب
transform.position += Vector3.back * speed * Time.deltaTime;
}
}
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity