بناء القواعد
الدرس 5 من 18 في دورة لعبة Unity: الدفاع عن الأبراج على Coddy.
يبني اللاعب الأبراج بالنقر على منصات البناء، وهي المربعات الرمادية بجانب المسار. يحدث النقر على الشاشة، بالبكسلات، بينما توجد المنصات في العالم ثلاثي الأبعاد، لذا يتحول النقر إلى شعاع. تعيد Camera.main.ScreenPointToRay(point) الشعاع الذي يبدأ من الكاميرا ويمر عبر نقطة الشاشة تلك إلى المشهد، وتتتبعه Physics.Raycast وتُبلغ عن أول مُصادم يصطدم به: أي ذلك الذي يراه اللاعب أسفل مؤشر الفأرة. أداة طلاء تلوّن الكتلة التي تنقر عليها:
void Update()
{
if (!Mouse.current.leftButton.wasPressedThisFrame)
{
return;
}
Ray ray = Camera.main.ScreenPointToRay(Mouse.current.position.ReadValue());
if (Physics.Raycast(ray, out RaycastHit hit) && hit.collider.TryGetComponent(out Paintable block))
{
block.Paint(brushColor);
}
}لا يُنفَّذ النصف الثاني من && إلا عندما يصطدم الشعاع بشيء ما، لذا تكون قيمة hit قد عُيّنت. بعد ذلك، يتحقق TryGetComponent مما إذا كان الشيء الذي اصطدم به الشعاع هو الشيء الذي تهتم به: فالشعاع يصطدم أيضًا بالأرض والمسار والأشجار، التي لا تحتوي على Paintable، لذا لا تفعل تلك النقرات شيئًا.
يستخدم كل مشهد هنا نظام الإدخال في Unity 6 فقط، لذا تقرأ Mouse.current الفأرة. يكون موضعها بالبكسلات على الشاشة، وهذا ما تتوقعه ScreenPointToRay.
التحدي
متوسطتحتوي منصّات البناء على سكربت BuildPad، ويحتوي كائن اللعبة على BuildManager الذي يكون فيه towerPrefab هو العنصر الجاهز ArrowTower.
- في
BuildPad.cs، أضف حقلًا عامًاtowerمن النوع Tower: البرج المبني على هذه المنصّة، أو null. - في
BuildManager، أضف حقلًا خاصًا مُسلسلًاtowerPrefab(من النوع Tower). فيUpdate، عندما يُضغط زر الفأرة الأيسر في هذا الإطار، أطلق شعاعًا من الكاميرا عبر موضع الفأرة. - عندما يصيب الشعاع مُصادمًا يحتوي على BuildPad، ولا يكون على تلك المنصّة برج بعد، أنشئ نسخة من
towerPrefabعند موضع المنصّة وخزّن البرج الجديد فيtowerالخاص بالمنصّة. إذا كانت المنصّة تحتوي على برج، أو كان الشيء المصاب ليس منصّة، فلن يحدث شيء.
اضغط Play وانقر على بعض المنصّات، ثم اضغط Check.
جرّب بنفسك
using UnityEngine;
// يأتي لاحقًا: النقر على منصات البناء لوضع الأبراج، والمتجر ولوحة الأبراج.
public class BuildManager : MonoBehaviour
{
}
يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.