בלי פניית פרסה
שיעור 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, והצעד מתחיל בכך שהופכים את הפנייה הממתינה לאמיתית. במקרה שלמעלה, משווים את שמאלה לימינה, הכיוון שבו הראש באמת נע, ומתעלמים מהפנייה.
אתגר
קל- הוסף
private Vector3 nextDirection = Vector3.right;, את הפנייה שממתינה לצעד הבא. - כתוב
void Turn(Vector3 newDirection): היא מגדירה אתnextDirectionל-newDirection, אלא אםnewDirectionהוא הכיוון ההפוך ל-direction. - ב-
Update(), כל מקש קורא ל-Turnעם הכיוון שלו, במקום להגדיר אתdirection. - בתחילת
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;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.