إطلاق النار
الدرس 9 من 18 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يطلق البرج النار على هدفه fireRate مرة في الثانية. وبدلًا من استخدام مؤقّت تنازلي، يحتفظ البرج بوقت إطلاق طلقته التالية: عندما يصل Time.time إلى ذلك الوقت، يطلق البرج النار ويؤجّل الموعد بمقدار 1f / fireRate ثانية. مرشّ ينثر الماء مرتين في الثانية:
if (Time.time >= nextSpray)
{
Spray();
nextSpray = Time.time + 1f / spraysPerSecond;
}كل طلقة هي Projectile تطير نحو هدفها باستخدام MoveTowards، وتتبعه أثناء سيره، وتصيبه عند وصولها. لا تحتاج إلى معرفة أنها أصابت Enemy؛ بل تطلب من الهدف IDamageable، وهي الواجهة الخاصة بأي شيء يمكن أن يتلقى ضررًا، كما في فصل الواجهات، لذا يمكن إطلاق النار على أي شيء ينفّذها.
قد يموت الهدف بينما تكون الطلقة في الجو، إذا قضت عليه طلقة برج آخر. عندها يصبح target الخاص بالطلقة مساويًا لـ null، كما هو حال كل كائنات Unity المدمّرة، ولا يبقى للطلقة هدف تطير إليه، لذا تدمّر نفسها.
التحدي
متوسط- تُعرّف
IDamageablevoid TakeDamage(int amount). اجعلEnemyيطبّقها: تُطرح القيمة من صحته، وعندما تصبح 0 أو أقل يُدمَّر العدو. - في
Projectile، أضف عددًا عشريًا متسلسلًاspeed(تضبطه الـprefab على 12) وpublic void Launch(Transform target, int damage)، بحيث يحتفظ بكليهما. فيUpdate، تحرّك نحو الهدف بسرعةspeed؛ وعند الوصول، استدعِTakeDamage(damage)على الكائن الذي يطبّق IDamageable ثم دمّر المقذوف. عندما يختفي الهدف، دمّر المقذوف. - في
Tower، أضف عددًا صحيحًا عامًاdamage، وعددًا عشريًا عامًاfireRate(عدد الطلقات في الثانية)، وprojectilePrefabمتسلسلًا (من نوع Projectile). ما دام للبرج هدف، أطلق بمعدل لا يتجاوزfireRateمرة في الثانية: أنشئ المقذوف أمام الرأس بقليل، عندhead.position + head.forward * 0.6f، وأطلقه نحو الهدف باستخدام قيمة الضرر الخاصة بالبرج.
يضبط ArrowTower prefab قيمة damage على 2 وfireRate على 1.5، ومقذوفه هو ArrowShot. اضغط Play، وابنِ الأبراج وأوقف الموجة الأولى، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
// يأتي لاحقًا: مقذوف ينطلق من برج إلى هدفه.
public class Projectile : MonoBehaviour
{
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.