בניית משטחי הצבה
שיעור 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, ולכן הלחיצות האלה לא עושות דבר.
כל סצנה כאן משתמשת רק ב־Input System של Unity 6, ולכן Mouse.current קורא את העכבר. המיקום שלו מצוין בפיקסלים על המסך, כפי ש־ScreenPointToRay מצפה.
אתגר
בינונילמשבצות יש סקריפט BuildPad, ולאובייקט Game יש BuildManager שהשדה towerPrefab שלו מוגדר ל-prefab של ArrowTower.
- ב-
BuildPad.cs, הוסף שדה ציבוריtowerמסוג Tower: המגדל שנבנה על המשבצת הזו, או null. - ב-
BuildManager, הוסף שדה פרטי מסודרtowerPrefab(מטיפוס Tower). ב-Update, כאשר לוחצים על לחצן העכבר השמאלי בפריים הזה, שלח קרן מהמצלמה דרך העכבר. - כאשר הקרן פוגעת בקוליידר שיש לו BuildPad, ולמשבצת הזו עדיין אין מגדל, צור מופע של
towerPrefabבמיקום המשבצת ושמור את המגדל החדש ב-towerשל המשבצת. משבצת שיש עליה מגדל, או כל דבר שאינו משבצת, לא עושה דבר.
לחץ על Play ולחץ על כמה משבצות, ואז על Check.
נסו בעצמכם
using UnityEngine;
// בהמשך: לחיצה על משטחי בנייה כדי להציב מגדלים, החנות ולוח המגדלים.
public class BuildManager : MonoBehaviour
{
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.