IDamageable
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 7 من 64.
الواجهة هي قائمة بالأساليب التي تتعهد فئة بتوفيرها، من دون كتابة أي شيفرة داخلها. ويمكن للفئات التي لا يجمعها أي شيء آخر أن تقدم التعهد نفسه. بلغة C# العادية:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}يمكن لمتغير من النوع IGreeter أن يحتوي على Robot أو Cat، ويشغّل greeter.Greet() الأسلوب الخاص بالكائن الذي يحتوي عليه. ولن تُترجم فئة تسرد IGreeter من دون أن تتضمن أسلوبًا عامًا Greet().
في اللعبة، يمكن أن تتعرض أشياء كثيرة للأذى، ولا يجمعها سوى القليل: لدى اللاعب نقاط صحة، ويتحطم الصندوق عند أول ضربة. ستجبرها فئة أساسية مشتركة على الانتماء إلى العائلة نفسها. أما الواجهة فتسمّي الأمر الوحيد المشترك بينها، وتنفذه كل وحدة برمجية بطريقتها الخاصة:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}تظل للوحدة البرمجية فئة أساسية واحدة، وهي MonoBehaviour، وتسرد الواجهات بعدها. توضع الواجهة في ملف مستقل باسم IDamageable.cs، ولا ترث من MonoBehaviour: فهي ليست مكوّنًا ولا تُضاف بمفردها إلى أي كائن. ويجب أن تتضمن الفئة التي تسردها أسلوبًا عامًا TakeDamage(int)، وإلا فلن تُترجم.
الجهة التي تُلحق الضرر تطلب الواجهة، لا فئة بعينها:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}تؤذي الكرة النارية اللاعب وتحطّم الصناديق باستخدام الأسطر نفسها، ولا يحتاج نوع جديد من الأهداف يُضاف لاحقًا إلى أي تعديل هنا. لا تعرض Unity حقلًا من نوع واجهة في نافذة Inspector، لذا تحتفظ الوحدات البرمجية بكائن GameObject أو بمكوّن، ثم تطلب منه الواجهة، كما تفعل الكرة النارية.
التحدي
سهلاجعل رجل الثلج والجرس والفزّاعة يطبّقون IDamageable، لكي تصيبهم المطرقة.
Snowman: تقلّصهTakeDamageبمقدار0.25f * amountعلى كل محور؛ وعند 0.5 أو أقل، دمّره.Bell: سجّلDongمرةً لكل نقطة، وأضفamountإلىrings.Scarecrow: تنفّذ الضربة الأولى فقطtransform.Rotate(0f, 0f, 90f);.- في
Slam، استدعِTakeDamage(power)علىIDamageableلكل مُصادم، إن وُجد.
اضغط «العب» واضرب كل واحد منها. ثم اضغط «تحقق».
جرّب بنفسك
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
جميع دروس هندسة الألعاب في Unity
1المكوّنات، لا التسلسلات الهرمية
مكوّنات صغيرةنص برمجي أساسي للعدومكوّنات مجرّدةالمكوّنات تعمل معًامراجعة: برج معياريمراجعة: مدفع مزدوج4البيانات المُسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائممراجعة: اختيار الغنائم عشوائيًا2الواجهات في Unity
IDamageableالواجهات وTryGetComponentGetComponentsمراجعة: مفتاح التفاعلمراجعة: أقرب عنصر ضمن النطاقتدرّب بنفسك: Playground لـ Unity