גדל
שיעור 8 מתוך 14 בקורס משחק Unity: נחש בתלת־ממד של Coddy.
האכילה מאריכה את הנחש במקטע אחד. המקטע החדש מגיע למקום שבו היה קצה הזנב לפני הצעד: הזנב מתקדם קדימה, והמקטע החדש ממלא את התא שהקצה עזב, כך שהנחש גדל מאחור.
התא הזה נעלם ברגע שהזנב זז, לכן כדאי לזכור אותו קודם. ואז, כשהראש מגיע לאוכל, ליצור שם מקטע ולהוסיף אותו לרשימה, כך שהוא יעקוב אחריו החל מהצעד הבא. מקטע שנוצר אך לא נוסף לעולם לא זז. רכבת מוסיפה קרון מאחור באותו אופן:
Vector3 back = wagons[wagons.Count - 1].position;
// ... הרכבת ממשיכה לנסוע ...
Transform wagon = Instantiate(wagonPrefab, back, Quaternion.identity);
wagons.Add(wagon);הגדל את הנחש לפני הקריאה ל-Eat(). Eat() מזיזה את האוכל, ובשיעור הבא נגרום לה לחפש תא שהנחש לא מכסה, כולל המקטע החדש.
אתגר
בינוניהסצנה מגדירה את segmentPrefab של Snake כקובייה כמו הזנב.
- הוסיפו
public Transform segmentPrefab;. - ב־
Step(), לפני שהזנב זז, שמרו ב־Vector3 tailEndאת התא של המקטע האחרון בזנב (התא של הראש כשהזנב ריק). - כשהראש נמצא על אוכל, צרו מופע של
segmentPrefabב־tailEndוהוסיפו אותו ל־tail, ואז קראו ל־Eat().
לחצו על Play ואכלו כמה, ואז לחצו על Check.
נסו בעצמכם
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // שניות בין שני צעדים
public int edge = 7; // תאי הלוח משתרעים מ־-edge עד edge
public bool alive = true;
public List<Transform> tail = new List<Transform>();
private float timer;
private Vector3 direction = Vector3.right; // הכיוון שבו הראש נע בצעד האחרון שלו
private Vector3 nextDirection = Vector3.right; // הפנייה שממתינה לצעד הבא
void Update()
{
if (!alive) return;
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) Turn(Vector3.forward);
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) Turn(Vector3.back);
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) Turn(Vector3.left);
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) Turn(Vector3.right);
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Turn(Vector3 newDirection)
{
if (newDirection != -direction)
{
nextDirection = newDirection;
}
}
void Step()
{
direction = nextDirection;
Vector3 next = transform.position + direction;
if (Mathf.Abs(next.x) > edge || Mathf.Abs(next.z) > edge)
{
Die();
return;
}
for (int i = tail.Count - 1; i > 0; i--)
{
tail[i].position = tail[i - 1].position;
}
if (tail.Count > 0)
{
tail[0].position = transform.position;
}
transform.position = next;
if (GameManager.Instance.IsFood(next))
{
GameManager.Instance.Eat();
}
}
void Die()
{
alive = false;
}
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.