IDamageable
جزء من قسم هندسة الألعاب في Unity في رحلة Unity على Coddy. الدرس 6 من 50.
يمكن أن تتعرض أشياء كثيرة في اللعبة للضرر، ولا يجمع بينها سوى القليل: لدى اللاعب نقاط صحة، والصندوق يتحطم من الضربة الأولى. ستجبرها فئة أساسية مشتركة على الانتماء إلى عائلة واحدة. أما الواجهة فتسمّي الشيء الوحيد المشترك بينها، وينفّذها كل سكربت بطريقته الخاصة:
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 أو مكوّن وتطلب منه الواجهة، كما تفعل الكرة النارية.
التحدي
سهليحرس عملاق ساحة القرية. تتحرك الأسهم بالعملاق (Mover.cs، جاهز)، ويُلوّح مفتاح Space بمطرقته: يستدعي Hammer.cs الدالة Slam()، التي تعثر على كل مصادم ضمن radius. تتلقى ثلاثة أشياء في الساحة ضربة، كلٌّ بطريقته الخاصة، ولا تشترك في أي شيء آخر:
Snowman: تُنقص كل نقطة ضرر 0.25 من حجمه على كل محور (يبدأ حجمه عند 1.5). عندما يصبح حجمه 0.5 أو أقل، يذوب: دمّر رجل الثلج.Bell: يسجّلDongمرة لكل نقطة ضرر (ضربة بقوة 2 تسجّله مرتين) ويضيف النقاط إلىrings.Scarecrow: تُسقطه الضربة الأولى، فتديره 90 درجة حول المحور z، مهما كان مقدار الضرر. لا تغيّر الضربات اللاحقة شيئًا.
يعرّف IDamageable.cs الواجهة، وبها دالة واحدة: void TakeDamage(int amount). اجعل Snowman وBell وScarecrow يطبّقونها، ولكلٍّ منهم ردّ فعله الخاص. ثم، داخل Slam، استدعِ TakeDamage(power) على IDamageable لكل مصادم تعثر عليه. يتم تخطي المصادمات التي لا تملك واحدًا، مثل الأرض.
اضغط على تشغيل، وامشِ نحو كل واحد منها ولوّح بالمطرقة، ثم اضغط على تحقّق.
جرّب بنفسك
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس هندسة الألعاب في Unity
1المكوّنات لا التسلسلات الهرمية
مكوّنات صغيرةسكربت أساسي للعدومكوّنات مجرّدةتعمل المكوّنات معًامراجعة: برج دفاعي معياري4البيانات المتسلسلة
الأصناف القابلة للتسلسلالقوائم في Inspectorالتعدادات في Inspectorمراجعة: جدول الغنائم10مشروع: الناجي في الساحة
البطلأنواع الأعداء