السلام عليكم ورحمة الله وبركاتة.
خصصت هذا الدرس لاهميته في برمجة الالعاب و خاصة على محرك الالعاب Unity3D و الذي اناقش فية اليوم اسلوب الوراثة في هذا المحرك و مافائدة الوراثة, اولاً ان الوراثة في اليونتي غير شائعة و نادراً مايتم استخدامها في اليونتي و في اغلب الاحيان تستخدم لتنظيم الكود ليس فقط من باب الترتيب بل ايضاً من باب الحد من وضع الاكواد المتكررة في نفس الملف, و من جانب آخر تضع جميع الوظائف و الصفات و من ثم وراثتها و طبعها و ربما من خلال هذا الدرس تأخذ فكرة اكبر عن الوراثة في اليونتي و اليوم ساناقشها معكم بكل تفصيل بأذن الله.
لنتفرض ان لذينا اعداء في المشهد و ان لكل عدو وظيفة خاصة و ايضاً عدة وظائف يتاشركها الاعداء فيما بينهم و عمل ملف برمجي واحد ووضعة في جميع الاعداء ربما قد يساهم في وضع مشكلة قد لاتراها و هي تكرار عمل الاكواد, الان فكر في ان هناك ملف برمجي و هذا الملف يحتوي على جميع الوظائف للاعداء و من خلال هذا الملف هناك ملفات اخرى ترث منه الوظائف, الان هنا سيتم تشغيل الاكواد في ملف الوراثة و سيتم طبعها و اعادة تشغيلها في الملفات الوارثة و بهذا الشكل نكون قد شغلنا الكود اكثر من مرة و في عدة ملفات دون الحاجة لتكرارة في عدة ملفات, حسناً دعنا نناقش هذه الفكرة في محرر النصوص Mono Development وهو المحرر الافتراضي في محرك Unity, اذن دعنا ننشيء ملف برمجي باسم EnemiesInfo و هذا الملف سيكون ملف الوراثة و الذي سيحتوي على جميع الوظائف للاعداء, الان قم بأنشاء ملف آخر باسم EnemyOne او شيء من هذا القبيل و لندع هذا الملف يرث من الملف الاولي و لكن ليس بهذه السرعة اولاً دعنا نجعل الملف EnemiesInfo ملف قابل للوراثة فقط باضافة abstract الى لاكلاس, لاحظ معي:
using UnityEngine;
using System.Collections;
public abstract class EnemiesInfo : MonoBehaviour {
}
لاحظ قمت باضافة abstract و بهذا الشكل نكون قد عرفنا ان هذا الملف قابل للوراثة فقط, الان بالعودة الى الملف EnemyOne و سنجعلة يرث من هذا الملف و سيكون بهذا الشكل:
using UnityEngine;
using System.Collections;
public class EnemyOne : EnemiesInfo {
}
جميل, الان اصبح الملف EnemyOne يرث الوظائف من الملف EnemiesInfo.
بالنسبة لعمل شيء معين في الملف فانة ليس لذينا مانكتبة لهذا نقم بوضع صحة للعدو و نجعلة يرث هذه الصحة و لكي نناقش بعض الامور الخاصة بالمتغيرات و بعض معرفات الوصول فيها, اذن قم بكتابة هذا الكود لكي نناقشة:
using UnityEngine;
using System.Collections;
public abstract class EnemiesInfo : MonoBehaviour {
protected static int health;
[SerializeField] protected int maxHealth;
public virtual void ApplyHealth()
{
if(health <= 0)
{
health = 0;
Destroy(gameObject);
}
}
}
الان لاحظ معي ان المتغير health من نوع int و ايضاً هو static لكي يتيح للملفات التعامل معة عبر فئتة مباشرةً, بالنسبة لهذا المتغير و المتغير maxHealth ستجد ان معرف الوصول اليهم هو protected وهو يتيح للفئة الحالية و الفئة الوارثة التعامل مع هذا المتغير و لكن حالة كحال معرف الوصول private و لكن الفرق بينهم ان معروف الوصول الخاص بملفات الورثة سيتيح لك التعامل مع المتغير في الملف الحالي و الملف الوارث, اما معرف الوصول private سيتيح للملف الحالي فقط الوصول الى هذا المتغير و لن تستطيع تغيير قيمتة خارج هذا الملف, ايضاً بالنسبة لمعرف الوصول public فأنة يتيح للفئة الحالية و الوارثة الوصول الى هذا المتغير مع قابلية الظهور في الانسباكتور, و لكن غالباً لايتم استخدامة بهذا الشكل اي وضعة في المتغير بشكل مباشر و لكن هناك طريقة تتيح لمعرف الوصول protected الظهور في الانسابكتور و هي عمل تسلسل ميداني او برمجي لهذا المتغير بحيث يتيح له الظهور في فئتة الحالية و الفئات الوارثة و تتم طريقة التسلسل الميداني عبر استخدام [SerializeField] و بهذا الشكل يكون شكل المتغير maxHealth هو هذا:
[SerializeField] protected int maxHealth;
حسناً بالنسبة للدالة ApplyHealth و التي تخزن قيمة الصحة و انتهائها ووضع شرط يقوم بتدمير الكائن, و تلاحظ ان الدالة virtual بحيث انها ستتيح للفئة الوارثة نسخها و استخدام محتواها بشكل مباشر و لكن يجب على الملف الوارث عمل override للدالة الحالية و يقوم بطبع محتواها باستخدام اداة الطبع base و بهذا الشكل يكون الملف الوارث قادر على استنساخ الدالة من ملف الوراثة, اذن شكل الملف EnemyOne سيكون :
using UnityEngine;
using System.Collections;
public class EnemyOne : EnemiesInfo {
void Update()
{
ApplyHealth();
}
public override void ApplyHealth()
{
base.ApplyHealth();
}
}
اذن بهذا الشكل يكون الملف EnemyOne قد طبع الدالة ApplyHealth و استطاع الوصول اليها, الان بالعودة الى المشروع ستجد ان المتغير maxHealth قد ظهر في الانسباكتور و شيء آخر و لكي تتأكد من عمل الدالة ApplyHealth بشكل صحيح قم بعمل طبع للمتغير health و ستجد انك تستطيع الوصول اليه و ايضاً طبعة بكل بساطة.
و الى هنا تمنى ان يكون الدرس قد افادكم و اي استفسار او سؤال او حتى مناقشة بخصوص هذا الدرس او غيرة فأنا موجود, و في النهاية لاتنسوا مشاركة المنشور لكي تعم الفائدة الجميع :) .