Menu
CoddyTech

הגנת מגדלים — גרסה בסיסית

חלק מהיחידה ארכיטקטורת משחקים ב-Unity במסלול ה-Unity של Coddy. שיעור 61 מתוך 64.

היצורים צועדים לאורך הדרך לעבר הבסיס שלך, ומגדל יחיד מגן עליו. המגדל יורה קליעים לעבר היצור הקרוב אליו ביותר כל עוד הוא בטווח, וכל יצור שהוא מחסל מעניק זהב. מקש הרווח מוציא את הזהב על השדרוג הבא של המגדל: כל רמה מגיעה רחוק יותר, יורה מהר יותר או פוגעת חזק יותר. יצור שמגיע לבסיס מצליח לעבור. הרמות הן נתוני משחק שמעצבים מכוונים בנכס, בלי לגעת בקוד, והמגדל יורה הרבה קליעים, לכן הוא משתמש בהם שוב מתוך מאגר במקום ליצור ולהשמיד קליע עבור כל ירייה.

כתבו שני סקריפטים: TowerData, סוג הנכס, ו-Tower. Creep, Bolt ו-CreepSpawner כבר מוכנים, וכך גם Nearest ו-Show של המגדל.

challenge icon

אתגר

קשה

השלם את הצריח; Nearest(range) ו־Show() מוכנות.

  1. TowerLevel: ניתן לסריאליזציה, עם range, fireEvery, damage, cost ציבוריים. TowerData מכילה public List<TowerLevel> levels.
  2. כל fireEvery שניות, אם Nearest(range) מוצאת יצור, מקם קליע מתוך ObjectPool<Bolt> בצריח: bolt.Launch(creep, damage, pool.Release).
  3. הפעל את Show() אחרי ש־Creep.Killed מעניק את bounty, וגם אחרי שלחיצה על מקש הרווח קונה את השדרוג הבא בעלות cost שלו, ורשום ביומן Tower level 2.

לחץ על "שחק" ושדרג. לאחר מכן לחץ על "בדיקה".

נסו בעצמכם

using UnityEngine;
using UnityEngine.InputSystem;
using UnityEngine.Pool;
using TMPro;

public class Tower : MonoBehaviour
{
    [SerializeField] private TowerData data;
    [SerializeField] private Bolt boltPrefab;
    [SerializeField] private TMP_Text infoText;

    private int level;
    private int gold;

    // מוכן: הקריפ הקרוב ביותר למגדל שנמצא בטווח, או null.
    Creep Nearest(float range)
    {
        Creep nearest = null;
        float best = Mathf.Infinity;
        foreach (Collider hit in Physics.OverlapSphere(transform.position, range))
        {
            if (hit.TryGetComponent(out Creep creep))
            {
                float distance = Vector3.Distance(transform.position, creep.transform.position);
                if (distance < best)
                {
                    best = distance;
                    nearest = creep;
                }
            }
        }
        return nearest;
    }

    // מוכן: מציג את הרמה ואת כמות הזהב, למשל Level 1, 0 gold.
    void Show()
    {
        infoText.text = "Level " + (level + 1) + ", " + gold + " gold";
    }
}

כל השיעורים ביחידה ארכיטקטורת משחקים ב-Unity

תרגלו בעצמכם: Unity אונליין