Menu
CoddyTech

בלי פניית פרסה

שיעור 3 מתוך 14 בקורס משחק Unity: נחש בתלת־ממד של Coddy.

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

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

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

הפתרון משתמש בשני כיוונים. direction הוא הכיוון שבו הראש נע בצעד האחרון; nextDirection הוא הפנייה שממתינה לצעד הבא. לחיצה על מקש משנה את nextDirection, אך רק לאחר שמשווים את הפנייה ל-direction, והצעד מתחיל בכך שהופכים את הפנייה הממתינה לאמיתית. במקרה שלמעלה, משווים את שמאלה לימינה, הכיוון שבו הראש באמת נע, ומתעלמים מהפנייה.

challenge icon

אתגר

קל
  1. הוסף private Vector3 nextDirection = Vector3.right;, את הפנייה שממתינה לצעד הבא.
  2. כתוב void Turn(Vector3 newDirection): היא מגדירה את nextDirection ל-newDirection, אלא אם newDirection הוא הכיוון ההפוך ל-direction.
  3. ב-Update(), כל מקש קורא ל-Turn עם הכיוון שלו, במקום להגדיר את direction.
  4. בתחילת Step(), הגדר את direction ל-nextDirection.

לחץ על Play ונסה לפנות לאחור, ואז לחץ על Check.

נסו בעצמכם

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // שניות בין שני צעדים
    private float timer;
    private Vector3 direction = Vector3.right;

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Step()
    {
        transform.position += direction;
    }
}
quiz iconבחנו את עצמכם

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

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