Menu
CoddyTech

שלושה נתיבים

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

בפרק הזה נבנה משחק ריצה אינסופית. הרץ דוהר בכביש בעל שלושה נתיבים ומחליף נתיבים כדי להתחמק מהמכשולים שמגיעים לעברו. בשיעורים הבאים הכביש יאיץ, המרחק יוצג על המסך, התרסקות תסיים את הריצה ותופיע כפתור לריצה נוספת, והריצה הטובה ביותר תישמר. הרץ לעולם אינו מתקדם: הוא נשאר ב-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

אתגר

בינוני

גרמו לחץ להזיז את הרץ בין שלושה נתיבים.

  1. ב־Update() של Runner, הפחיתו את lane-- כאשר מתקיים Input.GetKeyDown(KeyCode.LeftArrow), והגדילו את lane++ כאשר נלחץ החץ הימני.
  2. השאירו אותו על הכביש: lane = Mathf.Clamp(lane, -1, 1);.
  3. העתיקו את transform.position אל p, הזיזו את p.x לכיוון lane * laneWidth באמצעות Mathf.MoveTowards בקצב laneSpeed * Time.deltaTime, והשיבו את p למקומו.

לחצו על "שחק", לחצו על המשחק ועברו בין הנתיבים: הרץ יחליק מצד לצד. לאחר מכן לחצו על "בדיקה".

נסו בעצמכם

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 של הנתיב
    }
}

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

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