Menu
CoddyTech

שלושה נתיבים

חלק מהיחידה בונים משחקים אמיתיים במסלול ה-Unity של Coddy. שיעור 27 מתוך 56.

בפרק הזה נבנה משחק ריצה אינסופית. הרץ דוהר לאורך כביש בעל שלושה נתיבים ועובר בין הנתיבים כדי להתחמק ממכשולים שמתקדמים לעברו. בשיעורים הבאים הכביש יאיץ, המרחק יוצג על המסך, התנגשות תסיים את הריצה ויופיע כפתור להפעלה מחדש, והריצה הטובה ביותר תישמר. הרץ לעולם אינו מתקדם קדימה: הוא נשאר ב־z = 0 והמכשולים נעים לעברו, כך שהכביש לעולם אינו נגמר. במשחק יש ארבעה סקריפטים, Runner, Spawner, Obstacle ו־GameManager, ושלושת האחרונים ריקים לעת עתה.

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

[SerializeField] private float floorHeight = 3f;
[SerializeField] private float moveSpeed = 6f;
private int floor = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.UpArrow)) floor++;
    if (Input.GetKeyDown(KeyCode.DownArrow)) floor--;
    floor = Mathf.Clamp(floor, 0, 4);

    Vector3 p = transform.position;
    p.y = Mathf.MoveTowards(p.y, floor * floorHeight, moveSpeed * Time.deltaTime);
    transform.position = p;
}

GetKeyDown גורם לכך שלחיצה אחת תעלה קומה אחת, בעוד ש־GetKey היה מוסיף קומה בכל פריים שבו המקש מוחזק. Mathf.Clamp משאיר את המספר בטווח הקומות בבניין, כך שלחיצה למעלה בקומה העליונה לא עושה כלום, והלחיצה הבאה למטה עוברת ישירות לקומה 3. Mathf.MoveTowards מחליק את הפלטפורמה לעבר הקומה שלה במהירות של moveSpeed יחידות בשנייה ועוצר בדיוק עליה, במקום לקפוץ אליה בפריים אחד. המיקום הוא עותק שמשנים ואז משייכים בחזרה, כי אי אפשר להגדיר את transform.position.y בפני עצמו.

challenge icon

אתגר

בינוני

התחל את משחק הריצה האינסופי עם הרץ. החלון Inspector נותן ל־Runner ערך laneWidth של 2.5 וערך laneSpeed של 15, ו־lane הוא ‎-1 עבור הנתיב השמאלי, 0 עבור האמצעי ו־1 עבור הימני. בתוך Update() של Runner:

  • כל לחיצה על החץ שמאלה או ימינה משנה את lane באחד בכיוון המתאים. גם החזקת המקש משנה אותו באחד.
  • lane לעולם לא יורד מתחת ל־‎-1 או עולה מעל 1.
  • הרץ מחליק לאורך ציר x אל lane * laneWidth במהירות של laneSpeed יחידות לשנייה, ושומר על ערכי y ו־z שלו.

השאר את שלושת הסקריפטים האחרים כפי שהם לעת עתה. לחץ על Play, לחץ על המשחק ועבור בין הנתיבים, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 15f;
    private int lane = 0;   // -1 הוא הנתיב השמאלי, 0 האמצעי, 1 הימני

    void Update()
    {
        // החלף נתיבים בעזרת החצים, ואז החלק לעבר ערך ה-x של הנתיב
    }
}
quiz iconבחנו את עצמכם

השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.

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